program root z bitem setuid

13

Ping to program należący do roota z ustawionym bitem identyfikatora użytkownika.

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

Rozumiem, że jeśli użytkownik uruchomi proces pingowania, efektywny identyfikator użytkownika zmieni się z rzeczywistego identyfikatora użytkownika (tj. Identyfikatora użytkownika, który uruchomił proces) na identyfikator użytkownika root. Jednak gdy spróbuję tego i spojrzę na dane wyjściowe ps, aby sprawdzić, czy proces ping działa jako użytkownik root, nadal widzę prawdziwy identyfikator użytkownika.

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
źródło
Powiązane pytanie to unix.stackexchange.com/questions/152595 .
JdeBP

Odpowiedzi:

20

pingpotrzebuje roota, aby mógł otworzyć gniazdo w trybie surowym. To dosłownie pierwsza rzecz, jaką robi, kiedy się uruchamia:

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

Jest to jedyna rzecz, do której potrzebuje rootowania, więc jak wiele programów, natychmiast spada poziom uprawnień z powrotem na normalne konto użytkownika:

uid = getuid();
if (setuid(uid)) {
    perror("ping: setuid");
    exit(-1);
}
Michał Mrożek
źródło