domingo, 26 de agosto de 2012

Entendiendo el SUID

A pesar del auge de componentes de seguridad en GNU/Linux como son SELINUX y AppArmor, desde sus inicios nuestro sistema operativo ha contado con los mecanismos para controlar el acceso a ficheros. Existen cientos de scripts y programas que han sido desarrollados asumiendo esta arquitectura. Esto hace imperativo conocer estos conceptos si usas GNU/Linux. Aun cuando nunca uses un terminal, estos scripts están en una opción de un menú o en un botón de aceptar. 

El sistema tradicional define tres maneras o modos de usar un archivo, y tres niveles de derechos de acceso para dichas operaciones. Podemos (r)ead “leer”, (w)rite “escribir” o e(x)ecute “ejecutar” un archivo o fichero. Los niveles son owner “dueño”, group “grupo” y public “público” (o world, el mundo, en muchos instructivos). 




El dueño es el usuario a quien le pertenece el archivo, ya sea porque lo creó o porque el administrador así lo determinó. Los grupos conectan diferentes usuarios que deben compartir los mismos derechos de acceso a algunos programas o archivos. Los tres derechos son listados en frecuencia, para cada nivel, usando las letras rwx:
[fraterneo@rainbow ~]$ ls -l script1.*
-rwxrwxr-x 1 fraterneo fraterneo 0 Aug 26 22:36 script1.sh
-rw-rw-r-- 1 fraterneo fraterneo 0 Aug 26 22:37 script1.txt
Un listado de archivos como el anterior indica que el usuario fraterneo tiene todos los permisos (rwx) en el archivo script1.sh; los usuarios miembros del grupo fraterneo también, y todos los demás usuarios solo pueden leerlo y ejecutarlo, no lo pueden modificar. El archivo script1.txt tiene todos los permisos para fraterneo y su grupo excepto ejecución, y los demás usuarios solo pueden leerlo. SUID y GUID Algunos archivos tienen una “s” donde corresponde la primera o segunda “x”:
-rwsr-xr-- 1 fraterneo fraterneo 0 Aug 26 22:40 fichero.txt
Una “s” en la primera posición significa que el bit del SETUID o SUID ha sido habilitado. El bit GUID es en esencia lo mismo pero para el nivel de grupo. GNU/Linux corre un ejecutable con el bit SETUID habilitado con el User ID, es decir los privilegios, del dueño de dicho archivo, y no con los del usuario que lo ejecuta. Los Sys Admins deben evitar este comportamiento en todo el sistema de archivos montándolo con la opción nosuid. El bit SUID no debe ser confundido con el sticky bit, que en GNU/Linux es normalmente usado y perteneciente solo a los directorios o carpetas. Cuando es habilitado, este bit implica que solo el dueño de dicho directorio o en su defecto el super usuario pueden eliminar, desenlazar o renombrar los archivos que este contiene. 

Problemas con el SETUID 
Los programas con SETUID pueden ser peligrosos, a menos que sean creados y utilizados con gran cuidado. Los scripts interpretados son, desde este punto de vista, peores que un programa compilado, debida a que muy a menudo estos solo llaman otros scripts o programas los cuales pueden tener en sí mismos fallas de seguridad desconocidas por el autor del script. Además son usados con frecuencia para resolver problemas ocasionales por lo que no son probados con rigurosidad en el tema de la seguridad. 

Otro riesgo lo constitye la forma en la que el shebang trabaja. El shebang son los caracteres “#!” al cominezo del script. Esto le indica a GNU/Linux que este archivo ha de ser interpretado. El shebang puede ser usado por crackers para conseguir un shell interactivo, probablemente con privilegios de super usuario, desde el cual pueda ejecutar los comandos que quiera. Por todas estas razones el kernel Linux normalmente ignora el bit SETUID en todos los ficheros ejecutables cuyo contenido comienza con el shebang. 

Posibles soluciones
Si tienen un script el cual sea imprescindible ejecutarlo con el SETUID habilitado, la solución más simple es agregar un guión al final de la ruta al intérprete del script: #!/bin/sh. Esto le indica al kernel que lo que sea que siga no son más opciones para el intérprete. Otra solución lo es habilitar el comando sudo para los usuarios y que no tengan que escribir la contraseña. Esto les permite ejecutar sus scripts con el ID de su propietario. 

Buscando archivos con permisos inesperados 
La herramienta adecuada para este trabajo lo es el comando find. Si estamos interesados solo en buscar los ejecutables, usaremos la opción -executable. Para buscar específicamente cosas del SUID, usaremos la opción -perm. Esto buscará todos los archivos cuyos permisos coincidan exactamente con los que indiquemos. Si le indicamos g=w, obtendremos los archivos cuyo único permiso es escritura al grupo. 

Para buscar archivos que tienen todos los permisos que indiquemos, sin tener en cuenta los demás, pondremos un guión delante del modo (-perm -g=w’). Un slash en la misma posición significaría buscar todos los archvios que tienen cualquiera de estos permisos. Finalmente, la forma para buscar todos los archivos y carpetas SUID en nuestro sistema:
# find / -perm -4000
http://fraterneo.blogspot.com/2011/02/sticky-bit-anadiendo-seguridad-nuestros.html
http://devrajtiwary.blogspot.com/2012/06/what-is-suid-and-how-to-set-suid-in.html

No hay comentarios:

Publicar un comentario