Nimbuspwn, una vulnerabilidad en networkd-dispatcher que permite ejecutar comandos como root
Los investigadores de seguridad de Microsoft dieron a conocer la noticia de que han identificado dos vulnerabilidades (CVE-2022-29799, CVE-2022-29800) en el servicio networkd-dispatcher con nombre en código Nimbuspwn que permiten a un usuario sin privilegios ejecutar comandos arbitrarios como root.
Networkd-dispatcher es utilizado por muchas distribuciones de Linux, incluido Ubuntu, que utiliza el proceso de fondo systemd-networkd para configurar los ajustes de red y realiza funciones similares a NetworkManager-dispatcher, es decir, se ocupa de la ejecución de scripts cuando cambia el estado de la conexión de red, por ejemplo, se utiliza para iniciar una VPN después de establecer la conexión de red principal.
Microsoft ha descubierto varias vulnerabilidades, denominadas colectivamente Nimbuspwn, que podrían permitir a un atacante elevar los privilegios a root en muchos puntos finales de escritorio de Linux. Las vulnerabilidades se pueden encadenar para obtener privilegios de raíz en los sistemas Linux, lo que permite a los atacantes implementar cargas útiles, como una puerta trasera raíz, y realizar otras acciones maliciosas a través de la ejecución arbitraria de código raíz. Además, las vulnerabilidades de Nimbuspwn podrían aprovecharse potencialmente como un vector para el acceso a la raíz por parte de amenazas más sofisticadas, como malware o ransomware, para lograr un mayor impacto en los dispositivos vulnerables.
Descubrimos las vulnerabilidades al escuchar mensajes en System Bus mientras realizamos revisiones de código y análisis dinámicos en servicios que se ejecutan como raíz, y notamos un patrón extraño en una unidad systemd llamada networkd-dispatcher.
El proceso en segundo plano asociado con networkd-dispatcher se ejecuta como root y escucha eventos a través del D-Bus. El servicio systemd-networkd envía información sobre eventos relacionados con el cambio de estado de las conexiones de red. El problema es que los usuarios sin privilegios pueden generar un evento de estado inexistente e iniciar la ejecución de su script, que se ejecutará como root.
Systemd-networkd está diseñado para ejecutar solo secuencias de comandos del controlador del sistema ubicadas en el directorio /etc/networkd-dispatcher y no reemplazable por el usuario, pero debido a una vulnerabilidad (CVE-2022-29799) era posible que el código de manejo de la ruta del archivo se apagara del directorio base de los límites y ejecutar scripts arbitrarios.
En particular, al formar la ruta del archivo al script, se utilizaron los valores OperationalState y AdministrationState transmitidos a través de D-Bus, en los que no se borraron los caracteres especiales. Un atacante podría generar su propio estado con los caracteres «../» en el nombre y redirigir la llamada networkd-dispatcher a otro directorio.
La segunda vulnerabilidad (CVE-2022-29800) está relacionada con una condición de carrera: entre la verificación de los parámetros del script (pertenecientes a root) y su ejecución, hubo un breve período de tiempo, suficiente para reemplazar el archivo y omitir la verificación del script propiedad del usuario root. Además, networkd-dispatcher no verificó los enlaces simbólicos, incluso al ejecutar scripts a través de la llamada subprocess.Popen, lo que simplificó enormemente la organización del ataque.
Se crea el directorio «/tmp/nimbuspwn» y se crea un enlace simbólico «/tmp/nimbuspwn/poc.d» que apunta al directorio «/sbin» que se usa para pasar una verificación de archivos ejecutables propiedad de root.
Para los archivos ejecutables de «/sbin», los archivos con el mismo nombre se crean en el directorio «/tmp/nimbuspwn», por ejemplo, para el archivo «/sbin/vgs», un archivo ejecutable «/tmp/nimbuspwn/vgs» se crea, propiedad de un usuario sin privilegios, en el que se pone el código que el atacante quiere ejecutar.
Se envía una señal D-Bus al proceso networkd-dispatcher con OperationalState establecido en «../../../tmp/nimbuspwn/poc». Para enviar una señal en el espacio de nombres «org.freedesktop.network1», se usó la capacidad de conectar sus controladores a systemd-networkd, por ejemplo, mediante manipulaciones con gpgv o epmd, o puede usar el hecho de que systemd-networkd no es ejecutándose de forma predeterminada (por ejemplo, en Linux mint).
Al recibir la señal, Networkd-dispatcher crea una lista de archivos ejecutables propiedad del usuario raíz y disponibles en el directorio «/etc/networkd-dispatcher/../../../tmp/nimbuspwn/poc.d», que en realidad se refiere a «/sbin».
En el momento en que se recibe la lista de archivos, pero aún no se ha ejecutado el script, el enlace simbólico se redirige de «/tmp/nimbuspwn/poc.d» a «/tmp/nimbuspwn» y networkd-dispatcher se ejecutará como raíz. script colocado por el atacante.
El problema se solucionó en el lanzamiento de networkd-dispatcher 2.2, aunque no hay información sobre la publicación de actualizaciones por distribuciones.
Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.