{"schema_version":"1.0","service":"Publicasta","type":"article","id":290,"slug":"chaindrop_shai_hulud_npm_install_secrets_2026_08_09","title":"Cuando npm install se convirtió en la brecha: ChainDrop sin pánico","excerpt":"Una guía serena sobre la ola Shai-Hulud en npm: qué ocurrió, cómo se abusó de la provenance y cómo revisar secretos de CI sin confundir descargas con víctimas.","language":"es","default_language":"en","canonical_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=es","image":{"url":"https://publicasta.com/storage/projects/9/pages/290/2026/08/97750d89-bcf8-4d9f-8916-37c6bd3565a3.webp","alt":"Grafo de dependencias con un nodo de alerta, un runner de CI y secretos protegidos"},"publisher":{"id":9,"slug":"cybersecurity","name":"Ciberseguridad sin pánico","url":"https://publicasta.com/cybersecurity"},"author":{"name":"Anton R"},"published_at":"2026-08-09T18:00:32+00:00","updated_at":"2026-08-09T18:00:32+00:00","content_markdown":"Una instalación normal de dependencias debería ser aburrida. En la nueva ola ChainDrop asociada a Shai-Hulud, ese paso rutinario fue el momento peligroso: un runner o una estación de trabajo resolvía un paquete npm comprometido, el paquete ejecutaba un script de ciclo de vida durante la instalación y el entorno donde suelen vivir tokens de publicación y accesos cloud pasaba a ser parte de la superficie de ataque.\n\n ![Grafo de dependencias con un nodo de alerta, un runner de CI y secretos protegidos](https://publicasta.com/storage/projects/9/pages/290/2026/08/97750d89-bcf8-4d9f-8916-37c6bd3565a3.webp)\n\n ## Qué ocurrió entre el 4 y el 9 de agosto\n\n Aikido, Socket, SafeDep, JFrog, Unit 42, Wiz, Endor Labs y otros equipos describieron una campaña de supply chain en npm vinculada a las familias Keyv y Cacheable. Según Aikido, el primer grupo visible empezó con una ruta de publicación comprometida para `keyv@6.0.0` y paquetes relacionados como `flat-cache`, `file-entry-cache`, `cacheable-request`, `cacheable`, `@cacheable/memory` y `cache-manager`. The Hacker News resumió después la misma semana como una campaña con comportamiento de gusano que se extendió a cientos de artefactos de paquetes.\n\n Las cifras no coinciden exactamente porque los informes se publicaron mientras el incidente seguía cambiando. JFrog habló de más de 400 paquetes afectados; SafeDep y Unit 42 ofrecieron recuentos mayores de paquetes o versiones en otros momentos; Endor Labs subrayó el enorme volumen de descargas de algunas rutas de dependencia. Esos números no deben sumarse ni leerse como número de víctimas. Miden paquetes, versiones o volumen de descargas, no máquinas infectadas.\n\n ## Por qué no fue otro paquete malicioso cualquiera\n\n Muchos incidentes de npm empiezan con un paquete de imitación o con una biblioteca casi desconocida. ChainDrop preocupa más porque la entrada incluía dependencias que muchos equipos reciben de forma transitiva. Un desarrollador puede no haber elegido nunca `keyv` directamente y aun así recibirlo a través de un framework, una capa de caché, un linter, una herramienta de build o una biblioteca de servidor. Por eso los lockfiles importan más que la memoria del equipo: la versión peligrosa puede estar varios niveles por debajo de lo que creemos haber instalado.\n\n La campaña también golpeó señales de confianza que se usan de forma razonable. Los investigadores indicaron que algunas versiones maliciosas se publicaron mediante workflows legítimos y podían mostrar provenance válido. La provenance sigue siendo útil, pero responde a una pregunta estrecha: qué flujo produjo el paquete, con qué identidad y desde qué contexto de repositorio. No demuestra que la cuenta del maintainer, el commit de release, las entradas del workflow o las credenciales fueran confiables.\n\n ## Cómo funcionó el camino durante la instalación\n\n Los informes públicos describen una cadena sencilla. Una versión comprometida añadía un comando de ciclo de vida como `preinstall` que lanzaba `node setup.mjs`. Después cargaba JavaScript ofuscado, con nombres mencionados por investigadores como `Math_Symbol.js` o `math_init.js`, y usaba Bun como runtime práctico en partes del flujo. Bun no era el componente comprometido; fue una herramienta utilizada por el payload.\n\n Al ejecutarse dentro de CI o de una máquina de desarrollo, el malware buscaba secretos: tokens de npm y GitHub, credenciales cloud, material de Vault y Kubernetes, claves SSH, `.env`, estado de Terraform, configuración de Docker y Helm, y secretos temporales disponibles para runners de GitHub Actions. En un runner de build, las credenciales de corta duración pueden aparecer en variables de entorno o memoria justo durante el job.\n\n La parte de gusano venía del acceso de publicación. Si el payload obtenía tokens de npm, podía publicar versiones infectadas de otros paquetes mantenidos por la víctima. Si obtenía acceso a GitHub, los informes describieron cambios en repositorios y superficies de persistencia, incluidos ajustes de herramientas como VS Code tasks y Claude Code settings. No todos esos archivos se ejecutan automáticamente, pero sí muestran la intención de convertir la automatización de desarrollo en el siguiente punto de entrada.\n\n ## Cómo comprobar exposición y responder\n\n Empiece por la evidencia. Busque nombres y versiones exactas publicados por Aikido, SafeDep, Socket, JFrog, Unit 42 y otros en `package-lock.json`, `npm-shrinkwrap.json`, `pnpm-lock.yaml`, `yarn.lock`, lockfiles de Bun, mirrors internos y registros de escaneo. No se limite a dependencias directas: lo transitivo es el centro del incidente.\n\n Luego determine si la instalación se ejecutó en la ventana relevante. Logs de CI, marcas de tiempo de builds, creación de cachés, historial de capas de contenedor y comandos de estaciones de trabajo permiten separar una dependencia teórica de código realmente ejecutado. Si una versión afectada solo aparece en el lockfile y no se instaló, quizá baste con fijar versiones, actualizar y documentar. Si se instaló en un entorno con secretos, trate ese entorno como expuesto.\n\n No cierre el caso con “actualizar a latest”. Actualizar evita futuras instalaciones de la versión mala, pero no devuelve un token robado. Aísle runner o estación, conserve logs útiles, reconstruya runners efímeros desde imágenes limpias y revise cachés, variables, herramientas de desarrollo y repositorios. Revoque tokens npm y GitHub, revise maintainers, 2FA y permisos, y rote cloud keys, Vault, Kubernetes, SSH y secretos de despliegue que estuvieron disponibles.\n\n La mitigación práctica es tratar los scripts de instalación como ejecución privilegiada. Use `--ignore-scripts` donde encaje, apruebe explícitamente scripts necesarios, pruebe controles de npm 12 y equivalentes en pnpm, Yarn y Bun, aplique edades mínimas de release para instalaciones automáticas, mantenga runners efímeros y separe instalar, probar y publicar. ChainDrop no prueba que el open source haya fallado; recuerda que `npm install` ejecuta código cerca de las llaves.","available_translations":[{"language":"ar","title":"عندما يصبح npm install مدخلًا للاختراق: ChainDrop بلا ذعر","html_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=ar","markdown_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.md?lang=ar","json_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=ar","api_url":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=ar"},{"language":"de","title":"Wenn npm install zur Lücke wird: ChainDrop ohne Panik","html_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=de","markdown_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.md?lang=de","json_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=de","api_url":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=de"},{"language":"en","title":"When npm install Became the Breach: ChainDrop Without Panic","html_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=en","markdown_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.md?lang=en","json_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=en","api_url":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=en"},{"language":"es","title":"Cuando npm install se convirtió en la brecha: ChainDrop sin pánico","html_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=es","markdown_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.md?lang=es","json_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=es","api_url":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=es"},{"language":"fr","title":"Quand npm install devient la brèche: ChainDrop sans panique","html_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=fr","markdown_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.md?lang=fr","json_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=fr","api_url":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=fr"},{"language":"pl","title":"Gdy npm install staje się wejściem: ChainDrop bez paniki","html_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=pl","markdown_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.md?lang=pl","json_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=pl","api_url":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=pl"},{"language":"ru","title":"Когда npm install стал точкой взлома: ChainDrop без паники","html_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=ru","markdown_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.md?lang=ru","json_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=ru","api_url":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=ru"},{"language":"zh","title":"当 npm install 变成入口：冷静看待 ChainDrop","html_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=zh","markdown_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.md?lang=zh","json_url":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=zh","api_url":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=zh"}],"_links":{"self":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=es","api":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=es","html":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=es","canonical":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09?lang=es","markdown":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.md?lang=es","json":"https://publicasta.com/cybersecurity/chaindrop_shai_hulud_npm_install_secrets_2026_08_09.json?lang=es","channel":"https://publicasta.com/api/public/v1/channels/cybersecurity","channel_articles":"https://publicasta.com/api/public/v1/channels/cybersecurity/articles","search":"https://publicasta.com/api/public/v1/search","documentation":"https://publicasta.com/api-docs#reading-publicasta","openapi":"https://publicasta.com/api-docs/openapi.json","llms":"https://publicasta.com/llms.txt"}}