Aufforderung zur Eingabe des Sudo-Passworts in einem Setuid-Root-Binary

695
Akshay Krishnan R

Ich habe ein Setuid-Root-Binary with_sudo.binmit dem folgenden Quellcode:

/* with_sudo.c */ #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h>  int main() { printf("\n\n ruid : %d \n euid : %d \n\n", (int)getuid(), (int)geteuid()); system("/usr/bin/sudo cat /root/key.txt"); return 0; } 

 

akshay@bluebox ~ $ ls -l with_sudo.bin -rwsr-sr-x 1 root root 8684 Feb 1 22:09 with_sudo.bin 

Obwohl es sich um ein Setuid-Root-Binary handelt, wird das Sudo-Passwort abgefragt.

akshay@bluebox ~ $ ./with_sudo.bin ruid : 1000 euid : 0  [sudo] password for akshay: 

Wenn ich die andere Binärdatei ohne sudoin ausführe system(), wird sie mit Superuser-Berechtigungen ausgeführt.

/* without_sudo.c */ #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h>  int main() { printf("\n\n ruid : %d \n euid : %d \n\n", (int)getuid(), (int)geteuid()); system("cat /root/key.txt"); return 0; } 

 

akshay@bluebox ~ $ ls -l without_sudo.bin -rwsr-sr-x 1 root root 8677 Feb 1 22:09 without_sudo.bin 

akshay @ bluebox ~ $ ./without_sudo.bin

ruid: 1000 euid: 0

::: this_is_a_secret_key :::

Als der Real UIDBefehl 0zusammen mit der Effective UIDVerwendung erstellt wurde setreuid(geteuid(), 0);, lief die Binärdatei mit Superuser-Berechtigungen, ohne nach dem Sudo-Kennwort zu fragen, obwohl sudoverwendet wurde.

/* with_sudo_ruid_elevated.c */ #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h>  int main() { setreuid(0, geteuid()); printf("\n\n ruid : %d \n euid : %d \n\n", (int)getuid(), (int)geteuid()); system("/usr/bin/sudo cat /root/key.txt"); return 0; } 

Ich habe gelesen, dass EUIDverwendet wird, um die Privilegien des Prozesses zu bewerten, um eine bestimmte Aktion auszuführen. Warum wird dann sudonach dem Sudo-Passwort gefragt, RUIDauch wenn das EUIDist 0?

1

1 Antwort auf die Frage

3
G-Man

Es ist ein bisschen kompliziert. Das Betriebssystem - Kernel verwendet eine effektive UID des Prozesses und GID seine Privilegien / Berechtigungen zu bestimmen; Sie werden für verwendet

  • gewöhnliche Dateisystemvorgänge (z. B. Öffnen, Verknüpfen / Aufheben der Verknüpfung) basierend auf den Benutzer- / Gruppen- / anderen Regeln zulassen / verbieten
  • Festlegen des Eigentums an neu erstellten Dateien,
  • Bestimmen, an welche anderen Prozesse ein Prozess Signale senden kann, und
  • Entscheidung, ob ein Prozess Dateisysteme bereitstellen oder die Bereitstellung aufheben kann, das Datum ändern, das System herunterfahren kann usw.

und wahrscheinlich andere Dinge. Der Haken ist jedoch, wenn ein Programm eine Art Zugriffs- / Berechtigungsentscheidung treffen muss, muss es normalerweise die echte UID und GID verwenden. Bedenken Sie: Wenn Ihr with_sudo.cProgramm ausgeführt wird sudo, ist die effektive UID root (0) und die reale UID ist Sie (1000) printfDies ist jedoch genau das Gleiche wie sudobei einer unprivilegierten Shell.   Bei jeder sudo Ausführung ist die effektive UID 0 - daher sudokann sie nicht verwendet werden, um zu entscheiden, wie sie sich verhalten soll. Es muss die echte UID verwenden, um herauszufinden, wer Sie wirklich sind, damit es bestimmen kann, was Sie tun dürfen sudo. Nur wenn die reale UID 0 istsudoSchlußfolgerung, dass du "wirklich" root bist oder zumindest nicht zuverlässig deine tatsächliche Identität bestimmen kannst, so dass es nicht weiß, welche Einschränkungen für dich gelten, und es führt nur die aus, catohne dass eine weitere Authentifizierung von dir verlangt wird.

Gibt es eine nicht-setuid_root-Binärdatei, die zur Authentifizierung auffordert, wenn sie als "EUID 0" und als "root" nicht als "RUID" aufgerufen wird? Akshay Krishnan R vor 9 Jahren 0