Qualcuno può spiegare come sshd fa la separazione dei privilegi?

8

Sono confuso su come sshd fa cadere i privilegi per le connessioni in entrata. Ho trovato questa pagina che è stata molto istruttiva ad alto livello:

link

Ma non capisco come il figlio di sshd privilegiato non abbia privilegi.

Nel mio debug sotto sshd privilegiato è 28389 e chiama clone () per creare 29266, il bambino senza privilegi. Quando uso ps per visualizzare l'UID / EUID dei pids 29268 è UID 1002 come previsto, ma 29266, il figlio non privilegiato di sshd, è zero, che sembra contraddire il link sopra il quale dice 'Questo si ottiene cambiando il suo uid / gid a un utente non utilizzato '.

woOt@host:~$ 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
woOt@host:~$
woOt@host:~$
woOt@host:~$ 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: test@pts/2
woOt@host:~$
woOt@host:~$
woOt@host:~$ ps -eo pid,uid,euid | egrep 'PID|28389|29266|29268'
  PID   UID  EUID
28389     0     0
29266     0     0
29268  1002  1002
woOt@host:~$
woOt@host:~$
woOt@host:~$ grep 1002 /etc/passwd
test:x:1002:1003:,,,:/home/test:/bin/bash
woOt@host:~$

domanda modificata per illustrare correttamente:

figlio non privilegiato (2406) del processo di monitoraggio (2405)

root      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 ?        S    00:12   0:00      \_ sshd: test [net]

e figlio privilegiato utente (2419) del processo di monitoraggio post-auth:

root      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 ?        S    00:12   0:00      \_ sshd: test@pts/1

apprezza le risposte, grazie

    
posta woOt 27.02.2016 - 07:08
fonte

2 risposte

8

29266, the unprivileged child

Questo è il privilegiato , poiché il titolo del processo mostra sshd: test [priv] , il 29268 è figlio subordinato non privilegiato (l'utente è già test invece di root).

Ma il luogo principale in cui è possibile utilizzare privsep è before authentication:

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] 

Si vede il processo privilegiato in esecuzione con root privilegi (10071) e net-child ( sshd: user [net] , in esecuzione con sshd utente, e in genere con qualche sandbox che impedisce la maggior parte degli attacchi di escalation di privilegi, lì era un buco nel codice.

Quindi, come già detto da tylerl, o tu setuid è usato per rilasciare / cambiare i privilegi da root a sshd o il tuo utente. Ma nota che devi indicare il processo corretto quando cerchi di capire questa costellazione. L'immagine è in genere più di migliaia di parole:

Dove nell'immagine corrispondente al tuo esempio:

  • il primo privilegiato è sshd daemon (il tuo pid 28389 )
  • il secondo privilegiato è monitor (il tuo pid 29266 )
  • non hai nel tuo ps child di rete senza privilegi (mind pid 10072 )
  • l'utente con privilegi è figlio (il tuo pid 29268 )
risposta data 27.02.2016 - 11:11
fonte
4

Ecco come lo fai:

Si inizia con un processo genitore, eseguito come root.

Quel processo fork s stesso, creando due cloni identici, solo uno di essi è il genitore e uno è il bambino ( fork restituisce il PID del figlio per il processo genitore e 0 per il figlio). NB: fork è il nome della funzione libc, sotto il cofano chiama clone che è il syscall fornito dal kernel.

Nel bambino, esegui le operazioni privilegiate che devono succedere, impostando l'ambiente come desiderato.

Una volta terminato tutto il lavoro di preparazione, il processo figlio chiama setuid (in realtà probabilmente una combinazione di setreuid setregid e probabilmente poche altre chiamate) per passare all'UID / GID del nuovo proprietario del processo non privilegiato .

Infine, il bambino chiama exec (probabilmente execle o simile) per eseguire qualsiasi programma che il bambino dovrebbe eseguire, sostituendo lo spazio del processo corrente con quello nuovo, pur mantenendo lo stesso UID / GID / PID che il processo figlio aveva prima.

    
risposta data 27.02.2016 - 07:28
fonte

Leggi altre domande sui tag