
Estoy luchando por entender el concepto de bits SUID y por qué serían útiles.
Por ejemplo, digamos que tengo un programa:
-rwsr-xr-x 1 root root 12364 Jan 12 2013 /usr/bin/foo
Tengo entendido que el s
bit de ejecución para el propietario del usuario significa esencialmente que otros usuarios pueden ejecutar el archivo con la autoridad del propietario del archivo.
¿Por qué querría algo como esto? ¿Por qué no simplemente cambiar el grupo del archivo para que funcione para un grupo al que pertenecen todos los usuarios?
Respuesta1
Setuid y setgid (y setcap cuando exista) son las únicas formas de elevar los privilegios. Aparte de este mecanismo, un proceso puede renunciar a privilegios, pero nunca obtenerlos. Por lo tanto, no podrá hacer nada que requiera privilegios adicionales.
Por ejemplo, los programas su
y sudo
necesitan poder ejecutar comandos como cualquier usuario. Por lo tanto, deben ejecutarse como root, sin importar qué usuario los haya llamado.
Otro ejemplo es ping
. Los sockets TCP y UDP son accesibles para cualquier usuario, porque estos protocolos tienen una noción de puertos, y un proceso puede tomar el control de un puerto (lo que se llama vincularlo), por lo que el núcleo sabe dónde enviar los paquetes. ICMP no tiene tal noción, por lo que sólo los programas que se ejecutan como root (o con la capacidad adecuada) pueden solicitar que se les envíen paquetes ICMP. Para que cualquier usuario pueda ejecutar ping
, el ping
programa necesita tener un privilegio adicional, por lo que es setuid root (o setcap).
Como ejemplo de privilegios de grupo, considere un juego que almacena puntuaciones altas locales en un archivo. Dado que en el archivo de puntuación sólo se deben almacenar las puntuaciones más altas reales obtenidas por los usuarios, los jugadores no deben poder escribir en el archivo de puntuación. Sólo el programa del juego debe poder escribir en el archivo de puntuación. Entonces, el programa del juego se crea setgid games
y el grupo puede escribir en el archivo de puntuación, games
pero no los jugadores.
Existe un enfoque alternativo para elevar los permisos, que consiste en iniciar programas que requieren privilegios adicionales desde un programa iniciador privilegiado. Cuando un usuario desea realizar una tarea que requiere privilegios adicionales, ejecuta un programa de interfaz de usuario que utiliza alguna forma de comunicación entre procesos para realizar la acción privilegiada. Esto funciona bien para algunos casos de uso, como ping
(un ping
programa para analizar opciones e informar el progreso, y un ping-backend
servicio que envía y recibe paquetes), pero no para otros casos de uso, como el archivo de puntuación más alta del juego.
Respuesta2
La razón más común es que un ejecutable se puede ejecutar como root. Por ejemplo:
find /bin/ -type f \( -perm -4000 -o -perm -2000 \) -ls | awk '{print $3,$NF}'
-rwsr-xr-x /bin/su
-rwsr-xr-x /bin/mount
-rwsr-xr-- /bin/fusermount
-rwsr-xr-x /bin/ping6
-rwsr-xr-x /bin/ping
-rwsr-xr-x /bin/umount
Todos estos son comandos que pueden ejecutar usuarios normales pero que necesitan privilegios elevados. mount
es un ejemplo perfecto, puede montar cualquier disco que tenga user
configurada una opción similar, /etc/fstab
pero el montaje necesita root
privilegios para que el bit SUID esté configurado.
Respuesta3
El bit suid (o sgid) hace que un ejecutable se ejecute como un usuario/grupo diferente al usuario que lo invoca.
Si la única razón por la que lo hace es para acceder a un archivo en particular, sí, podría usar otros mecanismos para que se pueda escribir en ese archivo. Sin embargo, entonces el usuario podría hacercualquier cosaal archivo, a diferencia de solo las cosas que permite su programa.
Por ejemplo, podría hacer que su programa solo permita agregar una línea a un archivo y solo en un formato determinado. Pero si solo usó permisos del sistema de archivos, el usuario también podría eliminar líneas del archivo. O poner líneas mal formateadas.
Básicamente, un programa suid puede imponer políticas arbitrarias. Los permisos del sistema de archivos no pueden. Como ejemplo, su sistema tiene un programa suid /bin/su
. Le brinda un shell raíz (por ejemplo), pero solo si primero cumple con una política; generalmente, ingresa la contraseña de raíz. No hay manera de hacer eso sólo con permisos.
Respuesta4
Para mí, el ejemplo más simple es el comando passwd. Este comando permite a cualquier usuario cambiar su propia contraseña sin necesidad de privilegios de root. Sin embargo, el archivo en el que se almacenan todas las contraseñas sólo puede ser escrito por root.
Podríamos simplemente establecer los derechos en la sombra en 666 para que cualquiera pueda alterar el contenido, pero eso sería una falla de seguridad terrible. De ahí la necesidad del SUID. Esto hace posible otorgar privilegios elevados a cualquier usuario de manera controlada porque solo puede modificar el archivo Shadow a través del script passwd. El script en sí garantiza que el usuario no pueda cambiar la contraseña de otra persona.
Por supuesto, passwd debe estar protegido contra escritura. De lo contrario, el usuario podría modificar este archivo y utilizarlo para ejecutar scripts con privilegios de root.