Logrotate abuse (logrotten)
logrotate es la utilidad de Linux que rota, comprime y elimina logs antiguos. Suele ejecutarse periódicamente como root (vía cron). Las versiones 3.18.0 y anteriores sufren una condición de carrera que un usuario sin privilegios puede explotar para escribir ficheros arbitrarios como root, siempre que tenga permiso de escritura sobre un log que logrotate rote (o sobre su directorio).
El fallo (race condition)
Durante la rotación, logrotate crea el nuevo fichero de log y, entre el momento en que comprueba la ruta y el momento en que escribe, hay una ventana. El exploit logrotten gana esa carrera sustituyendo el log recién rotado por un enlace simbólico a un destino sensible. logrotate, corriendo como root, sigue el enlace y escribe ahí el contenido que el atacante controla, logrando una escritura arbitraria como root.
Enumeración
Confirmar la versión, la frecuencia y qué log rota, y sobre cuál tenemos escritura:
logrotate --version # 3.18.0 o anterior -> vulnerable
cat /etc/logrotate.conf; ls -la /etc/logrotate.d/
find / -writable -name '*.log' 2>/dev/nulllogrotate a menudo se dispara por un cron de root; pspy lo revela sin necesidad de leer el crontab de root (pspy).
Destinos típicos
Donde una escritura como root se convierta en ejecución de código:
- Un script en
/etc/cron.d/o/etc/cron.daily/que se ejecutará comoroot. - Ficheros de inicialización de shell o de un servicio.
- El payload clásico
chmod u+s /bin/bash: poner el bit SUID abashy luegobash -ppara conservar el UID efectivo deroot(abuso de SUID).
Procedimiento
echo 'chmod u+s /bin/bash' > payload
gcc -o logrotten logrotten.c
./logrotten -p ./payload /ruta/al/log/que/se/rota
# provocar la rotacion escribiendo en el log objetivo:
echo a > /ruta/al/log/que/se/rota
# tras el siguiente ciclo: bash -p -> euid=0El paso que se olvida: tras lanzar el exploit hay que provocar la rotación escribiendo en el log; si el fichero no cambia, logrotate no rota y el exploit no se dispara.
Cómo detectarlo. La firma es un proceso logrotate (o su cron padre) siguiendo un symlink o escribiendo fuera del árbol de logs: auditd sobre open/openat con O_CREAT en rutas como /etc/cron.d/ o /bin con ppid de logrotate es inconfundible, porque una rotación legítima solo toca /var/log. La creación de un enlace simbólico en el directorio de logs justo antes de la rotación, y la aparición de un bash con bit SUID a continuación, cierran la cadena.
Defensa. Actualizar logrotate (las versiones modernas mitigan la carrera); no dar a usuarios escritura sobre logs que rote un proceso privilegiado; ejecutar la rotación de logs de usuario sin privilegios de root; usar su/createolddir con cuidado. Relacionado con espiar procesos con pspy y con el abuso de tareas cron en general.
Máquinas donde se aplica
- BookHackTheBox