
Dossier tecnico sull'attacco alla supply chain PolinRider collegato alla Corea del Nord, che documenta l'iniezione di payload JS offuscati, la manipolazione della cronologia git, l'infrastruttura C2 e le linee guida per la remediation per 1,951 repository compromessi.

Il team di OpenSourceMalware ha scoperto una massiccia campagna minacciosa che sta infettando i repository degli utenti e delle organizzazioni di GitHub. L'attore minaccioso, PolinRider, ha impiantato payload JavaScript offuscati e dannosi in centinaia di repository pubblici di GitHub appartenenti a centinaia di proprietari unici. Usa il tag #polinrider per vedere tutti i report delle minacce relativi a questa campagna, e salta alla fine di questo blog per la lista dei repository compromessi, inclusi quelli che raccomandiamo di prioritizzare per azione immediata. Tieni presente che il tag è il modo migliore per ottenere dati aggiornati.
Il payload JavaScript viene aggiunto alla fine dei veri file di configurazione del progetto — silenziosamente, dopo il contenuto legittimo del file — rendendolo facile da perdere durante una revisione del codice casuale. Il vettore di infezione primario sembra essere un pacchetto npm compromesso che viene eseguito durante l'installazione o la build e si inietta nei file di configurazione nella root del progetto. Ancora peggio, questo attore minaccioso ha usato la stessa tecnica per creare anche pacchetti NPM dannosi.
Questo attacco ha avuto un enorme successo, con un progetto open source compromesso, Neutralinojs, che ha diffuso il malware a centinaia dei suoi utenti e contributori. Neutralinojs è un progetto molto popolare con 8400 stelle, 495 fork e dozzine di contributori attivi. Questo è il potere di questo tipo di attacco, poiché la minaccia non si limita ai soli repository GitHub iniziali, ma si estende a tutti gli altri progetti che utilizzano quell'open source.
Il team di OpenSourceMalware ha attribuito questa campagna alla RPDC, e l'attore minaccioso PolinRider è un noto collaboratore del gruppo Lazarus con collegamenti alle campagne "Contagious Interview" e "TasksJacker".
Questa campagna è cresciuta drammaticamente dalla prima pubblicazione. Al 2026-04-11, il team OSM ha confermato che 1.951 repository pubblici di GitHub appartenenti a 1.047 proprietari unici sono compromessi. Questo è un aumento di 2,9× nelle cinque settimane dalla data di pubblicazione originale (8 marzo: 675 repo / 352 proprietari).
| Metrica | 8 marzo (iniziale) | 11 aprile (ultimo) | Δ |
|---|---|---|---|
| Repository unici infetti | 675 | 1.951 | +1.276 |
| Proprietari unici colpiti | 352 | 1.047 | +695 |
| — Utenti individuali | 305 | ~930 | +625 |
| — Organizzazioni | 47 | ~117 | +70 |
| Varianti distinte di offuscamento osservate | 1 (rmcej%otb%) | 2 (rmcej%otb% + Cot%3t=shtP) | +1 |
| Vettori di iniezione distinti confermati | 1 (file di configurazione) | 4 (file di configurazione, .vscode/tasks.json, falso font .woff2, dipendenza npm dannosa) | +3 |
| Sottodomini C2 distinti documentati | 1 (260120.vercel.app) | 6+ (vedi Infrastruttura C2) | +5 |
| Modelli take-home weaponizzati conosciuti | 0 | 2+ (ShoeVista, StakingGame) | +2 |

In una caccia di follow-up iniziata il 2026-04-10 e proseguita fino al 2026-04-11, il team OSM ha fatto diverse scoperte importanti:
La campagna è più che raddoppiata in 5 settimane. L'enumerazione cross-engine tramite GitHub Code Search e Sourcegraph (con raffinamento oltre il limite di 1000 risultati dell'API — vedi metodologia sotto) ha portato alla luce 1.556 repository unici compromessi nel nostro master v3 al primo giorno. Una seconda caccia il giorno successivo ha aggiunto altri 215 nuovi repo tramite pivot sui nomi dei pacchetti npm, pivot su VS Code tasks.json / cloud-provider, e il sottodominio C2 appena scoperto default-configuration.vercel.app. Dopo la deduplicazione rispetto al corpus esistente affected_repos.csv, il vero ambito noto è ora 1.951 repo vittima unici / 1.047 proprietari unici.
È stata osservata una nuova variante. PolinRider ha ruotato tutte le impronte digitali uniche del suo offuscatore preservando l'architettura. La nuova variante utilizza il marcatore di firma Cot%3t=shtP (era rmcej%otb%), il seme di mescolamento 1111436 (era 2857687), il seme secondario 3896884 (era 2667686), e il nome della funzione decoder MDy (era _$_1e42). Questa rotazione sembra essere una risposta di elusione alla regola YARA rmcej_otb_payload pubblicata. Entrambe le varianti sono attualmente attive in natura. Vedi Nuova variante: Cot%3t=shtP sotto.
L'attore minaccioso sta reinfettando le vittime precedenti. Almeno un repo vittima (HassanHabibTahir/testclient) contiene marcatori di ENTRAMBE le varianti in file diversi, indicando che gli strumenti dell'attore stanno rieseguendo contro host precedentemente compromessi e iniettando il nuovo offuscatore.
PolinRider e TasksJacker si sono fusi operativamente. Abbiamo ora prove dirette che lo stesso attore minaccioso sta eseguendo sia l'iniezione nei file di configurazione sia il vettore di infezione .vscode/tasks.json curl-to-shell contro la stessa popolazione di vittime. 22 delle 101 vittime dello script di propagazione temp_auto_push.bat hanno anche file .vscode/tasks.json dannosi, e sono stati identificati molteplici progetti modello take-home / fake-interview weaponizzati — vedi Modelli Take-Home Weaponizzati sotto. OSM sta consolidando i due cluster sotto #polinrider in futuro.
Identificati due progetti di test take-home weaponizzati: ShoeVista (una falsa valutazione e-commerce Tailwind che include il dannoso tailwindcss-style-animate ^1.1.6 in client/package.json) e StakingGame (un falso progetto di automazione blockchain / VS Code identificato dall'UUID e9b53a7c-2342-4b15-b02d-bd8b8f6a03f9 in tasks.json). Almeno 46 + 42 sviluppatori hanno tentato questi test e sono stati compromessi. Parte del playbook di attrazione Contagious Interview.
Scoperti cinque nuovi sottodomini C2 utilizzati nei payload .vscode/tasks.json curl | bash, tutti ospitati su Vercel:
default-configuration.vercel.app (più usato, ~106 riferimenti vittima)vscode-settings-bootstrap.vercel.appvscode-settings-config.vercel.appvscode-bootstrapper.vercel.appvscode-load-config.vercel.appTutti seguono il pattern https://<sub>.vercel.app/settings/(mac|linux|win)?flag=<N>. Aggiunti alla sezione Infrastruttura C2.
OSM ha inviato 821 nuovi report di minacce durante questa caccia di due giorni, portando il totale delle voci OSM PolinRider a ~1.700. Ripartizione per variante degli 821 invii: 591 variante originale (rmcej%otb%), 113 solo propagazione (temp_auto_push.bat), 45 malicious_npm (cluster ShoeVista/devhire), 27 tasksjacker, 1 nuova variante (Cot%3t=shtP), 44 altri.