
Dossiê técnico sobre o ataque à cadeia de suprimentos PolinRider ligado à Coreia do Norte, documentando injeção de payload JS ofuscado, manipulação do histórico do git, infraestrutura C2 e orientação de remediação para 1,951 repositórios comprometidos.

A equipe do OpenSourceMalware descobriu uma campanha massiva de ameaça que está implantando malware em repositórios de usuários e organizações do GitHub. O ator de ameaça, PolinRider, implantou cargas úteis JavaScript ofuscadas maliciosas em centenas de repositórios públicos do GitHub pertencentes a centenas de proprietários únicos. Use a tag #polinrider para ver todos os relatórios de ameaça relacionados a esta campanha, e vá para o final deste blog para a lista de repositórios comprometidos, incluindo aqueles que recomendamos priorizar para ação imediata. Lembre-se de que a tag é a melhor forma de obter dados atuais.
A carga útil JavaScript é anexada ao final de arquivos de configuração reais de projetos — silenciosamente, após o conteúdo legítimo do arquivo — tornando fácil de ser perdida durante uma revisão de código casual. O vetor de infecção principal parece ser um pacote npm comprometido que é executado durante a instalação ou build e injeta a si mesmo em arquivos de configuração na raiz do projeto. Ainda pior, este ator de ameaça usou a mesma técnica para criar pacotes NPM maliciosos também.
Este ataque foi extremamente bem-sucedido, com um projeto de código aberto comprometido, o Neutralinojs, espalhando o malware para centenas de seus usuários e contribuidores. O Neutralinojs é um projeto muito popular com 8.400 estrelas, 495 forks e dezenas de contribuidores ativos. Este é o poder desse tipo de ataque, pois a ameaça não se limita apenas aos repositórios iniciais do GitHub, mas se estende a todos os outros projetos que usam esse código aberto.
A equipe do OpenSourceMalware atribuiu esta campanha à Coreia do Norte, e o ator de ameaça PolinRider é um contribuidor conhecido do grupo Lazarus com conexões com as campanhas "Contagious Interview" e "TasksJacker".
Esta campanha cresceu dramaticamente desde a primeira publicação. Em 2026-04-11, a equipe OSM confirmou 1.951 repositórios públicos do GitHub pertencentes a 1.047 proprietários únicos comprometidos. Isso é um aumento de 2,9× nas cinco semanas desde a data de publicação original (8 de março: 675 repositórios / 352 proprietários).
| Métrica | 8 de março (inicial) | 11 de abril (mais recente) | Δ |
|---|---|---|---|
| Repositórios únicos infectados | 675 | 1.951 | +1.276 |
| Proprietários únicos afetados | 352 | 1.047 | +695 |
| — Usuários individuais | 305 | ~930 | +625 |
| — Organizações | 47 | ~117 | +70 |
| Variantes distintas de ofuscador observadas | 1 (rmcej%otb%) | 2 (rmcej%otb% + Cot%3t=shtP) | +1 |
| Vetores distintos de injeção confirmados | 1 (arquivo de configuração) | 4 (arquivo de configuração, .vscode/tasks.json, fonte .woff2 falsa, dep npm malicioso) | +3 |
| Subdomínios C2 distintos documentados | 1 (260120.vercel.app) | 6+ (veja Infraestrutura C2) | +5 |
| Modelos de teste prático armados conhecidos | 0 | 2+ (ShoeVista, StakingGame) | +2 |

Em uma caça de acompanhamento iniciada em 2026-04-10 e continuada em 2026-04-11, a equipe OSM fez várias descobertas importantes:
A campanha mais que dobrou em 5 semanas. Enumeração cruzada via GitHub Code Search e Sourcegraph (com refinamento além do limite de 1.000 resultados da API — veja metodologia abaixo) revelou 1.556 repositórios comprometidos únicos em nosso mestre v3 no primeiro dia. Uma caça de rodada 2 no segundo dia adicionou outros 215 novos repositórios via pivôs de nomes de pacotes npm, pivôs de tasks.json / provedor de nuvem do VS Code e o recém-descoberto subdomínio C2 default-configuration.vercel.app. Após deduplicação contra o corpus existente affected_repos.csv, o escopo verdadeiro conhecido é agora 1.951 repositórios vítima únicos / 1.047 proprietários únicos.
Uma nova variante foi observada. O PolinRider rotacionou todas as impressões digitais únicas de seu ofuscador preservando a arquitetura. A nova variante usa o marcador de assinatura Cot%3t=shtP (era rmcej%otb%), semente de embaralhamento 1111436 (era 2857687), semente secundária 3896884 (era 2667686) e nome da função decodificadora MDy (era _$_1e42). Essa rotação parece ser uma resposta de evasão à regra YARA rmcej_otb_payload publicada. Ambas as variantes estão atualmente ativas na natureza. Veja Nova Variante: Cot%3t=shtP abaixo.
O ator de ameaça está reinfectando vítimas anteriores. Pelo menos um repositório vítima (HassanHabibTahir/testclient) contém marcadores de AMBAS as variantes em arquivos diferentes, indicando que as ferramentas do ator estão sendo executadas novamente contra hosts previamente comprometidos e injetando o novo ofuscador.
PolinRider e TasksJacker se fundiram operacionalmente. Agora temos evidências diretas de que o mesmo ator de ameaça está executando tanto a injeção em arquivo de configuração quanto o vetor de infecção curl-to-shell do .vscode/tasks.json contra a mesma população vítima. 22 das 101 vítimas do script de propagação temp_auto_push.bat também possuem arquivos maliciosos .vscode/tasks.json, e múltiplos projetos de modelo de teste prático / entrevista falsa armados foram identificados — veja Modelos de Teste Prático Armados abaixo. OSM está consolidando os dois clusters sob o rótulo #polinrider daqui em diante.
Dois projetos de teste prático armados identificados: ShoeVista (um site de avaliação falso de Tailwind e-commerce que vem com tailwindcss-style-animate ^1.1.6 malicioso em client/package.json) e StakingGame (um projeto falso de blockchain / automação VS Code identificado pelo UUID e9b53a7c-2342-4b15-b02d-bd8b8f6a03f9 em tasks.json). Pelo menos 46 + 42 desenvolvedores tentaram esses testes e foram comprometidos. Parte do manual de isca do Contagious Interview.
Cinco novos subdomínios C2 descobertos que estão sendo usados em cargas curl | bash de .vscode/tasks.json, todos hospedados no Vercel:
default-configuration.vercel.app (mais usado, ~106 referências de vítimas)vscode-settings-bootstrap.vercel.appvscode-settings-config.vercel.appvscode-bootstrapper.vercel.appvscode-load-config.vercel.appTodos seguem o padrão https://<sub>.vercel.app/settings/(mac|linux|win)?flag=<N>. Adicionados à seção Infraestrutura C2.
OSM submeteu 821 novos relatórios de ameaça ao longo desta caça de dois dias, elevando o total de entradas PolinRider do OSM para aproximadamente ~1.700. Detalhamento das variantes das 821 submissões: 591 variante original (rmcej%otb%), 113 apenas propagação (temp_auto_push.bat), 45 malicious_npm (cluster ShoeVista/devhire), 27 tasksjacker, 1 nova variante (Cot%3t=shtP), 44 outros.