programa propiedad de root con bit setuid en

13

Ping es un programa propiedad de root con el bit de identificación de usuario establecido.

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

Según tengo entendido, si un usuario ejecuta el proceso de ping, la identificación de usuario efectiva cambiará de la identificación de usuario real (es decir, la identificación de usuario de la persona que inició el proceso) a la raíz de identificación de usuario. Sin embargo, cuando intento esto y miro la salida de ps para ver si el proceso de ping se está ejecutando como usuario root, sigo mostrando la identificación de usuario 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
Sashang
fuente
Una pregunta relacionada es unix.stackexchange.com/questions/152595 .
JdeBP

Respuestas:

20

pingnecesita root para poder abrir un socket en modo raw. Eso es literalmente lo primero que hace cuando se inicia:

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

Eso es lo único para lo que necesita root, por lo que, como muchos programas, inmediatamente baja su nivel de privilegio a su cuenta de usuario normal:

uid = getuid();
if (setuid(uid)) {
    perror("ping: setuid");
    exit(-1);
}
Michael Mrozek
fuente