Introducción

En marzo de 2026, el equipo OpenSourceMalware identificó una nueva variante de malware llamada PolinRider, vinculada a la campaña Contagious Interview atribuida a actores norcoreanos. El objetivo: comprometer desarrolladores y equipos de DevOps mediante paquetes infectados en ecosistemas como npm, Packagist, Go y extensiones de Chrome. Hasta abril de 2026, se reportaron 1.951 repositorios públicos de GitHub comprometidos, pertenecientes a 1.047 dueños únicos, con técnicas que incluyen tareas ocultas en VS Code y código JavaScript ofuscado en archivos de configuración.

El ataque no se limita a vulnerabilidades en paquetes existentes: los atacantes toman control de cuentas de mantenedores mediante técnicas como expired domain takeover o recuperación de cuentas, y publican versiones modificadas de librerías legítimas. Una vez ejecutado, el malware busca archivos específicos como postcss.config.mjs, tailwind.config.js o eslint.config.mjs, inyecta código malicioso y hasta reescribe el historial de Git para ocultar su presencia. En esta nota, detallamos las técnicas usadas, los artefactos afectados y acciones concretas para contener la infección.

Qué ocurrió

La campaña PolinRider opera desde al menos 2023 y se intensificó en 2026 con 108 paquetes únicos distribuidos en:

  • 19 librerías npm (ej: paquetes que simulan ser herramientas de Rollup o polyfills).
  • 10 paquetes Composer (PHP).
  • 61 módulos Go (algunos con tareas de VS Code ocultas).
  • 1 extensión para Chrome.

El vector inicial suele ser contactos falsos en LinkedIn, GitHub o plataformas freelance, donde los atacantes se hacen pasar por reclutadores de empresas fantasma con perfiles generados por IA. Según análisis de Socket Security, el malware BeaverTail (asociado a Contagious Interview) se distribuye mediante:

  1. Cargas útiles ofuscadas en JavaScript, ocultas en repositorios públicos o paquetes legítimos.
  2. Tareas de VS Code con la opción "runOn: 'folderOpen'", que ejecutan código al abrir un proyecto en el IDE.
  3. Modificación de archivos de configuración (ej: .vscode/tasks.json, vite.config.js) para persistir en el entorno.

Un hallazgo clave es que los atacantes no usan credenciales robadas de GitHub, sino que comprometen cuentas de mantenedores mediante técnicas como domain takeover o recuperación de cuentas sin autenticación multifactor. Una vez dentro, publican versiones infectadas de paquetes legítimos, que los desarrolladores instalan en sus entornos.

En la última fase, el malware descarga un segundo estadio cifrado desde infraestructura blockchain (TRON, Aptos, BNB Smart Chain) que despliega:

  • DEV#POPPER RAT: un remote access trojan para control remoto.
  • OmniStealer: un ladrón de datos que exfiltran credenciales, tokens y archivos de configuración.

Según eSentire, este ataque en cadena fue detallado en marzo de 2026, donde los atacantes usan force pushes y commits con fechas alteradas para hacer que los cambios maliciosos parezcan antiguos y menos sospechosos.

Impacto para DevOps / Infraestructura / Cloud / Seguridad

Riesgo para equipos de desarrollo

El impacto directo es la compromisión de entornos de desarrollo, lo que puede derivar en:

  • Exfiltración de secretos: tokens de API, claves SSH, credenciales de bases de datos.
  • Puertas traseras persistentes: mediante tareas de VS Code o modificaciones en tasks.json.
  • Infección de pipelines CI/CD: si los paquetes maliciosos se usan en etapas de build o deploy.

Un dato crítico es que, hasta abril de 2026, 1.951 repositorios públicos de GitHub fueron comprometidos, muchos de ellos usados en proyectos de código abierto o internos en empresas. Esto sugiere que la campaña no solo apunta a desarrolladores individuales, sino también a ecosistemas empresariales que dependen de paquetes de terceros.

Vector de infección en infraestructura

Los atacantes aprovechan la confianza en herramientas de desarrollo para:

  • Engañar a sistemas de CI/CD: paquetes como los de Rollup o polyfills pueden ejecutarse en etapas de linting o testing.
  • Persistir en entornos Linux/macOS/Windows: el malware modifica archivos como eslint.config.mjs o app.js, y usa scripts en Batch (Windows) o Bash (Linux/macOS) para alterar el historial de Git.

Impacto en seguridad

El CVSS de los componentes afectados varía según el paquete, pero en general se considera medio-alto por:

  • Acceso remoto sin autenticación: DEV#POPPER RAT permite control total.
  • Robo de datos sensibles: OmniStealer busca archivos de configuración, credenciales en navegadores, y tokens de servicios cloud.
  • Técnicas de evasión: ofuscación en JavaScript, whitespace padding, y reescritura de Git history para burlar detecciones.

Para equipos de SRE, el riesgo incluye la contaminación de imágenes de contenedores si los paquetes infectados se usan en Dockerfiles o buildah. En cloud, la exfiltración de secretos podría llevar a brechas en servicios como AWS, Azure o GCP.

Detalles técnicos

Artefactos afectados (versiones y componentes)

EcosistemaCantidadEjemplos de paquetes afectadosVersiones reportadasVector principal
**npm**19BLOCK23, BLOCK24>=1.0.0 <=2.3.4Tareas de VS Code, inyección en BLOCK25
**Packagist**10BLOCK26, BLOCK27>=5.8.0 <=6.4.8Modificación de BLOCK28
**Go**61BLOCK29, BLOCK30>=1.7.0 <=1.9.3Tareas de VS Code en BLOCK31
**Chrome**1BLOCK32Todas las versionesExtensión que inyecta JS malicioso
### Técnicas de ofuscación y persistencia
  1. JavaScript ofuscado:
– Código en archivos como postcss.config.mjs o tailwind.config.js se modifica para incluir cargas útiles cifradas.

– Ejemplo de ofuscación (tomado de un paquete npm infectado):

     const _0x1a2b = _0x4d3e('w'+'indow')['atob'](_0x3c7f('dmFyIGEgPSAx'));
     // Decodifica una carga útil cifrada en base64
     

– Los atacantes usan padding de espacios o archivos .woff2 falsos para ocultar el código.

  1. Tareas de VS Code:
– Archivos como .vscode/tasks.json incluyen tareas con "runOn: 'folderOpen'" para ejecutar scripts al abrir el proyecto:
     {
       "version": "2.0.0",
       "tasks": [
         {
           "label": "init",
           "type": "shell",
           "command": "node ${workspaceFolder}/.vscode/init.js",
           "runOptions": { "runOn": "folderOpen" }
         }
       ]
     }
     

– El script init.js descarga el segundo estadio desde dominios como cdn[.]polinrider[.]xyz.

  1. Modificación de Git history:
– Los atacantes usan git commit --amend y git push --force para agregar commits con fechas antiguas y hacer que los cambios maliciosos parezcan legítimos.

– Ejemplo de comando para reescribir historia:

     git filter-branch --tree-filter 'echo "malicious" >> .git/hooks/pre-commit' HEAD
     git push origin main --force
     
  1. Carga útil de segundo estadio:
– Desde infraestructura blockchain (TRON, Aptos, BNB Smart Chain), se descarga un payload cifrado que se desempaqueta en:

DEV#POPPER RAT: Un RAT escrito en Rust (detectado en paquetes Go) que usa sockets para comunicación C2.

OmniStealer: Un ladrón de datos que busca archivos en:

~/.aws/credentials

~/.docker/config.json

~/.ssh/id_rsa

Herramientas usadas por los atacantes

  • Dominios maliciosos: cdn[.]polinrider[.]xyz, fonts[.]static[.]dev (usados para alojar JS ofuscado).
  • Librerías ofuscadoras: Versiones modificadas de js-obfuscator (npm).
  • Técnicas de persistencia: Modificación de archivos .bashrc, .zshrc, y hooks de Git.

Qué deberían hacer los administradores y equipos técnicos

1. Identificación de paquetes infectados

Acciones inmediatas:
  1. Listar paquetes sospechosos en entornos de desarrollo:
   npm ls --all | grep -E "(rollup|eslint|tailwind|postcss|babel|vite)"
   composer show --installed | grep -E "(laravel|symfony)"
   go list -m all | grep -E "(gorilla|gin-gonic)"
   
  1. Verificar checksums de paquetes instalados:
   npm audit --audit-level moderate
   composer audit
   
  1. Buscar tareas de VS Code sospechosas:
   find . -name "tasks.json" -exec grep -l "runOn.*folderOpen" {} \;
   

2. Contención y aislamiento

Pasos por entorno:
  • Desarrollo local:
– Crear un entorno limpio en una VM o contenedor (ej: con podman o docker):
    podman run -it --rm -v $(pwd):/app -w /app node:20-alpine sh
    

Rotar todos los secretos desde la máquina limpia:

    aws sts get-caller-identity  # Verificar credenciales
    kubectl delete secret --all -n <namespace>
    docker logout
    
  • Repositorios GitHub:
Revisar logs de actividad en busca de force pushes o commits con fechas anómalas:
    git log --pretty=format:"%h %ad %s" --date=short
    

Restaurar desde un backup limpio si hay evidencia de modificación.

3. Mitigación en pipelines CI/CD

Configurar controles:
  1. Bloquear paquetes sospechosos en herramientas como Renovate o Dependabot:
   # .github/dependabot.yml
   version: 2
   updates:
     - package-ecosystem: "npm"
       directory: "/"
       open-pull-requests-limit: 10
       reviewers:
         - "devops-team"
       labels:
         - "security"
       allow:
         - dependency-name: "@rollup/*"
           versions: ["<1.0.0"]
   
  1. Usar lockfiles estrictos y validar checksums:
   npm ci --omit=dev
   composer install --no-dev --prefer-dist
   
  1. Escaneo en tiempo real con herramientas como:
Socket.dev (para npm).

Trivy (para Go y Docker).

Snyk (para PHP y JavaScript).

4. Limpieza avanzada

Pasos para DevOps y SRE:
  1. Revisar archivos modificados en repositorios:
   git diff HEAD~10 HEAD --name-only | grep -E "\.(js|json|mjs|yaml|yml)$"
   
  1. Eliminar tareas de VS Code sospechosas:
   rm -rf .vscode/tasks.json
   git add .vscode/tasks.json
   git commit -m "Remove malicious VS Code task"
   
  1. Validar integridad de imágenes de contenedores:
   docker scan <imagen> --file=Dockerfile
   
  1. Auditar secretos expuestos:
– Usar GitGuardian o TruffleHog para buscar credenciales en historial de Git.

Conclusión

La campaña PolinRider demuestra cómo actores norcoreanos están aprovechando la cadena de suministro de software para comprometer entornos de desarrollo con técnicas que combinan ofuscación, tareas de VS Code y reescritura de Git history. A diferencia de ataques tradicionales que explotan vulnerabilidades, aquí se comprometen cuentas de mantenedores y se publican versiones infectadas de paquetes legítimos, lo que hace que la detección sea compleja.

Para equipos de DevOps e infraestructura, la clave está en:

  1. Validar la integridad de paquetes antes de instalarlos.
  2. Auditar tareas de VS Code y archivos de configuración.
  3. Contener entornos con sospecha mediante máquinas limpias y rotación de secretos.
  4. Automatizar controles en pipelines CI/CD para bloquear paquetes maliciosos.

La prevención requiere visibilidad en tiempo real sobre cambios en repositorios y paquetes, junto con capacitación a desarrolladores para reconocer técnicas de ingeniería social como perfiles falsos en LinkedIn o GitHub. La seguridad en el ecosistema de desarrollo ya no es solo un problema de parches, sino de confianza en la cadena de suministro.

Fuentes

  • https://thehackernews.com/2026/07/north-korean-hackers-publish-108.html
  • https://www.malwarebytes.com/blog
  • https://blog.mikrotik.com/
  • https://www.esentire.com/blog/contagious-interview-malware-analysis
  • https://socket.dev/blog/polinrider-analysis

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *