-
Línea de tiempo de los eventos:
- 2024.01.19: El sitio web de XZ se movió a GitHub Pages por un nuevo mantenedor (jiaT75)
- 2024.02.15: Se agrega
build-to-host.m4a.gitignore - 2024.02.23: Se introducen dos "archivos de prueba" que contienen etapas de scripts maliciosos
- 2024.02.24: Se lanza XZ 5.6.0
- 2024.02.26: Commit en
CMakeLists.txtque sabotea la función de seguridad Landlock - 2024.03.04: La puerta trasera causa problemas con Valgrind
- 2024.03.09: Se actualizan dos "archivos de prueba", se modifican funciones CRC y se "corrige" el problema con Valgrind
- 2024.03.09: Se lanza XZ 5.6.1
- 2024.03.28: Se descubre el bug, se notifica a Debian y RedHat, y Debian revierte XZ
- 2024.03.29: Se publica un correo en la lista OSS-security, RedHat confirma que distribuyó XZ con puerta trasera
- 2024.03.30: Debian detiene las compilaciones e inicia el proceso de reconstrucción
- 2024.04.02: El desarrollador principal de XZ reconoce el incidente de la puerta trasera
-
Valores hash de las distribuciones de XZ que incluían la puerta trasera:
- xz-5.6.0: se proporcionan hashes MD5, SHA1 y SHA256
- xz-5.6.1: se proporcionan hashes MD5, SHA1 y SHA256
Análisis inicial de la infección
-
Etapa 1 - script
build-to-hostalterado:- Los archivos fuente de la versión parecían inicialmente inofensivos, pero al descargarse desde una URL controlada por el atacante incluían un archivo
build-to-host.m4que ejecutaba código malicioso - Este archivo
.m4se ejecuta durante la compilación y modifica y descomprime el primer archivo agregado a la carpeta de pruebas
- Los archivos fuente de la versión parecían inicialmente inofensivos, pero al descargarse desde una URL controlada por el atacante incluían un archivo
-
Etapa 2 - script de shell inyectado:
- El script malicioso inyectado por el archivo
.m4verifica si se está ejecutando dentro del proceso de compilación previsto en Linux - Usa el archivo
good-large_compressed.lzmapara ejecutar la siguiente etapa; aunque está comprimido normalmente, los datos descomprimidos contienen datos basura en su interior - Extrae 33,492 bytes con los comandos
head/taily desofusca aplicando una sustitución básica con el comandotr
- El script malicioso inyectado por el archivo
-
Etapa 3 - extracción de la puerta trasera:
- El script de shell de la última etapa realiza varias comprobaciones para verificar si se está ejecutando en el entorno esperado
- Extrae el propio código binario de la puerta trasera, oculto en otro offset del mismo archivo
good-large_compressed.lzma - Extrae el archivo con la herramienta XZ y descifra los datos binarios con una serie de llamadas a
headusando un algoritmo similar a RC4 - Extrae el archivo comprimido con XZ, elimina los bytes iniciales usando valores predefinidos y luego lo guarda como
liblzma_la-crc64-fast.o - Modifica la función
is_arch_extension_supporteddecrc_x86_clmul.hpara cambiar la llamada__get_cpuidpor_get_cpuid
Análisis de la puerta trasera binaria
-
Escenario de carga encubierta:
- XZ usa las funciones
lzma_crc32ylzma_crc64para el cálculo de CRC, y estas se almacenan en la tabla de símbolos ELF con tipo IFUNC - IFUNC se usa para decidir dinámicamente si debe usarse una versión optimizada
- La puerta trasera se almacena como un archivo objeto, y su objetivo principal es enlazarse durante la compilación con el ejecutable principal
- El archivo objeto incluye el símbolo
_get_cpuid; al quitar un guion bajo del código fuente original, cuando el código llama a_get_cpuiden realidad termina llamando a la versión maliciosa
- XZ usa las funciones
-
Análisis del código de la puerta trasera:
- El código inicial de la puerta trasera se invoca dos veces, y la actividad maliciosa real comienza cuando
lzma_crc64IFUNC llama a_get_cpuid - Encuentra la dirección GOT para localizar la posición del puntero
cpuidy lo reemplaza por el puntero de la función maliciosa principal - El objetivo principal es enganchar funciones específicas para poder monitorear todas las conexiones hacia el sistema infectado
- El código inicial de la puerta trasera se invoca dos veces, y la actividad maliciosa real comienza cuando
-
Comportamiento clave:
- Tiene como objetivos de hooking funciones de
libcryptocomoRSA_public_decrypt,EVP_PKEY_set1_RSAyRSA_get0_key - Verifica si el proceso actual cumple con los criterios de ejecución y confirma la existencia de un kill switch
- Usa una estructura Trie para realizar operaciones sobre cadenas
- Usa 3 o más rutinas de resolución de símbolos para encontrar la ubicación de estructuras ELF Symbol
- Logra el hooking de funciones abusando de la funcionalidad
rtdl-auditpara secuestrar las rutinas de resolución de símbolos
- Tiene como objetivos de hooking funciones de
Opinión de GN⁺
-
Este artículo muestra muy bien un caso de ataque altamente sofisticado en el que se inyectó malware en software de código abierto. Deja la lección de que las ventajas del open source también pueden ser explotadas en su contra.
-
Los ciberataques y las puertas traseras dirigidas a sistemas Linux son cada vez más sofisticados. En particular, los ataques a través de servidores SSH pueden convertirse en una amenaza de seguridad grave.
-
Por otro lado, también demuestra la capacidad de autocorrección del ecosistema open source. Al final, la puerta trasera fue descubierta por la comunidad y se respondió rápidamente. La transparencia es clave.
-
El uso de técnicas como estructuras Trie avanzadas, Symbol Resolver y hooking con
dl_auditmuestra la evolución técnica del malware para Linux. También hace falta poner especial atención a la seguridad de los sistemas Linux. -
Cuando una empresa adopta software de código abierto, no solo debe revisar las licencias, sino también validar la seguridad. Es indispensable comprobar si proviene de una fuente confiable y si existe monitoreo continuo del código.
1 comentarios
Opinión de Hacker News
Resumen:
ifuncy hacer commits de código que genera archivos de prueba