La empresa Qualys ha identificado tres vulnerabilidades en la herramienta needrestart, diseñada para reiniciar procesos en segundo plano después de actualizar las bibliotecas utilizadas por esos procesos. A partir de Ubuntu 21.04, la herramienta needrestart forma parte del entorno básico de Ubuntu Server, donde se ejecuta con privilegios de root al final de cada transacción del gestor de paquetes APT, escanea los procesos en ejecución y reinicia aquellos que están relacionados con archivos que han cambiado después de la actualización de paquetes. Las vulnerabilidades identificadas permiten a un usuario local sin privilegios obtener derechos de root en Ubuntu Server con la configuración predeterminada.
Las vulnerabilidades están presentes en needrestart desde la versión 0.8 (2014) y se han corregido en la versión 3.8 de needrestart. Los problemas también se han resuelto en las distribuciones de Debian y Ubuntu. Como solución alternativa para bloquear la explotación de la vulnerabilidad, se puede desactivar el escaneo de intérpretes especificando en el archivo de configuración /etc/needrestart/needrestart.conf el parámetro "$nrconf{interpscan} = 0".
Las vulnerabilidades están presentes en el código que implementa el modo de detección de actualización de scripts ejecutados con intérpretes. Los problemas identificados son:
- CVE-2024-48990: un usuario local puede lograr la ejecución de código con privilegios de root creando condiciones para ejecutar el intérprete de Python con una variable de entorno PYTHONPATH establecida por el atacante. Además del uso de Python, el ataque también puede llevarse a cabo (CVE-2024-48992) a través de la ejecución del intérprete de Ruby con la variable de entorno RUBYLIB.
Las vulnerabilidades se deben a que, durante el reinicio de un script modificado, la herramienta needrestart establece la variable de entorno PYTHONPATH en función del contenido del archivo /proc/pid/environ, que luego utiliza también para ejecutar su propio código Python. Por lo tanto, el atacante puede esperar la actividad relacionada con el funcionamiento del gestor de paquetes APT, simular el cambio de su script y establecer la variable de entorno PYTHONPATH, que también se aplicará al ejecutar el código Python integrado en needrestart ("import sys\n print(sys.path)") que se ejecuta con privilegios de root.
Por ejemplo, para explotar la vulnerabilidad se puede iniciar un proceso de Python que se mantenga en memoria, configurando la variable de entorno «PYTHONPATH=/home/test», y colocar una biblioteca compartida «/home/test/importlib/__init__.so», que se ejecutará cuando se ejecute código Python privilegiado en needrestart.
- CVE-2024-48991 — un usuario local puede lograr la ejecución de código con privilegios de root al provocar una condición de carrera, como resultado de la cual needrestart iniciará un intérprete de Python falso proporcionado por el atacante, en lugar del intérprete de Python del sistema. La esencia de la vulnerabilidad es similar al problema mencionado anteriormente, la única diferencia es que needrestart determina el nombre del proceso Python (por ejemplo, /usr/bin/python3) al leer «/proc/pid/exe».
Para explotar la vulnerabilidad, se puede crear un proceso /home/test/race, que mediante el mecanismo inotify esperará el momento en que needrestart comience a leer el contenido de /proc/pid/exe, y luego iniciará rápidamente el intérprete de Python del sistema a través de la función execve. Dado que needrestart no verifica si este es realmente Python, considerará que /home/test/race es el intérprete de Python y lo ejecutará para su código.
- CVE-2024-11003 — un usuario local puede lograr ejecutar comandos shell arbitrarios con privilegios de root al crear condiciones para que needrestart procese nombres de archivos en el formato «comando|», cuya transmisión a la función Perl open() provocará la ejecución del comando. De hecho, la vulnerabilidad se manifiesta en el módulo Perl ScanDeps (CVE-2024-10224), pero es provocada por la transmisión de parámetros externos a este módulo sin la debida verificación.
El ataque puede llevarse a cabo iniciando un script de Perl con el símbolo «|» en el nombre, por ejemplo, «/home/test/perl|». Durante la ejecución de la función scan_deps() en needrestart, este archivo se abrirá mediante la función open(), que interpretará el símbolo «|» como una bandera para iniciar el programa «/home/test/perl» y usar el flujo de salida obtenido de este programa.
Fuente: opennet.ru
