- En marzo de 2024, se descubrió una puerta trasera en el software
xz usado para descomprimir tarballs de código fuente en distribuciones de Linux.
- Esta puerta trasera fue insertada de forma encubierta durante 3 años por el mantenedor malicioso Jia Tan.
- El incidente tuvo un gran impacto porque permitía ejecución remota de código y era muy difícil de detectar.
- Fue descubierta por casualidad por Andres Freund, desarrollador de Postgres en Microsoft, mientras investigaba una degradación de rendimiento, evitando una gran catástrofe.
Cómo funciona el ataque
- La puerta trasera secuestra el programa
ssh para permitir ejecución remota de código.
- Modifica la función
RSA_public_decrypt para que, al iniciar sesión con una clave RSA específica, el atacante pueda ejecutar comandos arbitrarios.
- Está compuesta por dos componentes principales:
- Un script que instala un archivo objeto malicioso como parte del proceso de compilación de
xz.
- Un procedimiento que engancha la función
RSA_public_decrypt.
1. Script de instalación del archivo objeto malicioso
- El archivo objeto malicioso está oculto en un archivo de prueba del repositorio git de
xz.
- La puerta trasera solo se activaba en los tarballs de lanzamiento proporcionados por el mantenedor.
2. Procedimiento de enganche de la función RSA_public_decrypt
- Usa la función ifunc de
glibc para forzar la ejecución de código que se ejecuta durante el tiempo de carga dinámica.
- Cuando se ejecuta
ssh, se cargan libsystemd y liblzma, y en ese proceso la puerta trasera ejecuta código arbitrario.
Cómo evitar un desastre como el de xz
- Para aumentar la confiabilidad del software de código abierto, hay que abordar tanto los problemas sociales como los técnicos.
- Es necesario mejorar los procesos de seguridad de la cadena de suministro de software.
Compilar software desde fuentes confiables
- El ataque fue efectivo porque muchas distribuciones compilaron
xz usando los tarballs proporcionados por el mantenedor.
- Siempre que sea posible, hay que compilar el software desde la fuente más confiable.
Cuando la situación lo permite...
- NixOS es una distribución basada en un modelo de gestión de paquetes funcional, y cada paquete se expresa en Nix, un lenguaje de programación funcional.
- NixOS tiene la cultura de usar archivos fuente generados automáticamente en GitHub.
Construir confianza en tarballs de lanzamiento no confiables
- NixOS tuvo que usar los tarballs proporcionados por el mantenedor en la etapa de bootstrap.
- Para reforzar la seguridad de la cadena de suministro de software, hay que establecer ciertas medidas de protección.
1. Comparación de fuentes
- Es importante verificar si el tarball de código fuente usado por la distribución es idéntico al de GitHub.
- Sin embargo, a menudo ocurre que el tarball de lanzamiento difiere del código fuente, y eso no necesariamente es un problema.
2. Aprovechar la reproducibilidad bit a bit
- Las compilaciones reproducibles son una propiedad de los proyectos de software que producen artefactos idénticos cuando se compilan dos veces bajo las mismas condiciones.
- La reproducibilidad bit a bit permite construir confianza en tarballs proporcionados por mantenedores no confiables.
Conclusión
- El incidente de la puerta trasera de
xz recuerda la importancia de la seguridad en la cadena de suministro del software de código abierto.
- Sistemas como NixOS pueden reforzar la seguridad mediante compilaciones reproducibles.
1 comentarios
Opiniones de Hacker News
NixOS y las compilaciones reproducibles no detectaron la puerta trasera de xz. NixOS distribuyó la compilación maliciosa de xz, pero no hubo problema porque no estaba dirigida a NixOS
Parece que el autor solo se está enfocando en este incidente. El caso de Jiatan es un ejemplo aislado, y la defensa también puede fallar en otros escenarios
NixOS no viene al caso porque la puerta trasera de xz apuntaba a RedHat y Debian. Irónicamente, la puerta trasera fue descubierta por un empleado de Microsoft
El artículo menciona que las distribuciones deberían obtener el código fuente directamente desde un VCS (por ejemplo, Github) en vez de usar los tarballs tradicionales de instalación
Si queremos enfocarnos en un incidente que NixOS sí podría haber evitado, deberíamos centrarnos en el caso de CrowdStrike. Si hubiera sido posible arrancar con la configuración de ayer, la mayoría de los problemas se habrían mitigado
NixOS compila todo desde el código fuente, verifica criptográficamente que las fuentes usadas no hayan sido alteradas y tiene dependencias de versiones entre paquetes. Debian también tiene compilaciones reproducibles
"Podría haberlo hecho" significa que no está demostrado, y en la práctica sí lo distribuyeron
Un análisis explicativo excelente. El título es incorrecto y engañoso, aunque quizá sea "técnicamente correcto", en el mejor de los casos en el sentido de "con una puerta trasera"
Si el PR de Jia Tan hubiera sido aprobado, los artefactos maliciosos podrían haber llegado fácilmente a un release de Github igual que al tarball. Cuesta entender que un release de Github sea una mitigación de seguridad
Sobre el hecho de que el tarball de lanzamiento sea distinto del código fuente
git addycommit. Incluso en ese caso habría que revisar el historial de commits, y como a simple vista parecía inofensivo, queda la duda de cómo podría verificarseHabía más problemas que simplemente subir archivos de prueba envenenados, pero cuesta entender cómo Nix podría haber evitado esto
Me pregunto si entendí mal el artículo o si se me escapó algo