Un becario con las llaves de todo
Una empresa le encarga a su becario una tarea pequeña: editar un archivo de configuración del servidor. Para ir rápido, el administrador le deja usar sudo con un editor, sin contraseña.
Un año después, una auditoría descubre que el becario podía haberse hecho root cuando quisiera. El camino era el editor.
Al final de esta lección
Nota
Puedo explicar cómo un fallo permite a un usuario hacerse root y cómo cerrarlo.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Privilegio | el poder que tiene una cuenta sobre la máquina | |
| Mínimo privilegio | dar a cada cuenta solo el poder que su trabajo necesita | |
| Setuid | un programa que se ejecuta como su dueño, lo lance quien lo lance | -rwsr-xr-x |
| Regla de sudo | una línea que dice quién puede ejecutar qué como root | |
| Auditoría | revisar un sistema con una lista de errores conocidos |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
La regla única
Advertencia
Mira solo la máquina de este laboratorio. Es tuya y no llega a nadie más. Hacer esto en una máquina ajena, sin permiso, es un delito en muchos países.
Setuid ejecuta un archivo como su dueño
Casi todos los programas se ejecutan con los derechos de quien los lanza. Un programa setuid se ejecuta con los derechos de su dueño.
Algunos lo necesitan. passwd debe cambiar un archivo protegido. Pero un programa setuid de root que nadie planeó es un camino hacia root.
Busca los programas con setuid
find /usr/local/bin /usr/bin -perm -4000 -type fSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Mira su dueño y su modo
find /usr/local/bin /usr/bin -perm -4000 -type f -exec ls -l {} +Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo: leer la letra s
| Modo | Significado |
|---|---|
| -rwxr-xr-x | Un programa normal |
| -rwsr-xr-x | Setuid: se ejecuta como su dueño |
| -rwxr-sr-x | Setgid: se ejecuta con su grupo |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una regla de sudo puede ser demasiado ancha
Una regla de sudo nombra a un usuario, como quién puede actuar y qué programas. NOPASSWD significa que no pide contraseña.
Nombrar un solo programa parece seguro. No lo es si ese programa puede lanzar otro. Los editores, los paginadores y find pueden abrir una shell. Una shell abierta dentro de sudo es una shell de root.
Busca las reglas sin contraseña
sudo grep -r NOPASSWD /etc/sudoers.dSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
¿Qué puede ejecutar intern con sudo?
sudo -l -U internSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo: reglas estrechas y anchas
| Regla | Riesgo | Mejor |
|---|---|---|
| ops ALL=(ALL) NOPASSWD: ALL | Root para todo, sin contraseña | Nombrar las pocas órdenes necesarias |
| becario ALL=(root) NOPASSWD: /usr/bin/less | less puede abrir una shell | Una orden exacta que solo lea ese archivo |
| web ALL=(root) /usr/bin/systemctl restart tienda | Estrecha: una orden exacta | Dejarla como está |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente cree que una regla de sudo para un solo programa es estrecha. Solo lo es si ese programa no puede ejecutar otros. Antes de permitir uno, pregunta: ¿puede abrir una shell o abrir otro archivo como root?
Root se fía del script que ejecuta
El cron de root ejecuta un script cada minuto. Si cualquiera puede editar ese script, cualquiera puede hacer que root ejecute sus órdenes.
La regla es sencilla. Un archivo que ejecuta root debe ser de root, y nadie más puede escribir en él. La carpeta donde está también importa.
Busca archivos que cualquiera puede escribir
find /opt -perm -o+w -type f -exec ls -l {} +Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
¿Lo ejecuta root de verdad?
sudo crontab -l -u rootSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Los tres fallos y cómo cerrarlos
| Fallo | Cómo verlo | Cómo cerrarlo |
|---|---|---|
| Un programa setuid de root que nadie planeó | find con -perm -4000 | chmod u-s, o borrar la copia |
| Una regla de sudo demasiado ancha | grep NOPASSWD en /etc/sudoers.d | Nombrar órdenes exactas, o usar sudoedit |
| Un script de root que cualquiera edita | find con -perm -o+w | chmod 755 y dueño root |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Haz el laboratorio y luego cierra el hueco
Consejo
El laboratorio te pide usar uno de estos fallos en tu propia máquina y escribir lo que hiciste. Hazlo primero. Después, en tu informe, explica cómo cerrarías el hueco con la tabla de arriba.
Para ir más lejos
Escribe find /opt /usr/local/bin /etc/cron.d -type f -perm /022. El /022 significa "el grupo o el resto pueden escribir".
Por cada línea que imprima, anota tres cosas en tu informe. ¿Quién puede escribir en el archivo? ¿Quién lo ejecuta? ¿Qué orden cierra el hueco?