Hay muchos casos en los que los usuarios normales necesitan acceso elevado para realizar tareas. El administrador del sistema no siempre puede estar presente para introducir una contraseña de root cada vez que un usuario necesita acceso a un archivo protegido, por lo que existen bits de permisos de archivo especiales para permitir este comportamiento. El Set User ID (SUID) permite a un usuario ejecutar un programa como el propietario del archivo del programa en lugar de como ellos mismos.
Veamos un ejemplo:
Digamos que quiero cambiar mi contraseña, ¿sencillo verdad? Simplemente uso el comando passwd:
passwd
¿Qué está haciendo el comando passwd? Está modificando un par de archivos, pero lo más importante es que está modificando el archivo /etc/shadow. Echemos un vistazo a ese archivo por un segundo:
$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1134 Dec 1 11:45 /etc/shadow
Oh, espera un minuto, ¿este archivo es propiedad de root? ¿Cómo es posible que podamos modificar un archivo propiedad de root?
Veamos otro conjunto de permisos, esta vez del comando que ejecutamos:
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 47032 Dec 1 11:45 /usr/bin/passwd
Notarás un nuevo bit de permiso aquí s. Este bit de permiso es el SUID. Cuando un archivo tiene este permiso establecido, permite a los usuarios que iniciaron el programa obtener el permiso del propietario del archivo, así como el permiso de ejecución, en este caso root. Así que, esencialmente, mientras un usuario está ejecutando el comando passwd, lo está ejecutando como root.
Es por eso que podemos acceder a un archivo protegido como /etc/shadow cuando ejecutamos el comando passwd. Ahora, si eliminas ese bit, verás que no podrás modificar /etc/shadow y, por lo tanto, cambiar tu contraseña.
Modificación de SUID
Al igual que los permisos regulares, hay dos formas de modificar los permisos SUID.
Forma simbólica:
sudo chmod u+s myfile
Forma numérica:
sudo chmod 4755 myfile
Como puedes ver, el SUID se denota con un 4 y se antepone al conjunto de permisos. Puedes ver el SUID denotado como una S mayúscula. Esto significa que sigue haciendo lo mismo, pero no tiene permisos de ejecución.