Entradas Mensuales

Síguenos en:

Canal Oficial Telegram de elhacker.NET Grupo Facebook elhacker.NET Twitter elhacker.NET Canal Youtube elhacker.NET Comunidad Steam: Grupo elhacker.NET Mastodon

Entradas populares

PostHeaderIcon Secuestran 42 repositorios de GitHub para infectar usuarios de Claude, Gemini y Cursor


Han implantado discretamente malware en 42 repositorios reales de GitHub. Estas trampas se activan cuando un desarrollador abre el proyecto utilizando herramientas como Claude, Gemini, Cursor o VS Code. Los repositorios pertenecen a 11 propietarios legítimos y el código malicioso se encuentra oculto en un archivo llamado .github/init.js.





Han plantado silenciosamente malware en 42 repositorios reales de GitHub. Las trampas se activan cuando un desarrollador abre un proyecto con Claude, Gemini, Cursor o VS Code. Los repositorios pertenecen a 11 propietarios legítimos, incluyendo desarrolladores independientes, estudiantes y una empresa.

El código oculto se encuentra en un archivo llamado .github/init.js, y es enorme, mide entre 12.9 MB y 13.7 MB. Archivos de configuración pequeños para cada herramienta llaman a este script cuando se inicia una sesión o se abre una carpeta.

A los desarrolladores ya les preocupa la inyección de prompts en los comentarios de GitHub que engaña a los agentes de IA, pero este caso no necesita ningún prompt ingenioso. Simplemente abusa de los ganchos (hooks) de inicio en los que confían las herramientas.

Investigadores de JFrog Security Research identificaron los repositorios armados mientras indagaban en un gusano de npm que rastrean como la campaña "testmetest".

Otra firma, SafeDep, había descrito primero la parte de npm el 22 de octubre y reportó que no había víctimas confirmadas. La mirada de JFrog hacia el lado de GitHub mostró que los repositorios reales ya habían sido armados.

Secuestran 42 repositorios de GitHub

La carga útil (payload) es una reconstrucción de un publicador de CI oculto llamado ci.js. Un publicador de CI es un script que se ejecuta dentro de GitHub Actions y envía nuevos paquetes a npm.

JFrog afirma que el operador quería convertir el acceso robado de GitHub y npm en nuevos lanzamientos maliciosos, que luego alimentan el ciclo con más accesos robados. La misma campaña de cadena de suministro TrapDoor también apuntaba a asistentes de codificación de IA, por lo que este truco no es del todo nuevo.

En cada repositorio víctima, los archivos de gancho esperan un activador. El archivo de configuración de Claude, por ejemplo, ejecuta node .github/init.js || bun .github/init.js al iniciar la sesión.

Se colocaron activadores coincidentes para Gemini, la configuración MCP de Cursor y las tareas de apertura de carpetas de VS Code. Algunos proyectos también tenían cambios en package.json, composer.json o Makefile. En términos sencillos, un hábito normal como abrir un espacio de trabajo podría ejecutar la carga útil.

Los archivos permanecieron ocultos debido a su tamaño. La búsqueda de código de GitHub no indexó los bloques enormes y la API de contenidos no podía devolverlos.


Cadena de ataque (Fuente – JFrog)

El primer barrido de JFrog encontró 26 repositorios, y los archivos parecían vacíos. Al revisar los árboles de repositorios directamente, el total aumentó a 42. The Register también cubrió los hallazgos.

Las 10 variantes de envoltura se decodifican en la misma carga útil, por lo que las diferencias de tamaño no cambian lo que hace. El atacante también falsificó el historial. El 28 de septiembre, lotes programados copiaron mensajes y fechas de commits antiguos del historial real y añadieron skip-checks:true. Eso hizo que la actividad pareciera mucho más antigua de lo que realmente era.

JFrog rastreó varias identidades secuestradas. Una cuenta, leamasuero, pertenecía a un desarrollador con un historial de trabajo real desde 2014 hasta 2022.

Para julio de 2026 se utilizó para pruebas, y el 28 de septiembre el atacante renombró repositorios y armó 13 de ellos en dos minutos. En la cuenta de la empresa, Crayon-Biz-LLP, los commits provinieron de al menos dos miembros, lo que sugiere varias credenciales robadas.

La parte de npm también cambió de táctica. Tres paquetes llevan un complemento nativo compilado y un archivo cifrado llamado .napi_cache. El complemento lo descifra con la clave XOR 0x96, deposita un script en una carpeta temporal y lo ejecuta en segundo plano.

Permanece inactivo en sistemas de CI, contenedores, máquinas virtuales pequeñas y depuradores, por lo que los escáneres automatizados no lo detectan. La versión de Windows también busca herramientas como Wireshark, Fiddler y x64dbg. Este es el tipo de cebo con apariencia confiable visto en la campaña de herramientas de IA falsas que apunta a desarrolladores.

JFrog también encontró flujos de trabajo de escaneo en las mismas cuentas secuestradas. Descargan una herramienta en /tmp/.svc y buscan sistemas cPanel y WHM vulnerables a CVE-2026-41940, una omisión de autenticación.

JFrog no encontró pruebas de que ningún servidor cPanel fuera realmente vulnerado. El enlace está operativo, pero no hay una cadena probada desde cada infección de npm hasta el exploit.

Si eres defensor, deberías eliminar las versiones maliciosas de los paquetes y reconstruir los sistemas afectados desde fuentes confiables. Deberías rotar las credenciales de GitHub, npm, nube, SSH y proveedores de IA, y revisar cada repositorio accesible en busca de los archivos de gancho mencionados arriba.

Tus equipos deberían leer los árboles de repositorios directamente en lugar de confiar en la búsqueda. También deberían estar atentos al envenenamiento de asistentes de IA mediante HalluSquatting, ya que las herramientas de IA pueden ser dirigidas hacia recursos falsos.

Un orden es fundamental: elimina la persistencia de net-health-checker y pkg-runtime antes de revocar el token robado de GitHub, porque el gusano contiene un limpiador de revocación de tokens.

Indicadores de compromiso (IoCs):-

TipoIndicador
C2 del Escáner43[.]228[.]157[.]68:80
Patrón de descarga del escánerhxxp[:]//43[.]228[.]157[.]68:80/api/dl/<amd64\|386\|arm\|arm64>
Endpoint de exfiltraciónhxxps[:]//aiarmor[.]website/v1/api
Descarga del cargador de complemento nativohxxps[:]//raw[.]githubusercontent[.]com/CementBeetleSteeple/node-cache-utils/main/loader.js
Cuenta de operador de GitHubCementBeetleSteeple
Marcador de campañamsync-3f7a
Prefijo de commit de depósito de tokenAutoSyncComplete:
Mensaje de commit / tráilerchore: sync; skip-checks:true
Marcador de commit de infecciónshellpanel execution smoke
Patrones de ramachore/ci-<hex>; deps/upd-<digits>
Patrón de archivo de exfiltracióndata/snap-<timestamp>-<n>.json
Paquetes npm maliciososdata-pipeline-testmetest, event-bus-lite-testmetest, event-emitter-testmetest, log-rotate-testmetest, log-sink-testmetest, net-codec-testmetest, npm-publish-testmetest, pixel-map-testmetest, retry-utils-testmetest, test-brotli-testmetest, test-brotli2-testmetest, @iobandamwer/cache-helper, @iobandamwer/native-helper, path-stream-utils-testmetest
SHA-256, carga útil del publicador víctima _p9d83919bfdb0e14018f1a6f2b8b6586de59b60dfdcfbdb5ae1a1556c23cc4793
SHA-256, bootstrap de Bun víctima _b3dc40fc55302664c07c9d9182ffd95910aeb366fcd417fbdad0a90cdeb8ea69e
SHA-256, carga útil del publicador ci.js8506042b383ab46545c27a402eb2dc973696a93af71181b175b1d87972843a43
SHA-256, carga útil del publicador ci.js v3783a4ac906cc9b2eaf5cd13408ea95db6ce52a46d9af11aad1a5b167af69589f
SHA-256, cargador stable-scripts-9965a516dd7867af83f8be0cc3e926fdfd964097f0e7665596b05fe5234be7e2b5e9
SHA-256, etapa decodificada stable-scripts-9965ccfd769acc024edc409ef879198d2a2398beee60930f2b3f2771ded1e14e0c57
SHA-256, carga útil del publicador stable-scripts-99657ad216b3afd2f40a147c80733c7309fb3d3a7f52ee78149c8e51672cfb617d07
SHA-256, Shellpanel mocke3cb383615fc70bce9b5bcd1c7a394132b50483daaf231a04ee90d4690962c73
SHA-256, herramienta marcador Shellpanel17614e98b613b17d0e1bb7125ab203715dd397661b897d8d18dbb77864c1839f
Archivos y rutas.github/init.js, /tmp/.svc, addon.node, addon_win.node, .napi_cache (clave XOR 0x96), /tmp/.<pid>, /tmp/.hc, %TEMP%\.nc<PID>.js, artefacto falso de CodeQL scan-output
Persistencianet-health-checker, pkg-runtime, ~/.local/bin/net-health-checker.sh, ~/.config/net-health-checker/, ~/.local/share/runtimes/sync.py, /var/tmp/.fontconfig_state
Ganchos de IA e IDE.claude/settings.json, .gemini/settings.json, .cursor/mcp.json, .cursor/rules/setup.mdc, .vscode/tasks.json

Nota: Las direcciones IP y los dominios han sido desarmados intencionadamente (por ejemplo, [.]) para evitar la resolución accidental o los hipervínculos. Vuelve a armarlos solo dentro de plataformas de inteligencia de amenazas controladas como MISP, VirusTotal o tu SIEM.



Fuentes:
https://cybersecuritynews.com/hackers-hijack-42-github-repositories/