¿Cómo funcionan las partes internas de sudo?

74

¿Cómo sudofunciona internamente? ¿Cómo es posible que pueda convertirse en root sin tener la contraseña de root, a diferencia su? ¿Qué syscalls, etc. están involucrados en el proceso? ¿No es un agujero de seguridad enorme en Linux (por ejemplo, ¿por qué no podría compilar un parche muy parcheado sudoque simplemente hizo lo que hizo regularmente sudo, pero no solicitó la contraseña del usuario no privilegiado)?

He leído login y su internals . También he leído ¿Cómo se pretende usar sudo? pero a pesar del título, se ocupan principalmente de las diferencias entre suy sudo.

Strugee
fuente

Respuestas:

80

Si echas un vistazo al ejecutable sudo:

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

Notarás que lleva los bits de permiso ---s--x--x. Estos se pueden desglosar de la siguiente manera:

-|--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

Entonces, cuando un programa tiene habilitado su bit setuid (también conocido como SUID), significa que cuando alguien ejecuta este programa, se ejecutará con las credenciales del usuario propietario del archivo, también conocido como. raíz en este caso.

Ejemplo

Si ejecuto el siguiente comando como usuario saml:

$ whoami
saml

$ sudo su -
[sudo] password for saml: 

Notarás que la ejecución de sudorealmente se está ejecutando como root:

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

mecanismo setuid

Si tiene curiosidad sobre cómo funciona SUID, eche un vistazo man setuid. Aquí hay un extracto de la página del manual que lo explica mejor de lo que podría:

setuid () establece la identificación de usuario efectiva del proceso de llamada. Si el UID efectivo de la persona que llama es root, también se configuran el UID real y el set-user-ID guardado. En Linux, setuid () se implementa como la versión POSIX con la característica _POSIX_SAVED_IDS. Esto permite que un programa set-user-ID (que no sea root) elimine todos sus privilegios de usuario, realice un trabajo sin privilegios y luego vuelva a conectar la ID de usuario efectiva original de manera segura.

Si el usuario es root o el programa es set-user-ID-root, se debe tener especial cuidado. La función setuid () verifica la ID de usuario efectiva de la persona que llama y si es el superusuario, todas las ID de usuario relacionadas con el proceso se configuran en uid. Después de que esto haya ocurrido, es imposible que el programa recupere los privilegios de root.

El concepto clave aquí es que los programas tienen un ID de usuario real (UID) y uno efectivo (EUID). Setuid está configurando el ID de usuario efectivo (EUID) cuando este bit está habilitado.

Entonces, desde la perspectiva del kernel, se sabe que, en nuestro ejemplo, samlsigue siendo el propietario original (UID), pero el EUID se ha establecido con quien sea el propietario del ejecutable.

setgid

También debo mencionar que cuando estamos desglosando los permisos en el comando sudo, el segundo grupo de bits era para permisos de grupo. Los bits del grupo también tienen algo similar a setuid llamado set group id (también conocido como setgid, SGID). Esto hace lo mismo que SUID, excepto que ejecuta el proceso con las credenciales del grupo en lugar de las credenciales del propietario.

Referencias

slm
fuente
44
Debería usar en sudo -slugar de sudo suporque es un uso inútil de su. :)
Totor
4

El sudobinario real es la raíz setuid , y no puede simplemente crear archivos creados de esta manera.

setuid y setgid (abreviatura de "establecer ID de usuario tras la ejecución" y "establecer ID de grupo tras la ejecución", respectivamente) [1] son ​​indicadores de derechos de acceso de Unix que permiten a los usuarios ejecutar un ejecutable con los permisos del propietario o grupo del ejecutable respectivamente y para cambiar el comportamiento en los directorios.

Ignacio Vazquez-Abrams
fuente
bueno, eso responde parte de mi pregunta. si quisieras explicar cómo sudo usa este bit, y un poco más sobre lo que hace este bit, me encantaría aceptar esta respuesta
strugee
2

Para responder la parte sobre syscalls que nadie parece haber tocado, una de las syscalls importantes es setresuid () o setresgid (). Estoy seguro de que hay otros, pero estos 2 parecen bastante específicos de setuid / sudo.

Gregg Leventhal
fuente