it-swarm.com.de

Kann jemand erklären, wie sshd Privilegien trennt?

Ich bin verwirrt darüber, wie sshd privs für eingehende Verbindungen löscht. Ich fand diese Seite, die auf hohem Niveau sehr informativ war:

http://www.citi.umich.edu/u/provos/ssh/privsep.html

Aber ich verstehe nicht, wie das Kind von privilegiertem sshd nicht privilegiert ist.

In meinem Debug unten ist privilegiertes sshd 28389 und ruft clone () auf, um 29266, das nicht privilegierte Kind, zu erstellen. Wenn ich ps verwende, um die UID/EUID der Pids anzuzeigen, ist 29268 wie erwartet UID 1002, aber 29266, das nicht privilegierte Kind von sshd, ist Null, was dem obigen Link zu widersprechen scheint, der besagt: 'Dies wird durch Ändern seiner UID/erreicht. gid an einen nicht verwendeten Benutzer '.

[email protected]:~$ Sudo strace -p 28389 -e trace=clone
Process 28389 attached - interrupt to quit
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fb7076d5a90) = 29266
^CProcess 28389 detached
[email protected]:~$
[email protected]:~$
[email protected]:~$ ps auxf | grep sshd
root     28389  0.0  0.0  49944  1244 ?        Ss   18:15   0:00 /usr/sbin/sshd
root     29266  0.0  0.2  54576  3308 ?        Ss   18:37   0:00  \_ sshd: test [priv]
test     29268  0.0  0.0  54576  1440 ?        S    18:37   0:00      \_ sshd: [email protected]/2
[email protected]:~$
[email protected]:~$
[email protected]:~$ ps -eo pid,uid,euid | egrep 'PID|28389|29266|29268'
  PID   UID  EUID
28389     0     0
29266     0     0
29268  1002  1002
[email protected]:~$
[email protected]:~$
[email protected]:~$ grep 1002 /etc/passwd
test:x:1002:1003:,,,:/home/test:/bin/bash
[email protected]:~$

bearbeitete Frage zur korrekten Veranschaulichung:

nichtprivilegiertes Kind (2406) des Überwachungsprozesses (2405)

 Wurzel 2370 0,0 1,1 55592 5524? Ss 00:12 0:00/usr/sbin/sshd -D 
 Root 2405 0.0 1.1 59008 5720? Ss 00:12 0:00\_ sshd: test [priv] 
 Sshd 2406  0,0 0,6 56936 3072 & le; S 00:12 0:00\_ sshd: test [net] 

und benutzerprivilegiertes Kind (2419) des Monitorprozesses nach der Authentifizierung:

 Wurzel 2370 0,0 1,1 55592 5524? Ss 00:12 0:00/usr/sbin/sshd -D 
 Root 2405 0.0 1.1 60224 5756? Ss 00:12 0:00\_ sshd: test [priv] 
 Test 2419  0,0 0,7 60224 3888 & le; S 00:12 0:00\_ sshd: test @ pts/1 

schätze die Antworten, danke

10
woOt

29266, das benachteiligte Kind

Dies ist das privilegierte , wie der Prozesstitel zeigt sshd: test [priv], Das 29268 Ist ein nicht privilegiertes postauth Kind (Benutzer) ist bereits test anstelle von root).

Der Hauptort, an dem Sie privsep verwenden können, ist vor Authentifizierung:

root     11759  0.0  0.0  69928  6056 ?        Ss   Feb07   0:00 /usr/sbin/sshd -D
root     10071  0.2  0.0 119280  7096 ?        Ss   10:56   0:00  \_ sshd: unknown [priv]
sshd     10072  0.2  0.0  71272  3016 ?        S    10:56   0:00      \_ sshd: unknown [net] 

Dort sehen Sie den privilegierten Prozess, der unter den Berechtigungen root (10071) und net-child (sshd: user [net] Ausgeführt wird, unter dem Benutzer sshd ausgeführt wird und normalerweise unter einer Sandbox, die die meisten verhindert Eskalationsangriffe auf Privilegien, es gab eine Lücke im Code.

Wie bereits von tylerl erwähnt, oder Sie setuid wird verwendet, um Berechtigungen von root auf sshd oder Ihren Benutzer zu löschen/zu ändern. Beachten Sie jedoch, dass Sie auf den richtigen Prozess hinweisen müssen, wenn Sie versuchen, diese Konstellation zu verstehen. Bild ist in der Regel mehr als tausend Wörter:

(image

Wo in dem Bild, das Ihrem Beispiel entspricht:

  • der erste privilegierte ist sshd Daemon (Ihre PID 28389)
  • der zweite privilegierte ist Monitor (Ihre PID 29266)
  • sie haben nicht in Ihrem ps nicht privilegierten Netzwerkkind (mind pid 10072)
  • der Benutzer ist ein Kind (Ihre PID 29268).
12
Jakuje

So geht's:

Sie beginnen mit einem übergeordneten Prozess, der als Root ausgeführt wird.

Dieser Prozess forks selbst erstellt zwei identische Klone, von denen nur einer der Eltern und einer das Kind ist (fork gibt die PID des Kindes für den Elternprozess und 0 für das Kind zurück). NB: fork ist der Name der libc-Funktion. Unter der Haube wird clone aufgerufen. Dies ist der vom Kernel bereitgestellte Systemaufruf.

Im untergeordneten Element führen Sie als Nächstes alle erforderlichen privilegierten Vorgänge aus und richten die Umgebung wie gewünscht ein.

Sobald alle Vorbereitungsarbeiten abgeschlossen sind, ruft der untergeordnete Prozess setuid (tatsächlich wahrscheinlich eine Kombination aus setreuidsetregid und möglicherweise einigen anderen Aufrufen) auf, um zur UID/GID zu wechseln des neuen nichtprivilegierten Prozessbesitzers.

Zuletzt ruft das Kind exec (wahrscheinlich execle oder ähnliches) auf, um das Programm auszuführen, das das Kind ausführen soll, wobei der aktuelle Prozessbereich durch den neuen ersetzt wird, wobei dieselbe UID/beibehalten wird. GID/PID, die der untergeordnete Prozess zuvor hatte.

4
tylerl