программа, принадлежащая пользователю root, с включенным битом setuid

13

Ping - это программа, которой владеет root с установленным битом идентификатора пользователя.

$ ls -l `which ping`
-rwsr-xr-x 1 root root 35752 Nov  4  2011 /bin/ping

Насколько я понимаю, если пользователь запускает процесс проверки связи, тогда эффективный идентификатор пользователя изменится с реального идентификатора пользователя (то есть идентификатора пользователя, запустившего процесс) на корневой идентификатор пользователя. Однако, когда я пытаюсь это сделать и посмотреть на вывод команды ps, чтобы увидеть, выполняется ли процесс ping от имени пользователя root, я все равно получаю реальный идентификатор пользователя.

ps -e -o user,ruser,euser,cmd,args | grep ping
sashan   sashan   sashan   ping -i 10 -c 1000 www.goog ping -i 10 -c 1000 www.google.com
sashang
источник
Связанный вопрос unix.stackexchange.com/questions/152595 .
JdeBP

Ответы:

20

pingнужен root, чтобы он мог открыть сокет в режиме raw. Это буквально первое, что он делает, когда запускается:

icmp_sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
socket_errno = errno;

Это единственное, для чего ему нужен root, поэтому, как и многие программы, он сразу же понижает уровень своих привилегий до вашей обычной учетной записи пользователя:

uid = getuid();
if (setuid(uid)) {
    perror("ping: setuid");
    exit(-1);
}
Михаил Мрозек
источник