Archivos de configuración ejecutables: riesgo subestimado en la cadena de suministro

Fuentes: Config Files That Run Code: Supply Chain Security Blindspot
Imagen generada por IA con el prompt: Dark code editor window with glowing config files transforming into trapdoors, red warning lights scattered, moody blue and green cyber atmosphere, abstract, no text
Imagen generada con IA

Una nueva clase de ataques a la cadena de suministro de software explota una superficie que casi nadie revisa: los archivos de configuración que editores, agentes de IA y gestores de dependencias interpretan y ejecutan de forma automática. El análisis, publicado por SafeDep, emplea como caso de estudio el gusano Miasma, detectado en un commit malicioso en el repositorio icflorescu/mantine-datatable y que ha afectado al menos a 121 repositorios.

El ataque no requiere dependencias maliciosas ni scripts de instalación ocultos. Basta con un archivo de configuración aparentemente normal que ya está en el repositorio y que herramientas como VS Code, Cursor, Claude Code, Gemini CLI, npm, Composer y Bundler leen y ejecutan al abrir la carpeta, iniciar una sesión de agente o instalar dependencias, normalmente tras un único aviso de confianza que el desarrollador acepta sin leer.

El dropper utilizado por Miasma es .github/setup.js, de 4 348 254 bytes. El tamaño no es accidental: supera el límite de ~384 KB a partir del cual GitHub deja de indexar código en las búsquedas, lo que mantiene el payload fuera de los resultados de búsqueda. El archivo aplica un desplazamiento de César sobre un array de códigos de carácter y lo pasa a eval. Decodificarlo de forma estática (desplazamiento de 4, sin ejecutarlo) revela un cargador en dos fases escrito para Bun, que descifra con AES un ladrón de credenciales capaz de localizar secretos de AWS, Azure, GCP, Vault, Kubernetes, npm y GitHub y exfiltrarlos a repositorios públicos controlados por el atacante.

Siete archivos de configuración actúan como lanzadores. Cada uno contiene una única cadena —node .github/setup.js— y deja que sean las propias herramientas del desarrollador las que completen el ataque. Claude Code y Gemini CLI usan hooks de SessionStart que ejecutan comandos al abrir una sesión. Cursor recurre a una regla de proyecto con inyección de instrucciones que pide al agente ejecutar el archivo. VS Code dispara una tarea al abrir la carpeta. npm ejecuta un script de pruebas secuestrado en package.json. Composer emplea un hook post-install-cmd. Bundler coloca una llamada system() en la primera línea del Gemfile, de modo que cualquier bundle install o bundle exec lanza el dropper sin instalar una gema maliciosa.

Los vectores de editor no son bypasses silenciosos: VS Code, Claude Code y Gemini CLI muestran avisos de confianza la primera vez que se abre una carpeta. El ataque no los evade, sino que se apoya en que los desarrolladores los descartan como quien cierra un banner de cookies. Una vez concedida la confianza, el hook se ejecuta en cada sesión posterior sin nueva confirmación, y desde la versión 2.1.0 los hooks de SessionStart de Claude Code ni siquiera imprimen salida. La variante de Claude Code está registrada como CVE-2025-59536 y CVE-2026-21852. Los vectores de los gestores de paquetes carecen de filtro de confianza: npm test, composer install y bundle ejecutan sus hooks como parte habitual del trabajo, lo que los sitúa en el mismo modelo de amenaza aunque no se abra ninguna carpeta. El análisis identifica los siete vectores documentados y empieza a delinear los rasgos comunes que vuelven peligroso a un archivo de configuración, si bien el texto se interrumpe al iniciar la caracterización de la clase.