Root-Programm mit gesetztem setuid-Bit

13

Ping ist ein Programm von root, dessen Benutzer-ID-Bit gesetzt ist.

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

Soweit ich weiß, ändert sich die effektive Benutzer-ID von der tatsächlichen Benutzer-ID (dh der Benutzer-ID der Person, die den Prozess gestartet hat) in die Benutzer-ID root, wenn ein Benutzer den Ping-Prozess ausführt. Wenn ich dies jedoch versuche und mir die Ausgabe von ps ansehe, um festzustellen, ob der Ping-Prozess als Root-Benutzer ausgeführt wird, wird immer noch die tatsächliche Benutzer-ID angezeigt.

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
quelle
Eine verwandte Frage ist unix.stackexchange.com/questions/152595 .
JdeBP

Antworten:

20

pingbenötigt root, damit es einen Socket im Raw-Modus öffnen kann. Das ist buchstäblich das Erste, was es macht, wenn es startet:

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

Das ist das einzige, wofür es root braucht. Wie bei vielen Programmen wird die Berechtigungsstufe sofort auf Ihr normales Benutzerkonto zurückgesetzt:

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