Parte 1: Historia del backdoor XZ: Análisis inicial
Parte 2: Evaluar el porqué y el cómo del incidente ocurrido con XZ Utils
Parte 3: El backdoor XZ. Análisis del hook
Los grupos APT de alto nivel realizan campañas de ingeniería social muy interesantes para penetrar en objetivos que cuentan con buena protección. Por ejemplo, en Oriente Medio, respuestas cuidadosamente elaboradas a víctimas bien escogidas en foros e interacciones posteriores por otros canales acerca del software simulador de un sistema ferroviario de metro ayudaron a introducir implantes Green Lambert. Y, en lo que parece ser una estratagema aprendido, la penetración en el proyecto XZ Utils fue un método aplicado con paciencia durante muchos años, planificado de antemano pero ejecutado con cierta torpeza.
Este esfuerzo ofensivo recientemente expuesto introdujo poco a poco un reducido número de personajes remotos, comunicaciones y códigos maliciosos en el proyecto de código abierto XZ Utils, que tiene más de una década de antigüedad y está a cargo de su mantenedor, Lasse Collin. El código backdoor fue insertado en febrero y marzo de 2024, principalmente por Jia Cheong Tan, una identidad quizá ficticia. El objetivo final era implementar en secreto una puerta trasera de uso exclusivo en sshd, aprovechando el proceso de compilación de XZ Utils, e integrar el código con el backdoor en las principales distribuciones de Linux como parte de un ataque a gran escala contra la cadena de suministro.
Aunque este enfoque de ingeniería social, en alto grado selectivo e interactivo puede no ser tan novedoso, es extraordinario. También es extraordinaria la asombrosa sutileza con que se introdujo el código malicioso, aprovechando el proceso de compilación, y a plena vista del público. Este enfoque en el proceso de compilación durante un ataque de gran envergadura a la cadena de suministro sólo es comparable con el compromiso de Solarwinds de CozyDuke/DarkHalo/APT29/NOBELIUM y la presencia astuta y persistente del implante SUNSPOT, con su capacidad de monitorear la ejecución de una compilación de Solarwinds e insertar el código malicioso cada vez que se lo compilaba. Sólo que esta vez se trata de la participación humana en el proceso de compilación.
Cabe destacar que una de las principales diferencias entre el incidente de Solarwinds y los ataques anteriores a la cadena de suministro fue el acceso encubierto y prolongado del adversario al entorno de desarrollo del código fuente. En el incidente de XZ Utils, el acceso prolongado se obtuvo mediante ingeniería social y se amplió con interacciones de falsas identidades humanas a la vista de todos.
Una de las mejores cronologías accesibles al público sobre la ingeniería social del incidente de XZ Utils es la publicada por Russ Cox, que trabaja como investigador en Google. Es una lectura muy recomendable. En particular, Cox escribe: “Este post es una cronología detallada que he compuesto sobre la ingeniería social del ataque, que parece remontarse a finales de 2021”.
Un singapurense, un indio y un alemán entran en un bar…
En el verano de 2022 Jia Tan/Jia Cheong Tan, Dennis Ens y Jigar Kumartres, tres identidades, presionan al creador y mantenedor de XZ Utils, Lasse Collin para inducirlo a delegar el proyecto de código abierto. Estas identidades tienen una cuenta de GitHub, tres cuentas de correo electrónico gratuitas con esquemas de nombres similares, una cuenta de IRC y Ubuntu One, comunicaciones por correo electrónico en las listas de correo de los desarrolladores de XZ Utils y mantenedores posteriores, y un código. Su objetivo era conceder acceso completo al código fuente de XZ Utils a Jia Tan e introducir sutilmente un código malicioso en XZ Utils. Las identidades incluso interactúan entre sí en hilos de correo, quejándose de la necesidad de sustituir a Lasse Collin como mantenedor de XZ Utils.
Nótese que la dispersión geográfica de las identidades ficticias es un poco forzada, quizá para disipar indicios de coordinación: un singapurense o malayo (posiblemente de dialecto hokkien), un noreuropeo y un indio. Las faltas de ortografía y los errores gramaticales son similares en las comunicaciones de las tres identidades. La identidad “Jia Tan” también parece un poco forzada: el único dato público de geolocalización es un nodo de salida VPN de Singapur que podría haber utilizado el 29 de marzo para acceder al canal IRC de XZ Utils en Libera Chat. Si se construye una identidad ficticia, utilizar ese nodo de salida en concreto sería sin duda un recurso seleccionado.
Nuestro pDNS confirma esta IP como una salida de Witopia VPN. Aunque cabría esperar un nombre de usuario como “jiat75” o “jiatan018” para la cuenta “Jia Tan” de Libera IRC; el que vemos en la captura de pantalla anterior podría haber sido utilizado el 29 de marzo de 2024 por “JiaT75”.
Una identidad adicional, Hans Jansen, introdujo en junio de 2023 una optimización de rendimiento en el código fuente de XZ Utils, confirmada por Collin, y aprovechada más adelante por el código del backdoor de jiaT75. Jia Tan aceptó de buen grado las adiciones propuestas por la IFUNC: “¡Gracias por el PR y los enlaces útiles! En general, parece una buena mejora a nuestra estrategia de selección de funciones para CRC64. Probablemente también será útil cuando implementemos CRC32 CLMUL :)”.
Este pull request es la única interacción de la identidad Jansen con el proyecto XZ Utils. Y, a diferencia de las otras dos identidades, la cuenta de Jansen no se utiliza para presionar a Collin para que delegue el mantenimiento de XZ Utils. En cambio, la identidad Hans Jansen proporcionó el código y luego desapareció. Nueve meses después, tras la inserción del código backdoor, Jansen instó a un importante proveedor de Linux de la cadena de suministro a incorporar el código XZ Utils adulterado con el backdoor en su distribución. La identidad resurgió en un informe de errores de Debian el 24 de marzo de 2024, creando una oportunidad para generar urgencia en la inclusión del código oculto en la distribución de Debian.
La identidad y actividad de Jia Tan
La cuenta de GitHub de Jia Cheong Tan (JiaT75), finalmente ascendido a co-mantenedor de XZ Utils, que insertó el código malicioso del backdoor, fue creada el 26 de enero de 2021. JiaT75 no se dedicaba exclusivamente a XZ Utils, ya que fue autor de más de 500 parches en varios proyectos de GitHub desde principios de 2022.
- oss-fuzz;
- cpp-docs;
- wasmtime;
- XZ.
Estos parches inocuos ayudaron a que JiaT75 se ganara la reputación de colaborador legítimo de proyecto de código abierto y potencial mantenedor del proyecto XZ Utils. Los esfuerzos de parcheo ayudaron también a establecer una relación con Lasse Collin.
La primera contribución de código de JiaT75 a XZ Utils se produjo el 29 de octubre de 2021. La envió a la lista de correo xz-devel. Era una introducción muy simple al archivo editorconfig. Tras esta inocua adición inicial, en los dos años siguientes JiaT75 realizó cientos de cambios en el proyecto XZ.
Sí, JiaT75 contribuyó con códigos tanto los fines de semana como lo que parecen ser días laborables. Sin embargo, una anomalía interesante es que los commits maliciosos de 2024 se producen fuera de sincronía con muchos commits anteriores. Un investigador de Huntress que se hace llamar “Alden” publicó una visualización de los commits maliciosos de Jia Tan en XZ Utils. JiaT75 hizo el commit del código malicioso completamente fuera de sincronía con los tiempos de trabajo anteriores el 23-26 de febrero, y el 8 y 9 de marzo de 2024.
Las diferencias de tiempo para los commits maliciosos son notables. ¿Qué puede sugerir esta anomalía? Especulamos sobre varias posibilidades:
- La cuenta JiaT75 fue utilizada por una segunda parte (conocida o desconocida al contribuyente individual) para insertar el código malicioso.
- El colaborador individual JiaT75 se apresuró a enviar el código malicioso del backdoor.
- La cuenta JiaT75 estaba gestionada por un equipo de personas y una parte del equipo necesitaba trabajar sin interrupción fuera de la jornada laboral habitual.
Especialmente retorcida es la forma en que JiaT75 introduce el código ofuscado del backdoor en varias piezas separadas. Aunque era de código abierto, la mayor parte del backdoor no aparece en el árbol de código fuente de XZ, no es legible por humanos y no fue reconocida.
Presión para añadir un mantenedor en verano de 2022
Múltiples identidades de interés presionaron a Lasse Collin para incorporar un mantenedor durante el verano de 2022. La intensidad de la presión sobre Collin varía según la cuenta, pero todas crean oportunidades para presionar a Collin e interactuar.
Nombre | Cuenta de GitHub | Correo electrónico | Creación |
Jia Tan/Jia Cheong Tan | JiaT75 | jiat0218@gmail.com | 26 de enero de 2021 |
Dennis Ens | – | dennis3ns@gmail.com | – |
Jigar Kumar | – | jigarkumar17@protonmail.com | – |
Si tomamos la primera interacción en la lista de correo xz-devel como inicio de la campaña, Jia Tan envió un parche de código superficial el 29 de septiembre de 2021. Esta marca de tiempo es de ocho meses después de la fecha de creación de la cuenta de github. Esta contribución inicial es inofensiva, pero establece esta identidad dentro del proyecto de código abierto.
Un año después, Jigar Kumar presionó a Lasse Collin para que cediera el acceso a Jia Tan durante la primavera y el verano de 2022 en seis comentarios mordaces en dos hilos diferentes.
Mié, 27 abr 2022 11:42:57 -0700 | Re: [xz-devel] [PATCH] Cadena a filtro y filtro a cadena |
Your efforts are good but based on the slow release schedule it will unfortunatly be years until the community actually gets this quality of life feature.
“Sus esfuerzos son buenos, pero teniendo en cuenta la lentitud del calendario de lanzamientos, desgraciadamente pasarán años hasta que la comunidad disponga realmente de esta función de calidad de vida”. |
|
Jue, 28 abr 2022 10:10:48 -0700 | Re: [xz-devel] [PATCH] Cadena a filtro y filtro a cadena |
Patches spend years on this mailing list. 5.2.0 release was 7 years ago. There is no reason to think anything is coming soon. “Los parches pasan años en esta lista de correo. La versión 5.2.0 fue lanzada hace 7 años. No hay razón para pensar que algo vaya a ocurrir pronto”. |
|
Vie, 27 may 2022 10:49:47 -0700 | Re: [xz-devel] [PATCH] Cadena a filtro y filtro a cadena |
Over 1 month and no closer to being merged. Not a suprise.
“Más de 1 mes y no nos acercamos a la fusión. No me sorprende”. |
|
Mar, 07 jun 2022 09:00:18 -0700 | Re: [xz-devel] XZ para Java |
Progress will not happen until there is new maintainer. XZ for C has sparse commit log too. Dennis you are better off waiting until new maintainer happens or fork yourself. Submitting patches here has no purpose these days. The current maintainer lost interest or doesn’t care to maintain anymore. It is sad to see for a repo like this. “No habrá progreso mientras no haya un nuevo mantenedor. XZ para C también tieneun registro muy espaciado de commits. Dennis, es mejor esperar hasta que haya un nuevo mantenedor o hagas una bifurcación tú mismo. Enviar parches aquí no tiene ningún sentido en estos días. El actual mantenedor perdió el interés o ya no se preocupa por el mantenimiento. Es triste ver que esto le pase a un repo como este”. |
|
Mar, 14 jun 2022 11:16:07 -0700 | Re: [xz-devel] XZ para Java |
With your current rate, I very doubt to see 5.4.0 release this year. The only progress since april has been small changes to test code. You ignore the many patches bit rotting away on this mailing list. Right now you choke your repo. Why wait until 5.4.0 to change maintainer? Why delay what your repo needs? “Con su ritmo actual, dudo mucho que la versión 5.4.0 salga este año. El únicoavance desde abril han sido pequeños cambios en el código de prueba. Ignoras los muchos parches que están pudriéndose en esta lista de correo. Está asfixiando a su repo. ¿Por qué esperar hasta 5.4.0 para cambiar de mantenedor? ¿Por qué retrasar lo que su repo necesita?”. |
|
Mié, 22 jun 2022 10:05:06 -0700 | Re: [xz-devel] [PATCH] Cadena a filtro y filtro a cadena |
Is there any progress on this? Jia I see you have recent commits. Why can’t you commit this yourself? “¿Hay algún avance al respecto? Jia veo que tienes commits recientes. ¿Por qué no puedeshacer commit de esto tú mismo?” |
La identidad Dennis Ens crea un hilo propio y presiona al mantenedor Collin en un mensaje especialmente contundente y detestable a la lista. La identidad aprovecha una vulnerabilidad personal que Collin compartió en este hilo. La identidad de Jigar Kumar responde dos veces a este hilo, quejándose amargamente del mantenedor: “Dennis es mejor que esperes a que haya un nuevo mantenedor o que hagas un “fork” tú mismo”.
Jue, 19 May 2022 12:26:03 -0700 | XZ para Java |
Is XZ for Java still maintained? I asked a question here a week ago and have not heard back. When I view the git log I can see it has not updated in over a year. I am looking for things like multithreaded encoding / decoding and a few updates that Brett Okken had submitted (but are still waiting for merge). Should I add these things to only my local version, or is there a plan for these things in the future? “¿Se sigue manteniendo XZ para Java? Hice una pregunta aquí hace una semanay no he recibido respuesta. Cuando veo el git log puedo ver que no ha sidoactualizado en más de un año. Estoy buscando cosas como multithreaded codificación/decodificación y algunas actualizaciones que Brett Okken había enviado (pero siguen esperando la fusión). ¿Debo añadir estas cosas sólo a mi versión local, o ¿hay algún plan para estas cosas en el futuro?”. |
|
Mar, 21 jun 2022 13:24:47 -0700 | Re: [xz-devel] XZ para Java |
I am sorry about your mental health issues, but its important to be aware of your own limits. I get that this is a hobby project for all contributors, but the community desires more. Why not pass on maintainership for XZ for C so you can give XZ for Java more attention? Or pass on XZ for Java to someone else to focus on XZ for C? Trying to maintain both means that neither are maintained well. “Siento lo de tus problemas de salud mental, pero es importante serconsciente de tus propios límites. Entiendo que este proyecto es un hobby para todos loscolaboradores, pero la comunidad desea más. ¿Por qué no delegar el mantenimiento de XZ para C para que puedas darle más atención a XZ para Java? ¿O pasar XZ para Java a otra persona para que centrarte en XZ para C? Intentar mantener ambas cosas significa que ninguna se mantiene bien”. |
Reflexionar sobre estos datos nos sigue llevando a un terreno inestable. Hasta que no se publiquen más detalles, sólo nos quedan especulaciones:
- En un proyecto de tres años, un pequeño equipo consiguió penetrar en el código base de XZ Utils con una campaña lenta y de baja presión. Manipularon para poner un actor malicioso en la posición de confianza de co-mantenedor de código. A continuación, iniciaron e intentaron acelerar el proceso de distribución de código malicioso dirigido a sshd en las principales distribuciones de Linux.
- En un proyecto de tres años, una persona logró penetrar en el código base de XZ Utils con una campaña lenta y de baja presión. El individuo manejó varias identidades para manipular su propia introducción en la posición de confianza de co-mantenedor de código abierto. A continuación, iniciaron e intentaron acelerar el proceso de distribución de código malicioso dirigido a sshd en las principales distribuciones de Linux.
- En un plazo extremadamente corto, a principios de 2024, un pequeño equipo manipuló para que un individuo (Jia Tan) se ganara legítimamente el acceso a un interesante proyecto de código abierto como mantenedor de código. Es posible que otras dos personas (Jigar Kumar, Dennis Ens) se quejaran de tanto en tanto y presionaran a Collin para que cediera el papel de mantenedor. Ese individuo apalancado comenzó a insertar código malicioso en el proyecto en el transcurso de un par de semanas.
Presión para importar el código con el backdoor a Debian en la primavera de 2024
Varias identidades intentaron presionar a los mantenedores de Debian para que importaran el código de XZ Utils a su distribución en marzo de 2024. La identidad Hans Jansen creó un registro de informe de Debian el 25 de marzo de 2024 para urgir a que se incluyera el código con el backdoor: “Queridos mentores, estoy buscando un patrocinador para mi paquete “xz-utils””.
Nombre | Dirección de correo electrónico |
Hans Jansen | hansjansen162@outlook.com |
krygorin4545 | krygorin4545@proton.me |
misoeater91@tutamail.com | misoeater91@tutamail.com |
En el plazo de un día otras identidades respondieron en el hilo utilizando el esquema de dirección de correo electrónico nombre-número@freeservice[.]com:
Fecha: Mar, 26 Mar 2024 19:27:47 +0000 | De: krygorin4545 <krygorin4545@proton.me> |
Asunto: Re: RFS: xz-utils/5.6.1-0.1 [NMU] — Utilidades de compresión en formato XZ | |
Also seeing this bug. Extra valgrind output causes some failed tests for me. Looks like the new version will resolve it. Would like this new version so I can continue work
“También veo este error. La salida extra de valgrind me causa algunas pruebas fallidas. Parece que la nueva versión lo resolverá. Me gustaría tener esta nueva versión para poder seguir trabajando” |
|
Fecha: Mar, 26 Mar 2024 22:50:54 +0100 (CET) | De: misoeater91@tutamail.com |
Asunto: Re: RFS: xz-utils/5.6.1-0.1 [NMU] — Compresión en formato XZ | |
I noticed this last week and almost made a valgrind bug. Glad to see it being fixed. Thanks Hans!
“Me di cuenta de esto la semana pasada y casi cometí un error valgrind. Me alegra ver que se está arreglando. Gracias, Hans”. |
Los cambios en el código fueron rechazados por lo colaboradores legítimos de Debian:
Fecha: Mar, 26 Mar 2024 22:11:19 +0000 (UTC) | De: Thorsten Glaser <tg@debian.org> |
Asunto: nuevas versiones ascendentes como NMU frente a mantenimiento xz | |
Very much *not* a fan of NMUs doing large changes such as new upstream versions.But this does give us the question, what’s up with the maintenance of xz-utils? Same as with the lack of security uploads of git, which you also maintain, are you active? “Muy *no* un fan de NMUs haciendo grandes cambios como nuevas versiones anteriores. Pero esto nos hace preguntarnos, ¿qué pasa con el mantenimiento de xz-utils? Lo mismo que con la falta de actualizaciones de seguridad a git, que también mantienes, ¿estás activo? |
A lo que una de estas probables cuentas títere respondió casi de inmediato, con el fin de contrarrestar cualquier distracción de impulsar los cambios:
Fecha: Mié, 27 Mar 2024 12:46:32 +0000 | De: krygorin4545 <krygorin4545@proton.me> |
Asunto: Re: Bug#1067708: nuevas versiones upstream como NMU vs. mantenimiento xz | |
Instead of having a policy debate over who is proper to do this upload, can this just be fixed? The named maintainer hasn’t done an upload in 5 years. Fedora considered this a serious bug and fixed it weeks ago (<https://bugzilla.redhat.com/show_bug.cgi?id=2267598>). Fixing a valgrind break across many apps throughout Debian is the priority here.
“En lugar de mantener un debate político sobre quién tiene derecho a hacerlo, ¿no sería mejor simplemente corregirlo? El mantenedor nombrado no ha hecho ninguna subida en 5 años. Fedora consideró que se trataba de un error grave y lo corrigió hace semanas (<https://bugzilla.redhat.com/show_bug.cgi?id=2267598>). Arreglar una rotura de valgrind en muchas aplicaciones a través de Debian es la prioridad aquí”. |
¿Qué NeXZt?
Está claro que las técnicas de ingeniería social tienen requisitos técnicos mucho menores para obtener acceso completo a entornos de desarrollo que los que vimos en ataques anteriores a la cadena de suministro, como los incidentes de Solarwinds, M.E.Docs, ExPetya y ASUS ShadowHammer. Hemos presentado y comparado estos ataques concretos a la cadena de suministro, sus técnicas y sus complejidades, en anteriores eventos de SAS [es necesario registrarse], y resumido la evaluación en una tabla fácil de entender.
Tememos que en los próximos meses salgan a la luz más incidentes relacionados con proyectos de código abierto como el de XZ Utils. De hecho, en el momento de escribir este artículo, la Open Source Security Foundation (OSSF) ha identificado incidentes similares de ingeniería social en otros proyectos de código abierto y afirma que es muy probable que el esfuerzo de ingeniería social de XZ Utils no sea un incidente aislado.
Evaluar el porqué y el cómo del incidente ocurrido con XZ Utils