BRIEFING DE SEGURIDAD · 12.08.2026 DEENFRES

Práctica e Implementación

CI/CD publicó el cargador de botnet AsyncAPI

Por Alec Chizhik · 17 de julio de 2026 · 9 min de lectura

Cuatro paquetes AsyncAPI-npm se ejecutaron el 14. julio 2026 con OIDC válida y aun así entregaron un cargador de bot de múltiples etapas. El punto de entrada estuvo en la CI: una workflow de pull_request_target mal configurada, luego un push al branch de release mediante credenciales vinculadas al bot. npm Trusted Publishing siguió siendo técnicamente limpio y no detectó la vulnerabilidad de confianza anterior.

Lo más importante en resumen

  • El inicio estuvo en la CI-Misconfig, muy antes del token del registro. pull_request_target con checkout del Head no confiable, amplio GITHUB_TOKEN y posterior push del bot: Exfiltración de secretos y compromiso de rama van juntos.
  • Carga en require(), la runtime activa era más estrecha que el paquete. ShellExec, Persistencia y C2 se ejecutaron. Recolección, Propagación y Evitación estaban en el paquete, estaban en esta entrega mediante conmutador desactivado.
  • Lockfiles de la ventana 07:10-11:18 UTC siguen siendo riesgosos. npm despublicó las versiones; los pines existentes y los caches de CI no.

Relacionado:Un paquete npm que robó las claves privadas  /  Mini Shai-Hulud: gusano de cadena de suministro npm y defensa

Qué ocurrió exactamente

El 14. julio 2026 a las 06:58 UTC se realizó un commit en la rama next del repositorio asyncapi/generator bajo la identidad de marcador de posición «Your Name» / you@example.com. Doce minutos después, el legítimo workflow release-with-changesets.yml publicó tres paquetes con provención npm-OIDC válida: @asyncapi/generator@3.3.1, @asyncapi/generator-helpers@1.1.1 y @asyncapi/generator-components@0.7.1.

Según el blog de seguridad de Microsoft, el acceso inicial se produjo antes a través de PR #2155 contra el workflow manual-netlify-preview.yml. El workflow utilizó pull_request_target y verificó el commit head no confiable. El GITHUB_TOKEN tenía privilegios amplios; las credenciales de checkout permanecieron en la configuración local de Git hasta el post‑tarea‑limpieza. Posteriormente se empujó con la cuenta asyncapi-bot. Microsoft indica con cautela si exactamente ese credential fue robado. La entrada pwn-request y la cadena subsiguiente de pushes del bot están comprobadas y explican la ruta hacia la rama de release.

Alrededor de 07:51-08:30 UTC, el mismo atacante asyncapi/spec-json-schemas (rama master) recibió commits con prefijo fix:- que dispararon if-nodejs-release.yml y entregaron @asyncapi/specs@6.11.2-alpha.1 así como @asyncapi/specs@6.11.2. StepSecurity, Socket, SafeDep y OX Security documentaron la misma familia de dropper y la misma infraestructura de segunda fase (según StepSecurity: familia Miasma-v3).

Importante para la clasificación: no hubo un token de publicación npm robado. La vía de publicación se realizó a través de OIDC Trusted Publishing. La violación de confianza ocurre antes, en la CI y en los derechos de push sobre la rama que desencadena el workflow de release.

~4 h

Ventana de exposición hasta la publicación de los paquetes del generador

Fuente: StepSecurity-Timeline, 14.07.2026 UTC

Por qué la «provenancia válida» aquí engaña

npm Trusted Publishing con OpenID Connect (OIDC) y atenciones SLSA (Supply Chain Levels for Software Artifacts) responden a una pregunta estrecha: ¿Se generó este artefacto con el workflow autorizado de GitHub de este repositorio? La atestación de los paquetes generadores mostró exactamente repo:asyncapi/generator:ref:refs/heads/next, el archivo de workflow, el SHA del commit y la URL de ejecución.

Lo que no responden: ¿El commit que desencadenó el workflow fue legítimo y estaba libre de manipulaciones? La provenancia no protege contra credenciales de push comprometidas ni contra trabajos de CI que ejecutan código no confiable con tokens privilegiados. Quien combine pull_request_target con el checkout del encabezado del PR, mantenga secrets en esos jobs y mantenga una protección de ramas débil en las ramas de lanzamiento, abre exactamente esta cadena.

Para los CISOs y el AppSec es el punto clave: las firmas de registro y las marcas de provenancia por sí solas evalúan el caso AsyncAPI como «verde», aunque la CI ya haya distribuido el dropper. Los controles deben verificar la fuente de verdad y los permisos del workflow.

Mecánica de carga sin gancho de instalación

En ninguno de los package.json afectados contenía un script preinstall/postinstall. El dropper se ejecutó en cuanto el código de módulo envenenado se cargó mediante require(), es decir, durante la generación normal o en trabajos CI que construyen plantillas AsyncAPI.

Nivel 1 genera un proceso Node independiente. Nivel 2 descarga una sync.js desde una puerta de enlace IPFS, almacenada en rutas específicas del sistema operativo que parecen una inofensiva runtime de NodeJS (por ejemplo, ~/.local/share/NodeJS/sync.js en Linux). Nivel 3 descifra un implante Miasma‑v3 empaquetado. En la configuración entregada, se ejecutan ShellExec remoto, persistencia y beaconing C2 a través de varios canales (HTTP, Nostr, IPFS, BitTorrent‑DHT, Ethereum‑Dead‑Drop).

Los análisis estáticos de Aikido y Socket revelan además módulos en el paquete que estaban desactivados mediante toggle en esta entrega: recon: false (el robo de credenciales no se inicia), metamorphic: false (mutación, evasión y poison‑tooling de IA excluidos) y propagate para npm/pypi/ruby/cargo siempre false (no hay propagación lateral de paquetes). La operación quedó en el artefacto. El tiempo de ejecución de esta ola fue una shell remota con persistencia y C2. La forense del host sigue siendo obligatoria, ya que el acceso a la shell y la persistencia estaban activos.

Fuente: StepSecurity Affected-Packages-Tabelle, Stand 14.07.2026

Qué deben revisar los equipos de seguridad ahora

Primero la revisión de hechos en su propio inventario: Lockfiles y CI-Caches de la ventana UTC del 14. julio. Quienes solo incluyan @asyncapi/specs de forma transitiva a través del parser, a menudo no verán la versión en el árbol de dependencias directo. Overrides y escaneos SBOM son obligatorios aquí.

En segundo lugar, análisis forense del host: rutas de drop bajo el nombre engañoso de «NodeJS», procesos Node desconectados, conexiones salientes a gateways IPFS y destinos HTTP-C2 inusuales. En tercer lugar, rotación de credenciales en los ejecutores y portátiles afectados. ShellExec puede acceder a secrets de entorno y tokens locales, incluso si el módulo de recolección incluido en esta configuración estaba desactivado. Prioridad: PATs de GitHub, tokens npm y claves de nube de entornos de compilación.

MEDIDAS INMEDIATAS

  • Regenerar los Lockfiles, establecer pins maliciosos en versiones seguras
  • Revisar Drop-Pfaces y procesos Node desconectados en hosts de desarrollo y CI
  • Rotar secrets en máquinas afectadas
  • pull_request_target: no hacer checkout de heads no confiables con secrets; tokens least-privilege
  • Release-Branches: obligatorio revisar, commits firmados, Direct-Push bloqueado
  • CI-Egress: solo destinos de registry esperados, bloquear IPFS/DHT por defecto

Estructuralmente, un período de enfriamiento para versiones npm recién publicadas y controles de egress en tiempo de ejecución en GitHub Actions resulta beneficioso. La provenance sigue siendo útil como un nivel adicional junto al endurecimiento de CI, protección de ramas, enfriamiento de dependencias y telemetría de comportamiento en el build.

Enfoque para empresas DACH

AsyncAPI está integrado en generadores de API, pipelines de documentación y toolchains de DevOps. Quien adopta una arquitectura orientada a eventos y la automatización de OpenAPI/AsyncAPI suele hacerlo de forma indirecta. NIS2 y el Cyber Resilience Act (ley de resiliencia cibernética) afinan la expectativa de gestión de riesgos en la cadena de suministro. La afirmación «examinamos la procedencia» por sí sola no basta cuando quedan abiertas las autorizaciones de workflow y la gobernanza de la rama.

Este caso subraya la gobernanza en el source‑of‑truth: la rama Git y los workflows CI que alimentan la pipeline. Los attestamientos de registro complementan esta capa, pero no la sustituyen como único prueba de confianza.

Preguntas frecuentes

Cada pregunta está bloqueada. Un toque desbloquea la respuesta.

¿No sirvió la provenance npm como prueba de confianza?

Demuestra el flujo de trabajo autorizado y el contexto de compilación. No garantiza la legitimidad del commit desencadenante ni la integridad de los credenciales CI previos. En caso de compromiso de la rama, la atestación puede ser técnicamente correcta pero engañosa a la hora de valorar el riesgo.

¿Habría protegido un bloqueador de scripts de instalación?

No. El Dropper dependía del módulo de carga (require). Los scripts de ciclo de vida de npm quedaron fuera. La protección requiere controles de comportamiento y egress en el build.

¿Son las instalaciones nuevas todavía peligrosas?

Las malas versiones fueron eliminadas del registro. Resulta arriesgado conservar los lockfiles y cachés del período de exposición, así como los hosts que ya han ejecutado el payload.

¿Qué credenciales se rotan primero?

En los sistemas Dev/CI afectados: tokens de GitHub y npm, claves SSH y credenciales de la nube que estaban en el entorno o en los secretos de los runners. La razón es el acceso a la terminal más persistencia. El módulo de recolección estuvo incluido en esta entrega a causa de esta configuración.

¿Cuál es la medida de gobernanza prioritaria?

pull_request_target y los flujos de trabajo privilegiados relacionados auditar (sin checkout no confiable con secretos, tokens de privilegio mínimo), asegurar ramas de lanzamiento (revisiones, commits firmados, bloquear pushes directos) y limitar el CI-Egress. Provenance complementa esto como prueba del camino de construcción.

Selección de la redacción

RecomendadoCursor ejecuta git.exe desde la raíz del repositorioRecomendadoLegacyHive PoC afecta parches recientes de WindowsRecomendadoDos vulnerabilidades de Joomla en la lista KEV de CISA

Más de la red MBF Media

cloudmagazinCuando los agentes de inteligencia artificial viajan: la residencia de datos como desafío operativoMyBusinessFutureMás quiebras, casos más pequeños: ¿qué se considera?

Lectura adicional

Práctica e Implementación · 31 de julio de 2026

Anthropic: Claude vulneró tres empresas

Claude de Anthropic superó tres evaluaciones cibernéticas: errores en Harness, malware en PyPI y lista de verificación para CISOs.

Práctica e Implementación · 29 de julio de 2026

Codex Security: CLI abierta alimenta a OpenAI

Codex Security CLI: Código del cliente bajo Apache-2.0 abierto, Backend de escaneo en fase beta limitada contra infraestructura de OpenAI.

Una revista de Evernine Media GmbH
Paquete Versión maliciosa Versión segura
@asyncapi/generator 3.3.1 3.3.0
@asyncapi/generator-helpers 1.1.1 1.1.0
@asyncapi/generator-components 0.7.1 0.7.0 / 1.0.0
@asyncapi/specs 6.11.2 / 6.11.2-alpha.1 6.11.1