programa de propriedade da raiz com setuid bit on

11

Ping é um programa de propriedade do root com o conjunto de bits do id do usuário.

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

Pelo que entendi, se um usuário executar o processo de ping, o ID de usuário efetivo mudará do ID do usuário real (ou seja, o ID do usuário da pessoa que iniciou o processo) para a ID do usuário root. No entanto, quando eu tento isso e vejo a saída do ps para ver se o processo de ping está sendo executado como o usuário root, ainda recebo a identificação do usuário real.

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
    
por sashang 15.10.2012 / 04:45

1 resposta

18

ping precisa da raiz para poder abrir um soquete no modo raw. Isso é literalmente a primeira coisa que faz quando é iniciado:

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

Essa é a única coisa pela qual ele precisa de root, assim como muitos programas, ele imediatamente coloca seu nível de privilégio de volta na sua conta de usuário normal:

uid = getuid();
if (setuid(uid)) {
    perror("ping: setuid");
    exit(-1);
}
    
por 15.10.2012 / 05:05