¿Puede alguien explicar cómo sshd hace la separación de privilegios?

8

Estoy confundido acerca de cómo sshd descarta privs para conexiones entrantes. Encontré esta página que fue muy informativa en un nivel alto:

enlace

Pero no entiendo cómo el hijo de sshd privilegiado no tiene privilegios.

En mi depuración debajo de sshd privilegiado es 28389 y se llama a clone () para crear 29266, el niño sin privilegios. Cuando uso ps para mostrar el UID / EUID de los pids 29268 es UID 1002 como se esperaba, pero 29266, el niño sin privilegios de sshd, es cero, lo que parece contradecir el enlace anterior que dice "Esto se logra cambiando su uid / gid a un usuario no utilizado '.

[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]:~$

pregunta editada para ilustrar correctamente:

hijo sin privilegios (2406) del proceso de monitoreo (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]

y niño privilegiado por el usuario (2419) del proceso de supervisión posterior a la autenticación:

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: [email protected]/1

Aprecio las respuestas, gracias

    
pregunta woOt 27.02.2016 - 07:08
fuente

2 respuestas

8
  

29266, el niño sin privilegios

Este es el privilegiado , ya que el título del proceso muestra sshd: test [priv] , el 29268 no es un hijo postauth sin privilegios (el usuario ya es test en lugar de la raíz).

Pero el lugar principal donde puede usar privsep es antes de la autenticación:

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] 

Allí se ve el proceso privilegiado ejecutándose bajo root privilegios (10071) y net-child ( sshd: user [net] , ejecutándose bajo sshd usuario, y generalmente debajo de una zona de pruebas que evita la mayoría de los ataques de escalada de privilegios, allí Era un agujero en el código.

Así como ya lo mencionó tylerl, o se usa setuid para quitar / cambiar privilegios de root a sshd o su usuario. Pero tenga en cuenta que debe indicar el proceso correcto al intentar comprender esta constelación. La imagen suele ser más que miles de palabras:

En la imagen que corresponde a tu ejemplo:

  • el primer privilegiado es sshd daemon (su pid 28389 )
  • el segundo privilegiado es monitor (su pid 29266 )
  • no tienes en tu red co% de niño sin privilegios (mente pid ps )
  • el usuario privilegiado es hijo (su pid 10072 )
respondido por el Jakuje 27.02.2016 - 11:11
fuente
4

Así es como lo haces:

Empiezas con un proceso padre que se ejecuta como root.

Ese proceso fork s en sí mismo, creando dos clones idénticos, solo uno de ellos es el padre y uno es el hijo ( fork devuelve el PID del niño para el proceso padre y 0 para el niño). NB: fork es el nombre de la función libc, bajo el capó al que llama clone , que es el syscall proporcionado por el kernel.

En el niño, a continuación, realiza las operaciones privilegiadas que deben realizarse, configurando el entorno como se desee.

Una vez que se realiza todo el trabajo de preparación, el proceso secundario llama a setuid (en realidad, probablemente una combinación de setreuid setregid y posiblemente algunas otras llamadas) para cambiar al UID / GID del nuevo propietario del proceso sin privilegios .

Por último, el hijo llama a exec (probablemente execle o similar) para ejecutar cualquier programa que el niño esté ejecutando, reemplazando el espacio de proceso actual con el nuevo, aunque manteniendo el mismo UID / GID / PID que el proceso hijo tenía antes.

    
respondido por el tylerl 27.02.2016 - 07:28
fuente

Lea otras preguntas en las etiquetas