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 sudo
realmente 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, saml
sigue 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
sudo -s
lugar desudo su
porque es un uso inútil desu
. :)El
sudo
binario real es la raíz setuid , y no puede simplemente crear archivos creados de esta manera.fuente
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.
fuente