Puerta trasera de XZ Utils: todo lo que necesita saber y lo que puede hacer
Resumen ejecutivo
CVE-2024-3094 es una vulnerabilidad descubierta en la biblioteca de código abierto XZ Utils que procede de código malicioso insertado en la biblioteca por uno de sus mantenedores.
Originalmente se presentó como una puerta trasera de omisión de autenticación SSH, pero un análisis posterior evidenció que la puerta trasera en realidad activa la ejecución remota de código (RCE).
El atacante inició su contribución al proyecto XZ hace casi dos años y de forma progresiva fue adquiriendo credibilidad hasta que se le confiaron responsabilidades de mantenimiento. Estas operaciones a largo plazo suelen ser el ámbito de atacantes patrocinados por estados, pero en la actualidad no existe una atribución específica.
Dado que la puerta trasera afecta a las últimas versiones de XZ Utils, se recomienda cambiar a una versión anterior que no esté comprometida. En esta entrada de blog, ofrecemos otras posibles mitigaciones para limitar el radio de alcance del ataque.
Historia
XZ Utils, y su biblioteca subyacente liblzma, son proyectos de código abierto que implementan la compresión y descompresión lzma. Se incluyen en numerosas distribuciones de Linux listas para usar, son muy populares entre los desarrolladores y se utilizan ampliamente en todo el ecosistema de Linux.
Hace casi dos años, un desarrollador con el nombre de Jia Tan se unió al proyecto y comenzó a abrir solicitudes de incorporación de cambios para varias correcciones de errores o mejoras. Hasta ahora, nada es fuera de lo normal; así es como funcionan las cosas en el mundo del código abierto. Finalmente, después de generar confianza y credibilidad, Jia Tan comenzó a recibir permisos para el repositorio: al principio, permisos de cambio y, por último, derechos de gestor de versión.
Parece que como parte del esfuerzo para obtener estos permisos, Jia Tan utilizó una forma interesante de ingeniería social: utilizó cuentas falsas para enviar innumerables solicitudes y quejas de funciones sobre errores para presionar al mantenedor original, causando finalmente la necesidad de añadir otro mantenedor al repositorio.
Después de realizar contribuciones en el código durante aproximadamente dos años, en 2023 Jia Tan introdujo algunos cambios en XZ que se incluyeron como parte de la versión 5.6.0. Entre estos cambios estaba una puerta trasera sofisticada.
La puerta trasera
La puerta trasera es bastante compleja. Un principiante no la encontrará en el repositorio GitHub de XZ (que está actualmente desactivado, pero eso es irrelevante). En lo que parece un intento de evitar la detección, en lugar de enviar las partes de la puerta trasera al repositorio de git público, el mantenedor malicioso solo las incluía en las versiones tarball del código de origen. Esto provocó que las partes de la puerta trasera permanecieran relativamente ocultas, al tiempo que todavía se utilizaban durante el proceso de desarrollo de proyectos dependientes.
La puerta trasera se compone de numerosas partes introducidas a través de varios cambios:
El uso de los IFUNC en el proceso de desarrollo, que se utilizarán para secuestrar las funciones de resolución de símbolos por parte del malware
La inclusión de un objeto compartido oculto en archivos de prueba
La ejecución de un conjunto de scripts durante el proceso de desarrollo de la biblioteca que extrae el objeto compartido (no incluido en el repositorio, solo en las versiones, pero agregado a .gitignore)
La desactivación de la función landlockingde seguridad para restringir los privilegios del proceso
La cadena de ejecución también consta de varias etapas:
El script malicioso build-to-host.m4 se ejecuta durante el proceso de desarrollo de la biblioteca y descodifica el archivo de "prueba" bad-3-corrupt_lzma2.xz en un script Bash
A continuación, el script Bash realiza un proceso de descodificación más complejo en otro archivo de "prueba", good-large_compressed.lzma, descodificándolo en otro script
Después, ese script extrae un objeto compartido liblzma_la-crc64-fast.o, el cual se añade al proceso de compilación de liblzma
Este proceso es ciertamente difícil de seguir. Recomendamos la infografía de Thomas Roccia para obtener una excelente referencia visual y análisis en profundidad.
El propio objeto compartido se compila en liblzma y reemplaza el proceso de resolución de nombres de funciones habitual. Durante (cualquier) carga de procesos, los nombres de funciones se resuelven en punteros reales a la memoria de procesos, apuntando al código binario. La biblioteca maliciosa interfiere con el proceso de resolución de funciones, por lo que podría reemplazar el puntero de función para la función de OpenSSH RSA_public_decrypt (Figura 1).
A continuación, apunta esa función hacia una maliciosa propio que, según la investigación publicada por Filippo Valsorda, extrae un comando del certificado del cliente de autenticación (después de verificar que es el atacante) y lo transfiere a la función system() para su ejecución, logrando así ejecución remota de código (RCE) previa a la autenticación.
Para obtener una explicación más detallada de las partes de la puerta trasera, puede leer la publicación de Andres Freund sobre openwall.
Posible impacto
Actualmente, parece que la puerta trasera se agrega al daemon de SSH en el equipo vulnerable, lo que permite a un atacante remoto ejecutar código arbitrario. Esto significa que cualquier equipo con el paquete vulnerable que expone SSH en Internet es potencialmente vulnerable.
Esta puerta trasera casi se convirtió en uno de los facilitadores de intrusión más relevantes que ha existido, que habría eclipsado a la puerta trasera de SolarWinds. Los atacantes casi podían obtener acceso inmediato a cualquier equipo Linux que ejecutara una distribución infectada, como Fedora, Ubuntu y Debian. Casi.
Solo había una cosa que impidió que eso sucediera: Andres Freund. Después de investigar un problema de latencia de 500 ms que se introdujo tras una actualización de software, Andres pudo rastrear el problema hasta el paquete XZ y, en última instancia, identificar la puerta trasera.
Evidentemente, esto suscita muchas preocupaciones. Tuvimos suerte. Si un ingeniero curioso no hubiera detectado esta puerta trasera, ¿cuánto tiempo habría permanecido activa?
Y lo que es más preocupante: ¿Y si esto ha ocurrido antes?
Detección y mitigación
Control de versiones
El procedimiento recomendado por la Agencia de Seguridad de Infraestructura y Ciberseguridad (CISA) es cambiar a una versión anterior no comprometida, como la 5.4.6.
Para saber qué versión de XZ Utils o liblzma tiene actualmente en sus sistemas, puede ejecutar la siguiente consulta en Insight de Akamai Guardicore Segmentation, que buscará instancias cargadas de la biblioteca liblzma (Figura 2).
SELECT DISTINCT path AS liblzma_path
FROM process_memory_map
WHERE LOWER(path) LIKE "%liblzma%"
Como alternativa, puede ejecutar la siguiente consulta para buscar el administrador de paquetes de la versión instalada.
SELECT name AS vulnerable_item, 'DEB' AS type, version
FROM deb_packages
WHERE (LOWER(name) LIKE '%xz-utils%' OR LOWER(name) LIKE '%liblzma%')
UNION
SELECT name AS vulnerable_item, 'RPM' AS type, version
FROM rpm_packages
WHERE (LOWER(name) LIKE '%xz-utils%' OR LOWER(name) LIKE '%liblzma%')
Lógicamente, también puede filtrar para mostrar solo los activos vulnerables.
SELECT path AS vulnerable_item, "Loaded Library" AS type, '5.6%' AS version
FROM process_memory_map
WHERE LOWER(path) LIKE "%liblzma%5.6%"
SELECT name AS vulnerable_item, 'DEB' AS type, version
FROM deb_packages
WHERE (LOWER(name) LIKE '%xz-utils%' OR LOWER(name) LIKE '%liblzma%')
AND version LIKE '5.6.%'
UNION
SELECT name AS vulnerable_item, 'RPM' AS type, version
FROM rpm_packages
WHERE (LOWER(name) LIKE '%xz-utils%' OR LOWER(name) LIKE '%liblzma%')
AND version LIKE '5.6.%'
Búsqueda de amenazas
Dado que la puerta trasera de hecho ejecuta comandos del sistema, y no solo permite la autenticación, podría ser posible detectar este comportamiento mediante el seguimiento de procesos.
Normalmente, durante el inicio de sesión, se crea un nuevo shell para el usuario de inicio de sesión y se ejecuta el proceso del shell predeterminado (como Bash). Sin embargo, con esta puerta trasera, el comando malicioso lo ejecuta en realidad el proceso daemon SSH, sshd, lo cual podría desencadenar una anomalía.
Nuestro servicio de búsqueda de amenazas, Akamai Hunt, cuenta con métodos para detectar dichas anomalías; por ejemplo, Realizando un seguimiento continuo de una referencia de actividad del proceso y sus procesos secundarios.
Interruptor de desactivación
Según algunos análisis de la puerta trasera, esta parece tener un interruptor de desactivación de variable de entorno. La adición de la clave yolAbejyiejuvnup=Evjtgvsh5okmkAvj a las variables de entorno del sistema puede desactivar la puerta trasera.