Varios paquetes oficiales del proyecto AsyncAPI publicados en el repositorio npm fueron comprometidos para distribuir código malicioso, en un nuevo ataque a la cadena de suministro de software que afectó a un ecosistema con alrededor de 2 millones de descargas semanales. Las investigaciones indican que los atacantes lograron introducir versiones maliciosas a través del proceso oficial de publicación, aprovechando canales legítimos de distribución.

De acuerdo con las publicaciones de SafeDep, Socket, StepSecurity y OX Security, el incidente afectó a paquetes del ecosistema @asyncapi/generator —utilizados para generar código y documentación a partir de especificaciones AsyncAPI— así como a @asyncapi/specs. Las versiones comprometidas (@asyncapi/generator@3.3.1, @asyncapi/generator-helpers@1.1.1, @asyncapi/generator-components@0.7.1 y @asyncapi/specs@6.11.2) incluían un componente malicioso diseñado para descargar una segunda carga útil, identificada por los investigadores como Miasma RAT, un troyano de acceso remoto y exfiltrador de credenciales.

Los especialistas coinciden en que no se trató de la publicación de paquetes falsos (typosquatting), sino del compromiso de paquetes oficiales, lo que incrementa el riesgo debido a que los desarrolladores confían en ellos y los obtienen desde los canales habituales de npm.

El vector de ataque: Vulnerabilidad en GitHub Actions

A diferencia de otros incidentes donde se roban credenciales directas de npm, StepSecurity y SafeDep revelaron que el atacante explotó una mala configuración en el flujo de trabajo de GitHub Actions de AsyncAPI.

Mediante un Pull Request malicioso (PR #2155), oculto entre numerosas contribuciones, consiguió exfiltrar un token de GitHub con permisos para modificar la rama next. Desde allí introdujo cambios que posteriormente fueron publicados como versiones oficiales de los paquetes.

Al utilizar la infraestructura oficial de CI/CD de AsyncAPI para publicar los paquetes, el sistema generó de forma automática firmas de procedencia OIDC válidas, haciendo que las versiones maliciosas parecieran legítimas y verificadas a los ojos de los consumidores.

Evasión avanzada

Las investigaciones también señalan que el código malicioso no se ejecutaba durante la instalación (evitando hooks comunes como preinstall o postinstall), sino que se activaba únicamente cuando el módulo era importado o cargado (require o import) en la aplicación. Este enfoque dificulta enormemente la detección por parte de herramientas tradicionales de análisis estático (SCA) y de seguridad de dependencias. Actuando como un «dropper«, el paquete comprometido exfiltraba información del sistema para luego descargar e instalar la segunda etapa del ataque (Miasma RAT) desde servidores de control o redes descentralizadas como IPFS.

El incidente vuelve a poner de relieve que los ataques a la cadena de suministro ya no se limitan a publicar paquetes falsos, sino que también buscan comprometer la infraestructura utilizada por proyectos legítimos para distribuir software confiable.

Indicadores de Compromiso (IOCs)

A continuación se muestran algunos de los indicadores incluidos en las investigaciones:

Paquetes npm maliciosos

  • @asyncapi/generator-helpers@1.1.1
  • @asyncapi/generator-components@0.7.1
  • @asyncapi/generator@3.3.1
  • @asyncapi/specs@6.11.2
  • @asyncapi/specs@6.11.2-alpha.1

Archivos fuente infectados

  • packages/helpers/src/utils.js
  • packages/components/src/utils/ErrorHandling.js
  • apps/generator/lib/templates/config/validator.js
  • index.js

Rutas publicadas afectadas

  • Ruta publicada de helper: src/utils.js
  • Ruta publicada de components: lib/utils/ErrorHandling.js
  • Ruta publicada de generator: lib/templates/config/validator.js

Hashes SHA-256

  • @asyncapi/generator-helpers@1.1.1 (tarball): 34014776d3d3ff11bc4439b02fd7ac0f02a887eb3a052eeafff236e2f6db8ad1
  • @asyncapi/generator-components@0.7.1 (tarball): 082d733db0687dcd768104972b065d4b58cb1e6043688c6c20fa3702337f36ab
  • @asyncapi/generator@3.3.1 (tarball): bfaeb987faa6de2b5a5eb63b1233d055215b09b0349a9394f2175fd7cdf385e4
  • @asyncapi/specs@6.11.2 (tarball): 9b2e65db653ca8575c9b10eefb9a80c6006404812c2ec212bf5675e3c690233b
  • @asyncapi/specs@6.11.2-alpha.1 (tarball): d425e4583cc6185d41e95c45eda00550045a5d1919b9a012236a4520d009dbd7

Archivos infectados

  • src/utils.js: 6e78713b75bd34828d49896176627f7face7aa9036cd874f2e02d9f23a9a9c71
  • lib/utils/ErrorHandling.js: b270bdf8e2274ea1af0a6eed74d8f10e5fe61012d6cc226a43cc7cc7fd9f6292
  • lib/templates/config/validator.js: b9993a8ad0518849416798cf29668256ccb96598fc4423501ccab5312812653a
  • index.js: 8351d251cf0b5a0bd82242deaa0a14e3e1394418d55c0f4259dac4303b79fc0c

Endpoints de C2

  • hxxp://85[.]137[.]53[.]71:8080/api/v1/beacon
  • hxxp://85[.]137[.]53[.]71:8080/api/v1/file-result
  • hxxp://85[.]137[.]53[.]71:8080/api/v1/file-content/
  • hxxps://ipfs[.]io/api/v0/cat?arg=<cid>

Fuentes

https://safedep.io/asyncapi-generator-supply-chain-attack-miasma-rat

https://socket.dev/blog/asyncapi-supply-chain-attack

https://www.stepsecurity.io/blog/compromised-next-branch-pushes-malicious-asyncapi-generator-generator-helpers-and-generator-components-to-npm

https://www.ox.security/blog/asyncapi-npm-organization-compromised-2m-weekly-downloads-affected/