
Laboratorio educativo que replica el backdoor de XZ Utils (CVE-2024-3094) con un par de claves Ed448 personalizado. Incluye un liblzma parcheado, servicio systemd y cliente de explotación para investigación de seguridad autorizada.
Solo para fines educativos e investigaciones de seguridad autorizadas.
CVE-2024-3094 es una puerta trasera introducida en las versiones 5.6.0 y 5.6.1 de XZ Utils (liblzma), descubierta el 29 de marzo de 2024 por el investigador de seguridad Andres Freund. Se le asignó una puntuación CVSS de 10.0 (Crítica).
Este es un ataque a la cadena de suministro llevado a cabo durante más de dos años por un actor de amenazas conocido como "Jia Tan" (JiaT75), quien generó confianza dentro del proyecto hasta obtener el estatus de co-mantenedor e introdujo la puerta trasera directamente en los tarballs de distribución.
La puerta trasera opera de la siguiente manera:
liblzma.so maliciosa engancha la función RSA_public_decrypt() en OpenSSH mediante el mecanismo IFUNC de glibc, interceptando el proceso de autenticación SSH.system() con privilegios de sshd (root).Este laboratorio replica el mecanismo de la puerta trasera utilizando claves Ed448 personalizadas en lugar de las claves del actor original (que nunca se hicieron públicas).
En los sistemas reales afectados no había chroot. La puerta trasera operaba directamente sobre el sshd del sistema, que cargaba la liblzma.so maliciosa como cualquier otra biblioteca compartida — completamente transparente para el sistema y sus administradores.
En este laboratorio usamos chroot únicamente por una razón práctica: necesitamos ejecutar un sshd con una versión específica de liblzma.so sin reemplazar las bibliotecas del sistema anfitrión. Esta es una decisión de diseño para el entorno de investigación, no un reflejo de cómo operaba la puerta trasera en producción.
| Componente | Descripción |
|---|---|
env_fs/ | Sistema de archivos mínimo de Ubuntu 22.04 usado como chroot |
env_fs/usr/lib/x86_64-linux-gnu/liblzma.so.5 | liblzma 5.6.1 parcheada con clave Ed448 personalizada |
/etc/systemd/system/xzback.service | Servicio systemd que lanza sshd vulnerable en el puerto 2024 |
/xzbot/xzbot | Cliente de explotación compilado desde el código fuente |
La puerta trasera original requiere condiciones muy específicas que no existen automáticamente en un entorno de laboratorio. Fueron necesarias las siguientes modificaciones:
La liblzma.so.5 incluida en el repositorio original de MagpieRYL usa una clave Ed448 desconocida que es inconsistente con el binario xzbot incluido. La liblzma.so.5.6.1 original y auténtica se descargó de la instantánea de Debian (sha256 verificado) y se parcheó usando patch.py de amlweems/xzbot con seed=0:
original sha256: 605861f833fc181c7cdcabd5577ddb8989bea332648a8f498b4eef89b8f85ad4
patched sha256: ea7206ab4b0c3479ff1b478c8803adc9e7aeba243254a9f601b626ef8aa80e3d
patched offset: 0x24470
La clave pública Ed448 del actor original fue reemplazada por:
5b 3a fe 03 87 8a 49 b2 82 32 d4 f1 a4 42 ae bd
e1 09 f8 07 ac ef 7d fd 9a 7f 65 b9 62 fe 52 d6
54 73 12 ca ce cf f0 43 37 50 8f 9d 25 29 a8 f1
66 91 69 b2 1c 32 c4 80 00
El servicio original usa Type=notify, lo que requiere que sshd envíe una notificación de inicio a systemd. El sshd dentro del chroot no la envía, causando tiempos de espera. Se cambió a Type=simple.
sshd requiere /run/sshd para la separación de privilegios. Este directorio no existe en el chroot y se borra en cada reinicio porque run/ es un tmpfs. Se solucionó con un ExecStartPre que lo regenera automáticamente antes de cada inicio del servicio.
./xzbot -addr 127.0.0.1:2024 -cmd 'echo pwned > /tmp/result'
cat /home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/result
./xzbot -addr <TARGET_IP>:2024 -cmd 'echo pwned > /tmp/result'
El comando se ejecuta dentro del chroot, por lo que cualquier archivo creado en /tmp/ dentro del contexto de la puerta trasera se almacena en:
/home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/
Es decir, si el comando es echo pwned > /tmp/result, el archivo se encontrará en:
/home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/result
Para localizar cualquier archivo generado por la explotación:
find /home/user/CVE-2024-3094-backdoor-env-container/env_fs/tmp/ -type f
El mensaje ssh: handshake failed: EOF es el comportamiento esperado y correcto. La puerta trasera ejecuta el comando y cierra la conexión sin establecer una sesión SSH. No indica un fallo.
Este laboratorio usa un par de claves criptográficas personalizadas (seed=0). La liblzma.so parcheada solo acepta payloads firmados con la clave privada correspondiente, que es la utilizada por el xzbot compilado en este entorno. Cualquier otro cliente recibirá EOF sin ejecución.
Esta herramienta se proporciona solo para fines educativos y pruebas de seguridad autorizadas. El uso no autorizado contra sistemas que no posea o para los que no tenga permiso explícito por escrito para realizar pruebas es ilegal. El autor no se responsabiliza por cualquier uso indebido.