
Dossier técnico sobre el ataque a la cadena de suministro PolinRider vinculado a la RPDC, que documenta la inyección de payload JS ofuscado, la manipulación del historial de git, la infraestructura C2 y la guía de remediación para 1,951 repositorios comprometidos.

El equipo de OpenSourceMalware ha descubierto una campaña masiva de amenazas que está implantando malware en repositorios de usuarios y organizaciones de GitHub. El actor de amenazas, PolinRider, ha implantado cargas útiles maliciosas de JavaScript ofuscado en cientos de repositorios públicos de GitHub pertenecientes a cientos de propietarios únicos. Utilice la etiqueta #polinrider para ver todos los informes de amenazas relacionados con esta campaña, y salte al final de este blog para ver la lista de repositorios comprometidos, incluidos aquellos que recomendamos priorizar para una acción inmediata. Tenga en cuenta que la etiqueta es la mejor manera de obtener datos actualizados.
La carga útil de JavaScript se agrega al final de los archivos de configuración reales del proyecto, silenciosamente, después del contenido legítimo del archivo, lo que facilita pasarlo por alto durante una revisión de código casual. El vector de infección principal parece ser un paquete npm comprometido que se ejecuta durante la instalación o compilación y se inyecta en los archivos de configuración en la raíz del proyecto. Peor aún, este actor de amenazas ha utilizado la misma técnica para crear paquetes NPM maliciosos también.
Este ataque ha sido enormemente exitoso, con un proyecto de código abierto comprometido, Neutralinojs, propagando el malware a cientos de sus usuarios y contribuyentes. Neutralinojs es un proyecto muy popular con 8400 estrellas, 495 bifurcaciones y docenas de contribuyentes activos. Este es el poder de este tipo de ataque, ya que la amenaza no se limita solo a los repositorios iniciales de GitHub, sino que se extiende a todos los demás proyectos que utilizan ese código abierto.
El equipo de OpenSourceMalware ha atribuido esta campaña a Corea del Norte, y el actor de amenazas PolinRider es un conocido colaborador del grupo Lazarus con conexiones con las campañas "Contagious Interview" y "TasksJacker".
Esta campaña ha crecido drásticamente desde su primera publicación. A partir del 2026-04-11, el equipo de OSM ha confirmado que 1.951 repositorios públicos de GitHub pertenecientes a 1.047 propietarios únicos están comprometidos. Esto es un aumento de 2.9× en las cinco semanas desde la fecha de publicación original (8 de marzo: 675 repos / 352 propietarios).
| Métrica | 8 de marzo (inicial) | 11 de abril (último) | Δ |
|---|---|---|---|
| Repositorios únicos infectados | 675 | 1,951 | +1,276 |
| Propietarios únicos afectados | 352 | 1,047 | +695 |
| — Usuarios individuales | 305 | ~930 | +625 |
| — Organizaciones | 47 | ~117 | +70 |
| Variantes distintas de ofuscador observadas | 1 (rmcej%otb%) | 2 (rmcej%otb% + Cot%3t=shtP) | +1 |
| Vectores de inyección distintos confirmados | 1 (config file) | 4 (config file, .vscode/tasks.json, fake .woff2 font, malicious npm dep) | +3 |
| Subdominios C2 distintos documentados | 1 (260120.vercel.app) | 6+ (see C2 Infrastructure) | +5 |
| Plantillas de prueba técnica armadas conocidas | 0 | 2+ (ShoeVista, StakingGame) | +2 |

En una caza de seguimiento iniciada el 2026-04-10 y continuada hasta el 2026-04-11, el equipo de OSM realizó varios hallazgos importantes:
La campaña se ha más que duplicado en 5 semanas. La enumeración entre motores a través de GitHub Code Search y Sourcegraph (con refinamiento más allá del límite de 1000 resultados de la API — ver metodología abajo) encontró 1.556 repositorios únicos comprometidos en nuestro maestro v3 en el primer día. Una segunda ronda de caza en el segundo día agregó otros 215 nuevos repos a través de pivotes de nombres de paquetes npm, pivotes de tareas.json de VS Code / proveedor de nube, y el subdominio C2 recién descubierto default-configuration.vercel.app. Después de deduplicar contra el corpus existente affected_repos.csv, el alcance conocido real es ahora 1.951 repositorios víctima únicos / 1.047 propietarios únicos.
Se ha observado una nueva variante. PolinRider ha rotado todas las huellas dactilares únicas de su ofuscador mientras preserva la arquitectura. La nueva variante utiliza el marcador de firma Cot%3t=shtP (anteriormente rmcej%otb%), semilla de barajado 1111436 (anteriormente 2857687), semilla secundaria 3896884 (anteriormente 2667686), y nombre de función decodificadora MDy (anteriormente _$_1e42). Esta rotación parece ser una respuesta de evasión a la regla YARA rmcej_otb_payload publicada. Ambas variantes están actualmente activas en la naturaleza. Consulte Nueva variante: Cot%3t=shtP más abajo.
El actor de amenazas está reinfectando a víctimas anteriores. Al menos un repositorio víctima (HassanHabibTahir/testclient) contiene marcadores de AMBAS variantes en diferentes archivos, lo que indica que las herramientas del actor se están reejecutando contra hosts previamente comprometidos e inyectando el nuevo ofuscador.
PolinRider y TasksJacker se han fusionado operativamente. Ahora tenemos evidencia directa de que el mismo actor de amenazas está ejecutando tanto la inyección de archivos de configuración como el vector de infección curl-to-shell de .vscode/tasks.json contra la misma población de víctimas. 22 de las 101 víctimas del script de propagación temp_auto_push.bat también tienen archivos .vscode/tasks.json maliciosos, y se han identificado múltiples proyectos de plantillas armadas de prueba técnica o falsas entrevistas — consulte Weaponized Take-Home Templates más abajo. OSM está fusionando los dos grupos bajo #polinrider en adelante.
Dos proyectos de prueba técnica armados identificados: ShoeVista (una evaluación falsa de comercio electrónico en Tailwind que incluye tailwindcss-style-animate ^1.1.6 malicioso en client/package.json) y StakingGame (un proyecto falso de blockchain/automatización de VS Code identificado por el UUID e9b53a7c-2342-4b15-b02d-bd8b8f6a03f9 en tasks.json). Al menos 46 + 42 desarrolladores intentaron estas pruebas y fueron comprometidos. Parte del manual de atracción de Contagious Interview.
Se descubrieron cinco nuevos subdominios C2 que se están utilizando en cargas útiles curl | bash de .vscode/tasks.json, todos alojados en Vercel:
default-configuration.vercel.app (el más usado, ~106 referencias de víctimas)vscode-settings-bootstrap.vercel.appvscode-settings-config.vercel.appvscode-bootstrapper.vercel.appvscode-load-config.vercel.appTodos siguen el patrón https://<sub>.vercel.app/settings/(mac|linux|win)?flag=<N>. Añadidos a la sección C2 Infrastructure.