Avanzadohistoriasupply-chainbackdooropen-sourcesocial-engineeringLinuxSSH

XZ Utils Backdoor: El Ataque Más Sofisticado a Open Source (2024)

En marzo de 2024, Andres Freund descubrió que XZ Utils, una utilidad de compresión presente en casi todas las distribuciones Linux, contenía un backdoor inyectado por un atacante que había pasado más de dos años ganándose la confianza de los mantenedores del proyecto. CVE-2024-3094 (CVSS 10.0) estuvo a días de comprometer millones de servidores SSH.

MalwareIntel Research··15 min lectura·3 técnicas ATT&CK
Serie: Historia del Malware — Parte 24

29 de marzo de 2024: 500 milisegundos que salvaron Internet

La mañana del 29 de marzo de 2024, Andres Freund publicó un mensaje en la lista de correo de seguridad de Openwall con un asunto que helaba la sangre: "backdoor in upstream xz/liblzma leading to ssh server compromise". Freund, ingeniero de Microsoft y desarrollador de PostgreSQL, había descubierto que XZ Utils, una de las utilidades de compresión más fundamentales del ecosistema Linux, contenía un backdoor que permitía ejecución remota de código a través de OpenSSH.

El descubrimiento fue accidental. Freund estaba realizando benchmarks de rendimiento de PostgreSQL en su sistema Debian Sid (la rama inestable de Debian) cuando notó que las conexiones SSH eran inexplicablemente lentas: 500 milisegundos en lugar de los 100 habituales. Investigando la causa de ese medio segundo adicional, desenmarañó lo que la comunidad de seguridad pronto calificaría como el ataque de supply chain más sofisticado jamás dirigido contra software open source.

La vulnerabilidad recibió el identificador CVE-2024-3094 y una puntuación CVSS de 10.0, la máxima posible. Pero las cifras técnicas no capturaban lo verdaderamente alarmante: el atacante había dedicado más de dos años a ganarse la confianza del proyecto, manipulando socialmente al mantenedor original y construyendo una identidad falsa con un historial de contribuciones legítimas.

XZ Utils: la infraestructura invisible

Qué es XZ Utils y por qué importa

XZ Utils es un conjunto de herramientas de compresión y descompresión de datos que incluye los comandos xz, unxz, xzcat y la librería liblzma. Utiliza el algoritmo de compresión LZMA2, que ofrece ratios de compresión superiores a gzip o bzip2.

XZ Utils está presente en prácticamente todas las distribuciones Linux. Se utiliza para comprimir paquetes de software, logs del sistema, backups y ficheros de datos. La librería liblzma es una dependencia de múltiples componentes del sistema operativo, y en muchas distribuciones Linux, es enlazada indirectamente por OpenSSH a través de systemd.

Esta cadena de dependencias (OpenSSH enlaza systemd, que enlaza liblzma) fue la que el atacante explotó para insertar un backdoor en el servidor SSH a través de una librería de compresión. Un componente aparentemente inocuo se convirtió en la puerta de entrada a millones de servidores.

El mantenedor solitario

XZ Utils era mantenido fundamentalmente por una sola persona: Lasse Collin, un desarrollador finlandés que había creado el formato XZ y mantenido el proyecto durante más de una década. Como muchos mantenedores de proyectos open source críticos, Collin trabajaba en el proyecto de forma voluntaria, sin compensación directa de las empresas que dependían masivamente de su trabajo.

En 2022, Collin comunicó públicamente que estaba lidiando con problemas de salud mental y que no podía mantener el ritmo de desarrollo que la comunidad demandaba. Este contexto personal fue explotado directamente por el atacante.

Jia Tan: anatomía de una operación de dos años

2021: construcción de la identidad

La cuenta de GitHub "JiaT75" (Jia Tan) apareció en 2021. Las primeras contribuciones fueron a proyectos periféricos, incluyendo libarchive y otros componentes del ecosistema de compresión, construyendo un historial de actividad legítimo. En octubre de 2021, Jia Tan envió su primer parche a XZ Utils: un cambio pequeño y útil que fue aceptado por Collin.

Durante los meses siguientes, Jia Tan continuó enviando parches de calidad. Cada contribución era correcta, bien documentada y resolvía problemas reales del proyecto. Ningún parche contenía código malicioso en esta fase. El objetivo era exclusivamente construir confianza.

2022: presión social coordinada y escalada de privilegios

A mediados de 2022, comenzaron a aparecer mensajes en la lista de correo de XZ Utils de usuarios aparentemente no relacionados que criticaban la lentitud del mantenimiento del proyecto y sugerían que se añadiera un co-mantenedor. Investigaciones posteriores sugieren que al menos algunas de estas cuentas eran sockpuppets (identidades falsas) operadas por el mismo equipo detrás de Jia Tan.

Un mensaje especialmente revelador, enviado por una cuenta llamada "Jigar Kumar", presionaba directamente a Lasse Collin: "Progress will not happen until there is new maintainer. [...] I am mass mass mass disappointed with you." Otro sockpuppet, "Dennis Ens", reportaba bugs legítimos con un tono de urgencia que reforzaba la narrativa de un proyecto abandonado que necesitaba más manos.

Los mensajes seguían un patrón de presión social calculado:

  1. Reportar bugs legítimos y pedir respuesta rápida
  2. Expresar frustración por la falta de actualizaciones
  3. Sugerir explícitamente que Jia Tan debería tener más responsabilidad
  4. Elogiar las contribuciones de Jia Tan como evidencia de competencia

Lasse Collin, ya sobrepasado por la carga de trabajo y sus problemas de salud, comenzó a delegar responsabilidades a Jia Tan. Para finales de 2022, Jia Tan tenía permisos de commit directo al repositorio. En 2023 obtuvo permisos de release, lo que le permitía crear tarballs oficiales de distribución.

2023: preparación del terreno técnico

En junio de 2023, Jia Tan introdujo cambios aparentemente legítimos que resultaron ser componentes esenciales del futuro backdoor. El más significativo fue la introducción de resolvers IFUNC (Indirect Function) para las funciones crc32_resolve y crc64_resolve. IFUNC es un mecanismo de glibc que permite resolver símbolos de función en tiempo de carga, extremadamente temprano en el proceso de inicialización del programa.

Estos resolvers IFUNC eran código legítimo en el contexto de optimización de rendimiento, pero proporcionaban un mecanismo para ejecutar código durante la carga de la librería, antes de que la mayoría de las protecciones del sistema estuvieran activas. Nadie cuestionó el cambio porque era técnicamente justificable.

Jia Tan también añadió ficheros de test binarios al repositorio que parecían ser archivos comprimidos corruptos para testear el manejo de errores. En realidad, contenían el payload cifrado del backdoor, oculto entre datos aparentemente aleatorios.

Febrero 2024: inyección del backdoor

En febrero de 2024, Jia Tan modificó el fichero build-to-host.m4 en el tarball de distribución (pero no en el repositorio Git) para incluir un script que, durante el proceso de compilación, extraía el payload malicioso de los ficheros de test y lo inyectaba en la librería compilada.

Las versiones 5.6.0 (24 de febrero de 2024) y 5.6.1 (9 de marzo de 2024) de XZ Utils contenían el backdoor completo. Jia Tan incluso se aseguró de que la versión 5.6.1 corrigiera un error de rendimiento que causaba latencia excesiva en la versión 5.6.0. Irónicamente, esa latencia residual en la 5.6.1 fue lo que permitió el descubrimiento.

Anatomía técnica del backdoor

Condiciones de activación

El backdoor estaba diseñado para activarse solo en condiciones muy específicas, minimizando la superficie de detección:

CondiciónPropósito
Arquitectura x86-64Limitar a servidores (excluir ARM, dispositivos embebidos)
Compilador GCC con glibcExcluir musl libc (Alpine Linux), clang (macOS)
Empaquetado con dpkg o RPMSolo distribuciones Linux reales
Enlazado por sshd vía systemdSolo sistemas donde OpenSSH usa liblzma
No en entorno de depuraciónDetectar y evitar análisis dinámico

Esta combinación de condiciones significaba que el backdoor solo se activaba en distribuciones Linux mainstream (Debian, Ubuntu, Fedora, Red Hat Enterprise Linux) cuando se compilaba como paquete oficial. Compilar desde el repositorio Git, compilar en entornos de desarrollo o usar distribuciones como Alpine Linux no activaba el código malicioso.

Mecanismo técnico del backdoor

El flujo técnico del backdoor era el siguiente:

  1. Durante la compilación, el script en build-to-host.m4 extraía un objeto binario de los ficheros de test bad-3-corrupt_lzma2.xz y good-large_compressed.lzma
  2. Este objeto contenía código que reemplazaba, mediante el resolver IFUNC previamente instalado, la función RSA_public_decrypt de OpenSSL en el contexto del proceso sshd
  3. La función reemplazada verificaba si el certificado presentado durante la autenticación SSH contenía un payload firmado con una clave Ed448 específica (una variante de curva elíptica de alta seguridad)
  4. Si la firma era válida, el payload contenido en el certificado se ejecutaba como código con los privilegios del proceso sshd (normalmente root)
Componente técnicoDetalle
Tipo de backdoorEjecución remota de código pre-autenticación
Mecanismo de hookIFUNC resolver reemplaza RSA_public_decrypt
Clave de activaciónClave privada Ed448 (solo el atacante la posee)
PayloadContenido en el campo de certificado de la conexión SSH
PrivilegiosEjecución como root (privilegios de sshd)
DetecciónIncremento de ~400ms en la autenticación SSH

El uso de Ed448 en lugar de las más comunes Ed25519 o RSA era una decisión deliberada: proporcionaba autenticación fuerte del atacante (nadie más podía activar el backdoor sin la clave privada) y era lo suficientemente inusual como para no ser detectada por herramientas que buscaban patrones criptográficos estándar.

La sofisticación del ocultamiento

El nivel de sofisticación del ocultamiento fue excepcional, incluso comparado con operaciones de estado-nación documentadas como SolarWinds:

El código malicioso no estaba en Git. El backdoor existía solo en los tarballs de distribución (los ficheros .tar.gz que las distribuciones Linux descargan para compilar paquetes). El repositorio Git no contenía el script malicioso en build-to-host.m4, lo que significaba que cualquier revisión del código en GitHub no detectaría el problema. Esta divergencia entre repositorio y tarball era el escondite perfecto.

Los payloads estaban en ficheros de test. Los datos binarios maliciosos estaban embebidos en ficheros de test que parecían archivos comprimidos corruptos usados para testing de manejo de errores. Nadie revisa los ficheros de test binarios en busca de malware. Es una de esas asunciones que la industria daba por sentado.

El script de inyección parecía normal. La modificación de build-to-host.m4 podía pasar como un ajuste legítimo del sistema de compilación autotools (m4/autoconf), un sistema notoriamente opaco y difícil de auditar.

Condiciones de activación estrictas. Al activarse solo en distribuciones Linux reales compiladas con herramientas específicas, el backdoor evitaba entornos de análisis, sistemas de CI/CD y compilaciones de desarrollo.

Código ofuscado en múltiples capas. El payload pasaba por varias etapas de descompresión y descifrado antes de ejecutarse, complicando el análisis estático.

El descubrimiento: un hallazgo accidental

La observación de Andres Freund

Andres Freund no estaba buscando malware. Estaba haciendo benchmarks de rendimiento de PostgreSQL y necesitaba que su sistema fuera predecible. Las conexiones SSH lentas interferían con sus pruebas automatizadas.

Al investigar, encontró que el proceso sshd consumía significativamente más CPU de lo esperado durante la autenticación. Ejecutó Valgrind (una herramienta de depuración de memoria) sobre sshd y encontró errores que apuntaban a liblzma. Examinando el código fuente y los binarios compilados de liblzma, descubrió discrepancias entre el código en el repositorio Git y el código que realmente se compilaba desde el tarball.

Freund describió posteriormente su proceso de investigación como una cadena de "esto es raro, voy a seguir tirando del hilo". No fue una auditoría de seguridad formal. Fue curiosidad técnica ante una anomalía de rendimiento.

El 29 de marzo de 2024, publicó su hallazgo en la lista de correo de Openwall, desencadenando una respuesta inmediata de la comunidad de seguridad.

Respuesta de la comunidad y la industria

29 de marzo: Freund publica el descubrimiento. Las distribuciones Linux afectadas (principalmente Fedora 40/Rawhide, Debian testing/sid y openSUSE Tumbleweed) comienzan a revertir XZ Utils a versiones anteriores en cuestión de horas.

30 de marzo: CISA emite una alerta oficial. GitHub suspende las cuentas de JiaT75 y del repositorio xz del Tukaani Project. Red Hat emite un aviso de emergencia para Fedora. Debian revierte a la versión 5.4.5 en todas sus ramas afectadas.

1 de abril: Se publica CVE-2024-3094 con CVSS 10.0.

Las distribuciones estables (Debian stable, Ubuntu LTS, RHEL, SLES) no fueron afectadas porque las versiones comprometidas (5.6.0 y 5.6.1) solo habían llegado a ramas de desarrollo y testing. Las políticas conservadoras de actualización de las distribuciones estables, a menudo criticadas por su lentitud, fueron en este caso la línea de defensa que protegió a millones de servidores de producción.

¿Cuánto faltaba para el desastre?

Las versiones comprometidas estaban a semanas de ser incluidas en releases estables de Debian y Fedora. Si Freund no hubiera notado esos 500 milisegundos de latencia, el backdoor habría llegado a millones de servidores de producción.

La comunidad de seguridad expresó una mezcla de alivio y alarma: alivio por la detección a tiempo, alarma por lo cerca que estuvo el desastre y por lo que podría haber pasado si el backdoor hubiera sido más eficiente y no hubiera causado esa latencia detectable. Un backdoor mejor optimizado habría sido invisible.

Investigación posterior: ¿quién era Jia Tan?

Lo que se sabe

La identidad real detrás de Jia Tan nunca fue revelada. La investigación reveló:

  1. Patrón de actividad: Los commits de Jia Tan se concentraban en franjas horarias consistentes con la zona horaria UTC+8 (China, Singapur, partes de Rusia oriental), pero los investigadores señalaron que esto podía ser deliberadamente engañoso. Los horarios de commit pueden manipularse trivialmente
  2. Sofisticación de la operación: El nivel de paciencia (más de dos años), la ingeniería social coordinada con sockpuppets, el conocimiento profundo de sistemas de compilación Linux y la criptografía avanzada del backdoor apuntaban a una operación respaldada por un estado-nación
  3. Múltiples identidades: Se identificaron varias cuentas que interactuaban con el proyecto de forma coordinada (Jigar Kumar, Dennis Ens, entre otras), sugiriendo un equipo más que un individuo
  4. Infraestructura de comunicación: Las cuentas sockpuppet usaban servicios de email desechables y VPNs, dificultando el rastreo

Atribución

No se ha realizado una atribución formal a ningún estado-nación. Las características de la operación (paciencia extrema, sofisticación técnica, objetivo estratégico en infraestructura de comunicaciones cifradas) son consistentes con múltiples servicios de inteligencia. La comunidad de seguridad se ha abstenido de señalar a un país específico sin evidencia definitiva, siguiendo la norma de no atribuir basándose solo en indicios circunstanciales.

MITRE ATT&CK: técnicas documentadas

TécnicaIDDescripción en el contexto de XZ Utils
Supply Chain Compromise: Software Supply ChainT1195.002Inyección de backdoor en tarballs de distribución de XZ Utils
Compromise Host Software BinaryT1554Modificación del sistema de build (build-to-host.m4) para inyectar código en el binario compilado
Command and Scripting InterpreterT1059Ejecución de código arbitrario vía payload en certificado SSH
Trusted Developer UtilitiesT1127Abuso de IFUNC resolvers, un mecanismo legítimo de glibc
Social EngineeringT1566Dos años de manipulación del mantenedor del proyecto mediante sockpuppets

Lecciones fundamentales

La vulnerabilidad del modelo de mantenimiento open source

XZ Utils era mantenido por una persona, sin compensación, que sufría agotamiento y problemas de salud. Esta situación no es excepcional: es la norma en miles de proyectos open source que sustentan infraestructura crítica global. Un estudio de 2024 de la Linux Foundation identificó que el 25% de los proyectos open source más utilizados están mantenidos por una o dos personas.

El ataque de XZ Utils expuso una verdad incómoda: empresas que generan miles de millones en ingresos dependen de software mantenido por voluntarios que pueden ser vulnerables a manipulación social. La presión social que Jia Tan y sus sockpuppets ejercieron sobre Lasse Collin fue posible precisamente porque Collin estaba solo, sobrepasado y sin apoyo institucional.

El gap entre repositorio y distribución

El backdoor existía en los tarballs de distribución pero no en el repositorio Git. Esto expuso un gap fundamental en las prácticas de seguridad: la mayoría de las revisiones de código se hacen sobre el repositorio Git, pero los paquetes se compilan desde los tarballs. Si el tarball contiene ficheros que no están en Git (como el script malicioso en build-to-host.m4), la revisión del repositorio no detecta el problema.

Este descubrimiento llevó a un replanteamiento de las prácticas de empaquetado, con un movimiento hacia la compilación reproducible (reproducible builds) y la verificación de que los tarballs corresponden exactamente al contenido del repositorio. Debian, Fedora y otras distribuciones aceleraron sus programas de reproducible builds como consecuencia directa.

La paciencia como arma

Lo más inquietante del ataque de XZ Utils no fue su sofisticación técnica (que era alta) sino la paciencia operacional. El atacante invirtió más de dos años en construir confianza antes de actuar. No fue una operación oportunista: fue una campaña planificada y ejecutada con disciplina de inteligencia.

Esto plantea una pregunta preocupante: ¿cuántos otros mantenedores solitarios de proyectos críticos están siendo manipulados en este momento? ¿Cuántos "Jia Tan" contribuyen actualmente a proyectos open source, construyendo confianza pacientemente mientras esperan el momento de inyectar su payload? Es una pregunta sin respuesta cómoda.

El factor humano como última línea de defensa

Andres Freund descubrió el backdoor porque le molestaba un retraso de 400 milisegundos y tenía la curiosidad técnica de investigarlo hasta el final. No fue una herramienta automatizada, no fue un escáner de vulnerabilidades, no fue un proceso de auditoría formal. Fue un ingeniero observando que algo "no se sentía bien" y dedicando horas a entenderlo.

El descubrimiento de XZ Utils fue un recordatorio de que la seguridad depende, en última instancia, de personas curiosas y meticulosas. También fue un recordatorio de la fragilidad de un sistema donde la seguridad de millones de servidores dependía de que un ingeniero notara medio segundo de latencia mientras hacía otra cosa.

La crisis de sostenibilidad del open source

El incidente de XZ Utils reavivó con fuerza el debate sobre la sostenibilidad del software open source. Proyectos como XZ Utils, OpenSSL, curl, zlib, sqlite y cientos más forman los cimientos invisibles de la infraestructura digital global. Sin embargo, muchos de ellos dependen de uno o dos mantenedores que trabajan sin compensación.

Tras el incidente, OpenSSF (Open Source Security Foundation), respaldada por empresas como Google, Microsoft y Amazon, amplió sus programas de financiación directa a mantenedores de proyectos críticos. El gobierno de Estados Unidos incluyó la seguridad del open source como prioridad en su estrategia nacional de ciberseguridad. Pero el problema estructural persiste: la demanda de mantenimiento supera con creces los recursos disponibles, y cada mantenedor agotado es un potencial punto de entrada para el siguiente Jia Tan.

Técnicas MITRE ATT&CK referenciadas

Preguntas frecuentes

Artículos relacionados

Este contenido tiene fines exclusivamente educativos y de investigación en ciberseguridad defensiva. No se proporcionan binarios maliciosos ni payloads ejecutables. El uso indebido de esta información es responsabilidad exclusiva del usuario. Leer disclaimer completo.