Ataque silencioso: La amenaza oculta que estuvo a punto de infiltrarse en el corazón de Linux
A finales de marzo de 2024, un desarrollador de Microsoft descubrió una puerta trasera en xz Utils, una herramienta de compresión de datos de código abierto en Linux. Esta intrusión permitía a los atacantes ejecutar comandos maliciosos a través de SSH. La meticulosa planificación de esta puerta trasera revela una preocupante vulnerabilidad en la cadena de suministro de software de código abierto. Estos esfuerzos maliciosos estuvieron a punto de integrarse en importantes distribuciones de Linux como Debian y Red Hat, lo que subraya la necesidad de una mayor seguridad en el desarrollo y distribución de software de código abierto.
«Este podría ser el ataque al suministro mejor ejecutado que hemos visto descrito públicamente, y es un escenario de pesadilla: malicioso, competente, autorizado en aguas arriba en una biblioteca ampliamente utilizada», dijo el ingeniero de software y criptografía Filippo Valsorda sobre el esfuerzo, que estuvo a punto de tener éxito.
¿Qué es XZ Utils?
XZ Utils es casi omnipresente en Linux. Proporciona compresión de datos sin pérdidas en prácticamente todos los sistemas operativos tipo Unix, incluido Linux. XZ Utils proporciona funciones críticas para comprimir y descomprimir datos durante todo tipo de operaciones. XZ Utils también es compatible con el formato .lzma heredado, lo que hace que este componente sea aún más crucial.
¿Qué ocurrió?
Andres Freund, un desarrollador e ingeniero que trabaja en las ofertas de PostgreSQL de Microsoft, estaba recientemente solucionando problemas de rendimiento que experimentaba un sistema Debian con SSH, el protocolo más utilizado para iniciar sesión de forma remota en dispositivos a través de Internet. Específicamente, los inicios de sesión de SSH estaban consumiendo demasiados ciclos de CPU y generaban errores con valgrind, una utilidad para monitorear la memoria de la computadora.
Por pura suerte y el ojo cuidadoso de Freund, eventualmente descubrió que los problemas eran el resultado de actualizaciones que se habían realizado en XZ Utils. El viernes, Freund se dirigió a la Lista de Seguridad de Código Abierto para revelar que las actualizaciones eran el resultado de alguien que colocaba intencionalmente una puerta trasera en el software de compresión.
Es difícil exagerar la complejidad de la ingeniería social y el funcionamiento interno de la puerta trasera. Thomas Roccia, un investigador de Microsoft, publicó un gráfico en Mastodon que ayuda a visualizar la extensión casi exitosa del esfuerzo para propagar una puerta trasera con un alcance que habría superado el evento de SolarWinds de 2020.
¿Qué hace la puerta trasera?
El código malicioso agregado a las versiones 5.6.0 y 5.6.1 de XZ Utils modificó la forma en que funciona el software. La puerta trasera manipulaba sshd, el archivo ejecutable utilizado para realizar conexiones SSH remotas. Cualquier persona en posesión de una clave de cifrado predeterminada podría ocultar cualquier código de su elección en un certificado de inicio de sesión de SSH, cargarlo y ejecutarlo en el dispositivo con la puerta trasera. Nadie ha visto realmente el código cargado, por lo que no se sabe qué código planeaba ejecutar el atacante. En teoría, el código podría permitir casi cualquier cosa, incluido el robo de claves de cifrado o la instalación de malware.
¿Cómo puede una utilidad de compresión manipular un proceso tan sensible en seguridad como SSH?
Cualquier biblioteca puede interferir con el funcionamiento interno de cualquier archivo ejecutable con el que esté vinculada. A menudo, el desarrollador del archivo ejecutable establecerá un vínculo con una biblioteca que se necesita para que funcione correctamente. OpenSSH, la implementación de sshd más popular, no vincula la biblioteca liblzma, pero Debian y muchas otras distribuciones de Linux agregan un parche para vincular sshd a systemd, un programa que carga una variedad de servicios durante el inicio del sistema. Systemd, a su vez, se vincula a liblzma, y esto permite que XZ Utils ejerza control sobre sshd.
¿Cómo llegó a existir esta puerta trasera?
Parece que esta puerta trasera llevaba años gestándose. En 2021, alguien con el nombre de usuario JiaT75 realizó su primer commit conocido en un proyecto de código abierto. En retrospectiva, el cambio en el proyecto libarchive es sospechoso, porque reemplazó la función safe_fprint por una variante que desde hace mucho tiempo se reconoce como menos segura. Nadie lo notó en ese momento.
Al año siguiente, JiaT75 envió un parche a la lista de correo de XZ Utils, y, casi de inmediato, un participante nunca antes visto llamado Jigar Kumar se unió a la discusión y argumentó que Lasse Collin, el mantenedor de XZ Utils desde hace mucho tiempo, no estaba actualizando el software con suficiente frecuencia o rapidez. Kumar, con el apoyo de Dennis Ens y varias otras personas que nunca habían tenido presencia en la lista, presionó a Collin para que contratara a otro desarrollador para mantener el proyecto.
En enero de 2023, JiaT75 realizó su primer commit en XZ Utils. En los meses siguientes, JiaT75, quien usaba el nombre de Jia Tan, se involucró cada vez más en los asuntos de XZ Utils. Por ejemplo, Tan reemplazó la información de contacto de Collins con la suya en oss-fuzz, un proyecto que escanea software de código abierto en busca de vulnerabilidades que puedan ser explotadas. Tan también solicitó que oss-fuzz desactivara la función ifunc durante las pruebas, un cambio que evitó que detectara los cambios maliciosos que Tan haría pronto en XZ Utils.
En febrero de este año, Tan emitió commits para las versiones 5.6.0 y 5.6.1 de XZ Utils. Las actualizaciones implementaron la puerta trasera. En las semanas siguientes, Tan u otros apelaron a los desarrolladores de Ubuntu, Red Hat y Debian para que fusionaran las actualizaciones en sus sistemas operativos.
Actualmente, se sabe muy poco sobre la identidad de Jia Tan, quien ha estado involucrado en numerosos proyectos de código abierto. Se desconoce si es una persona real o ficticia. Se ha realizado un análisis técnico adicional por parte de Valsorda, Beaumont y Freund. El seguimiento de la vulnerabilidad se realiza mediante CVE-2024-3094. Para verificar si la puerta trasera está en un dispositivo, se pueden utilizar herramientas como la página de Binarly, o el proyecto xzbot, que incluye un honeypot y parches para la vulnerabilidad.