Desde Linux Darkcrizt  

Detectaron una vulnerabilidad en firejail que permitía el acceso root al sistema

Hace poco dieron a conocer la noticia de que fue identificada una vulnerabilidad (ya catalogada bajo CVE-2022-31214) en la herramienta de sandboxing de la aplicación Firejail, se detalla que el fallo detectado podría permitir que un usuario local se convierta en root en el sistema host.

Firejail utiliza el mecanismo de espacios de nombres, AppArmor y el filtrado de llamadas del sistema (seccomp-bpf) en Linux para el aislamiento, pero requiere privilegios elevados para configurar un lanzamiento aislado, que obtiene al vincularse a la utilidad de indicador raíz suid o ejecutar con sudo.

La vulnerabilidad se debe a un error en la lógica de la opción «–join=<PID>», diseñada para conectarse a un entorno aislado que ya se está ejecutando (similar al comando de inicio de sesión para un entorno sandbox) con la definición del entorno por el ID del proceso que se ejecuta en él. En la fase previa al lanzamiento, firejail detecta los privilegios del proceso especificado y los aplica al nuevo proceso que se une al entorno con la opción «–join».

Antes de conectarse, verifica si el proceso especificado se está ejecutando en el entorno firejail. Esta verificación evalúa la existencia del archivo /run/firejail/mnt/join. Para aprovechar la vulnerabilidad, un atacante puede simular un entorno firejail ficticio no aislado utilizando el espacio de nombres de montaje y luego conectarse a él mediante la opción «–join».

Si la configuración no habilita el modo de prohibir la obtención de privilegios adicionales en nuevos procesos (prctl NO_NEW_PRIVS), firejail conectará al usuario a un entorno ficticio e intentará aplicar la configuración del espacio de nombres de usuario de los identificadores de usuario (espacio de nombres de usuario) del proceso init (PID 1).

La mayor parte de la lógica detrás de la función de unión se encuentra en el código fuente del archivo `src/firejail/join.c`. Las secciones críticas de código se ejecutan con privilegios elevados (UID efectivo 0). El ID del proceso pasado como comando el argumento de línea se inspecciona para determinar si es un recipiente y determinar algunas de sus propiedades que se aplica igualmente al proceso de nuevo ingreso.

El criterio principal para decidir si unirse al proceso de destino tiene éxito es la presencia de un archivo en el espacio de nombres de montaje del objetivo, proceso encontrado en /run/firejail/mnt/join. Esta verificación se realiza en la función `is_ready_for_join()`. El archivo se abre usando las banderas `O_RDONLY|O_CLOEXEC` y el resultado `fstat()` de seguimiento deben cumplir con los siguientes requisitos:

– el archivo debe ser un archivo normal.
– el archivo debe ser propiedad del ID de usuario 0 (como se ve desde el usuario inicial
espacio de nombres).
– el archivo debe tener un tamaño de 1 byte.

Como resultado, el proceso conectado a través de «firejail –join» terminará en el espacio de nombres de ID de usuario original del usuario con privilegios sin cambios, pero en un espacio de punto de montaje diferente, completamente controlado por el atacante.

El shell «unido» resultante ahora vivirá en el usuario inicial
espacio de nombres, manteniendo aún los privilegios de usuario normales originales, sin embargo el espacio de nombres de montaje será el que controle el atacante. Ya que
la configuración nonewprivs no se ha aplicado, el atacante ahora puede
ejecutar programas setuid-root dentro de este espacio de nombres de montaje

En particular, un atacante puede ejecutar programas setuid-root en el espacio del punto de montaje que creó, lo que permite, por ejemplo, cambiar la configuración de /etc/sudoers o los parámetros PAM en su jerarquía de archivos y obtener la capacidad de ejecutar comandos como root usando el sudo o sus utilidades.

Por último, cabe mencionar que se ha desarrollado un exploit funcional, probado en las versiones actuales de openSUSE, Debian, Arch, Gentoo y Fedora con la utilidad firejail instalada.

El problema se solucionó en la versión firejail 0.9.70. Como solución de seguridad, puede establecer la configuración (/etc/firejail/firejail.config) para «no unirse» y «forzar-nonewprivs sí».

Finalmente si estás interesado en poder conocer más al respecto, puedes consultar los detalles en el siguiente enlace.

Leave A Comment

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.