Wie funktionieren die Interna von sudo?

74

Wie sudoarbeitet man intern? Wie ist es möglich, dass es anders als ohne das root-Passwort root werden kann su? Welche Systemanrufe usw. sind in den Prozess involviert? Handelt es sich nicht um eine Sicherheitslücke in Linux (z. B. warum konnte ich keine stark gepatchten Dateien kompilieren sudo, die einfach das tun, was auch immer normal sudowar, aber nicht nach dem Passwort des nicht privilegierten Benutzers fragten)?

Ich habe Login und su internals gelesen . Ich habe auch gelesen, wie Sudo verwendet werden soll. Trotz des Titels beschäftigen sie sich hauptsächlich mit den Unterschieden zwischen suund sudo.

strugee
quelle

Antworten:

80

Wenn Sie sich die ausführbare Datei ansehen sudo:

$ which sudo
/usr/bin/sudo
$ ls -la /usr/bin/sudo
---s--x--x 2 root root 208808 Jun  3  2011 /usr/bin/sudo

Sie werden feststellen, dass es die Berechtigungsbits enthält ---s--x--x. Diese lassen sich wie folgt aufteilen:

-|--s|--x|--x
-      - first dash denotes if a directory or a file ("d" = dir, "-" = file)  
--s    - only the setuid bit is enabled for user who owns file
--x    - only the group execute bit is enabled
--x    - only the other execute bit is enabled

Wenn für ein Programm das Setuid-Bit aktiviert ist (auch als SUID bezeichnet), bedeutet dies, dass es beim Ausführen dieses Programms mit den Anmeldeinformationen des Benutzers ausgeführt wird, dem die Datei gehört, auch bekannt als. root in diesem Fall.

Beispiel

Wenn ich den folgenden Befehl als Benutzer saml ausführen:

$ whoami
saml

$ sudo su -
[sudo] password for saml: 

Sie werden feststellen, dass die Ausführung von sudotatsächlich als root ausgeführt wird:

$ ps -eaf|grep sudo
root     20399  2353  0 05:07 pts/13   00:00:00 sudo su -

Setuid-Mechanismus

Wenn Sie neugierig sind, wie SUID funktioniert, schauen Sie sich das an man setuid. Hier ist ein Auszug aus der Manpage, der es besser erklärt, als ich konnte:

setuid () legt die effektive Benutzer-ID des aufrufenden Prozesses fest. Wenn die effektive UID des Anrufers root ist, werden auch die reale UID und die gespeicherte Set-User-ID festgelegt. Unter Linux wird setuid () wie die POSIX-Version mit der Funktion _POSIX_SAVED_IDS implementiert. Auf diese Weise kann ein Set-User-ID-Programm (außer root) alle seine Benutzerrechte löschen, einige nicht privilegierte Arbeiten ausführen und dann die ursprüngliche effektive Benutzer-ID auf sichere Weise wiederherstellen.

Wenn der Benutzer root ist oder das Programm set-user-ID-root ist, muss besondere Sorgfalt angewendet werden. Die Funktion setuid () überprüft die effektive Benutzer-ID des Anrufers. Wenn es sich um den Superuser handelt, werden alle prozessbezogenen Benutzer-IDs auf uid gesetzt. Nachdem dies geschehen ist, kann das Programm keine Root-Rechte mehr erlangen.

Das Schlüsselkonzept hier ist, dass Programme eine echte Benutzer-ID (UID) und eine effektive (EUID) haben. Setuid setzt die effektive Benutzer-ID (EUID), wenn dieses Bit aktiviert ist.

Aus Sicht des Kernels ist es also bekannt, dass in unserem Beispiel samlimmer noch der ursprüngliche Eigentümer (UID) ist, die EUID jedoch mit dem Eigentümer der ausführbaren Datei festgelegt wurde.

setgid

Ich sollte auch erwähnen, dass die zweite Gruppe von Bits für Gruppenberechtigungen war, wenn wir die Berechtigungen für den Befehl sudo aufschlüsseln. Das Gruppenbit hat auch etwas Ähnliches wie setuid, das set group id (auch bekannt als setgid, SGID) genannt wird. Dies entspricht der SUID, mit der Ausnahme, dass der Prozess mit den Gruppenanmeldeinformationen anstelle der Eigentümeranmeldeinformationen ausgeführt wird.

Verweise

slm
quelle
4
Sie sollten sudo -sstatt verwenden, sudo suweil es eine nutzlose Verwendung von ist su. :)
Totor
4

Die echte sudoBinärdatei heißt setuid root , und Sie können nicht einfach Dateien erstellen, die auf diese Weise festgelegt wurden.

setuid und setgid (Abkürzung für "Benutzer-ID bei Ausführung festlegen" bzw. "Gruppen-ID bei Ausführung festlegen") [1] sind Unix-Zugriffsrechte-Flags, mit denen Benutzer eine ausführbare Datei mit den Berechtigungen des Eigentümers bzw. der Gruppe der ausführbaren Datei und ausführen können Verhalten in Verzeichnissen zu ändern.

Ignacio Vazquez-Abrams
quelle
Okay, das beantwortet einen Teil meiner Frage. Wenn Sie näher
erläutern möchten,
2

Um den Teil über Syscalls zu beantworten, den scheinbar niemand berührt hat, ist einer der wichtigen Syscalls entweder setresuid () oder setresgid (). Ich bin mir sicher, dass es andere gibt, aber diese beiden scheinen ziemlich spezifisch für setuid / sudo zu sein.

Gregg Leventhal
quelle