Las vulnerabilidades recientemente descubiertas por Microsoft facilitan la obtención de derechos de root en muchos sistemas de escritorio Linux. La más reciente elevación de fallo de privilegios sale a la luz en el código abierto OS.
Los sistemas operativos han sido reforzados para resistir los compromisos en los últimos años, la EoP (elevación de fallos de privilegios por sus siglas en inglés) se han convertido en un ingrediente crucial para hackeos más exitosos. Pueden ser explotados en conjunto con otras vulnerabilidades que por sí solas suelen considerarse menos graves, ya que las segundas dan lo que se denomina acceso local y las primeras escalan el acceso de súper usuario. A partir de ahí, los adversarios con acceso físico o derechos limitados al sistema pueden desplegar puertas traseras o ejecutar el código que deseen.
Nimbuspwn, como ha bautizado Microsoft a la amenaza EoP, son dos vulnerabilidades que residen en el networkd-dispatcher, un componente de muchas distribuciones de Linux que despacha los cambios de estado de la red y puede ejecutar varios scripts para responder a un nuevo estado. Cuando una máquina arranca, networkd-dispatcher se ejecuta como súper usuario.
Imagen original de Microsoft Los fallos, rastreados como CVE-2022-29799 y CVE-2022-29800 combinan amenazas que incluyen el cruce de directorios, la carrera de enlaces simbólicos y la condición de carrera de tiempo de uso (TOCTOU). Tras revisar el código fuente de Networkd -dispatcher, el investigador de Microsoft Jonathan Bar Or observó que un componente conocido como "_run_hooks_for_state" implementa la siguiente lógica:
Descubre la lista de scripts disponibles invocando el método "get_script_list”, que llama a un método separado "scripts_in_path" que pretende devolver todos los archivos almacenados en el directorio "/etc/networkd-dispatcher/.d".
Ordena la lista de scripts.
Ejecuta cada script con el proceso subprocess.Popen y suministra variables de entorno personalizadas.
Imagen original de Microsoft
Run_hooks_for_state deja a los sistemas Linux abiertos a la vulnerabilidad de cruce de directorios, designada como CVE-2022-29799, porque ninguna de las funciones que utiliza limpia adecuadamente los estados utilizados para construir la ruta de script correcta a partir de la entrada maliciosa. De este modo, los hackers pueden explotar la debilidad para salir del directorio base "/etc/networkd-dispatcher".
Run-hooks_for_state contiene otro fallo, CVE-2022-29800, que deja a los sistemas vulnerables a la condición de carrera TOCTOU, ya que hay un cierto tiempo entre que se descubren los scripts y se ejecutan.
Los adversarios pueden explotar esta última vulnerabilidad para sustituir los scripts que networkd-dispatcher cree que son propiedad del administrador por otros software maliciosos de su elección. Para asegurarse de que Linux ejecuta el script malicioso suministrado por el hacker en lugar del legítimo, el hacker planta múltiples scripts hasta que uno finalmente tiene éxito.
Un hacker con un acceso mínimo a un escritorio vulnerable puede encadenar los exploits para estas vulnerabilidades que dan acceso completo a la raíz. El flujo del exploit es el siguiente:
1.- Prepara un directorio "/tmp/nimbuspwn" y coloca un symlink "/tmp/nimbuspwn/poc.d" para que apunte a "/sbin". El directorio "/sbin" fue elegido específicamente porque tiene muchos ejecutables propiedad de root que no se bloquean si se ejecutan sin argumentos adicionales. Esto abusará del problema de carrera de enlaces simbólicos que mencionamos antes.
2.- Por cada nombre de archivo ejecutable bajo "/sbin" propiedad de root, plantar el mismo nombre de archivo bajo "/tmp/nimbuspwn". Por ejemplo, si "/sbin/vgs" es ejecutable y pertenece a root, plantar un archivo ejecutable "/tmp/nimbuspwn/vgs" con el payload deseado. Esto ayudará al atacante a ganar la condición de carrera impuesta por la vulnerabilidad TOCTOU.
3.- Envía una señal con el OperationalState "../../../tmp/nimbuspwn/poc". Esto abusa de la vulnerabilidad de cruce de directorios y escapa del directorio del script.
4.- El gestor de señales de networkd-dispatcher entra en acción y construye la lista de scripts a partir del directorio "/etc/networkd-dispatcher/../../tmp/nimbuspwn/poc.d", que es en realidad el symlink ("/tmp/nimbuspwn/poc.d"), que apunta a "/sbin". Por lo tanto, crea una lista compuesta por muchos ejecutables propiedad de root.
5.- Cambia rápidamente el symlink "/tmp/nimbuspwn/poc.d" para que apunte a "/tmp/nimbuspwn". Esto abusa de la vulnerabilidad de la condición de carrera TOCTOU: la ruta del script cambia sin que networkd-dispatcher se dé cuenta.
6.- El dispatcher comienza a ejecutar archivos que inicialmente estaban en "/sbin" pero que en realidad están en el directorio "/tmp/nimbuspwn". Como el dispatcher "cree" que esos archivos son propiedad de root, los ejecuta ciegamente con subprocess.Popen como root. Por lo tanto, nuestro atacante ha explotado con éxito la vulnerabilidad.
Aquí los pasos
Imagen original de Microsoft
Imagen original de Microsoft
Para obtener un acceso de súper administrador persistente, el investigador utilizó el flujo de exploits para crear una puerta trasera. El proceso para esto es:
1.- Copia /bin/sh a /tmp/sh.
2.- Convierte el nuevo /tmp/sh en un binario Set-UID (SUID)
3.- Ejecuta /tmp/sh -p. La bandera "-p" es necesaria ya que los “shells” modernos eliminan privilegios por diseño.
Imagen original de Microsoft
El exploit de prueba de concepto sólo funciona cuando puede utilizar el nombre de bus "org.freedesktop.network1". El investigador encontró varios entornos en los que esto ocurre, incluyendo Linux Mint, en el que el systemd-networkd por defecto no posee el nombre del bus org.freedodesktop.network1 en el arranque.
El investigador también encontró varios procesos que se ejecutan como el usuario systemd-network, al que se le permite utilizar el nombre del bus requerido para ejecutar código arbitrario desde ubicaciones escribibles en el mundo. Los procesos vulnerables incluyen varios plugins gpgv, que se lanzan cuando apt-get instala o actualiza y el Erlang Port Mapper Daemon, que permite ejecutar código arbitrario en algunos escenarios.
La vulnerabilidad ha sido parcheada en el networkd-dispatcher, aunque no estaba claro cuándo o en qué versión y los intentos de contactar con el desarrollador no tuvieron éxito inmediatamente. Los usuarios de versiones vulnerables de Linux deberían parchear sus sistemas lo antes posible.