Da maggio 2025, un gruppo di minaccia attribuito con alta confidenza a Lazarus Group — il collettivo di hacker sponsorizzato dallo Stato nordcoreano — conduce un’operazione silenziosa e metodica contro sviluppatori JavaScript e Python specializzati in criptovalute e blockchain. La campagna, battezzata Graphalgo dai ricercatori di ReversingLabs, ha prodotto 192 pacchetti malevoli su npm e PyPI e ha preso di mira centinaia di professionisti attraverso uno strumento di social engineering particolarmente subdolo: un colloquio di lavoro tecnico.
L’esca: la finta azienda e il finto recruiter
Tutto inizia con un messaggio su LinkedIn, Facebook o un forum come Reddit. Un recruiter — cortese, professionale, apparentemente legittimo — si presenta come rappresentante di Veltrix Capital, società nel settore blockchain-fintech con un sito web dall’aspetto curato (veltrixcap.org, registrato il 4 aprile 2025). La posizione è appetibile: sviluppatore per una piattaforma di exchange crypto. Il processo di selezione è familiare: un task tecnico, un repository GitHub da clonare, del codice da eseguire.
Il repository appartiene all’organizzazione GitHub della finta azienda e appare legittimo in tutto e per tutto. La dipendenza richiesta si chiama graphnetworkx — un nome studiato per assomigliare alla ben nota libreria networkx. Oppure graphalgo, con varianti che seguono schemi di naming come graph-* o big-* su PyPI. In totale, i ricercatori hanno identificato 106 pacchetti malevoli su npm e 86 su PyPI — 192 in tutto.
La pazienza è un tratto distintivo dell’operazione: alcuni pacchetti sono rimasti benigni per settimane dopo la pubblicazione, accumulando fino a 10.000 download prima di essere attivati con il payload malevolo — una tattica che massimizza la probabilità di infettare sistemi reali prima che i controlli automatici possano rilevare la minaccia.
La catena d’attacco: tre stadi per un RAT
Il meccanismo di infezione è sofisticato quanto discreto e si articola in tre stadi.
Primo stadio: il pacchetto malevolo
Al momento dell’installazione o dell’import, il pacchetto scarica silenziosamente un secondo stadio da GitHub — non da fork anonimi, ma da repository apparentemente innocui come un banale blog_app con un file .env.example contenente payload cifrati. Nelle varianti più recenti, la raffinatezza aumenta ulteriormente: la chiave di decifrazione non è hard-coded nel pacchetto, ma viene costruita dinamicamente dagli argomenti passati al costruttore del grafo. Ad esempio, istanziare new Graph({weighted:true, directed:true}) genera la chiave "weighted-directed-graph". Il payload rimane cifrato e inerte finché il codice legittimo del candidato non lo attiva con i parametri corretti — una tecnica progettata specificamente per eludere l’analisi automatica da parte di sandbox e scanner.
Secondo stadio: il downloader adattivo
Il secondo stadio, ospitato su GitHub, funge da downloader che utilizza l’hash SHA256 del payload stesso, concatenato con l’hostname della macchina vittima, per derivare dinamicamente l’URL del server C2. Questo rende l’infrastruttura di comando e controllo unica per ogni vittima, complicando significativamente il monitoraggio e il blocco a livello di rete.
Terzo stadio: il RAT
Il Remote Access Trojan finale esiste in tre varianti — JavaScript, Python e Visual Basic Script — e comunica periodicamente con i server C2 (codepool[.]cloud, aurevian[.]cloud) per ricevere ed eseguire comandi arbitrari. Le comunicazioni sono protette da token di autenticazione, una caratteristica già osservata in precedenti campagne nordcoreane documentate, che impedisce a terze parti di interrogare l’infrastruttura C2 anche conoscendone l’indirizzo.
L’obiettivo reale: i wallet di criptovaluta
Un dettaglio rilevatore emerge dall’analisi del RAT: il malware verifica attivamente la presenza dell’estensione browser MetaMask. Non si tratta di un tentativo generico di accesso remoto: l’obiettivo primario è il furto di asset in criptovaluta, potenzialmente con accesso alle chiavi private dei wallet o alle seed phrase. Questo allinea Graphalgo con la lunga e documentata storia di Lazarus Group nel finanziamento delle operazioni di stato nordcoreane attraverso il furto di valuta digitale — una fonte di entrate stimata in miliardi di dollari negli ultimi anni.
I marcatori di attribuzione a Lazarus Group
L’attribuzione alla cellula nordcoreana non si basa su un singolo indizio, ma su una convergenza di evidenze tecniche e operative:
- Fuso orario: i commit Git mostrano attività nel fuso GMT+9 — il fuso orario standard della Corea del Nord.
- Tecnica d’approccio: le fake recruiter campaign sono una firma operativa consolidata del gruppo, documentata in campagne precedenti come “Contagious Interview” e “DEV-0139”.
- Focus crypto: in linea con decine di operazioni precedenti finalizzate al furto di valuta digitale per finanziare il regime di Pyongyang.
- C2 token-protected: tecnica osservata in precedenti campagne DPRK e mai diventata uno standard nel cybercrime comune.
- Pazienza operativa e sviluppo attivo: la campagna è attiva da maggio 2025, con nuove varianti introdotte regolarmente; l’introduzione del naming
big-*a novembre 2025 dimostra sviluppo continuativo. - RAT multi-linguaggio: la disponibilità di tre versioni del RAT (JS, Python, VBS) indica un’organizzazione con risorse, non un singolo attore.
Timeline della campagna
- 2 maggio 2025: primo pacchetto npm pubblicato (
graphalgo@2.2.6) - 13 giugno 2025: prima variante PyPI
- 17 novembre 2025: introdotta la variante di naming
big-*su npm - 9 dicembre 2025: variante
big-*appare su PyPI - 4 febbraio 2026: identificata variante VBS del RAT (SHA1: dbb4031e9bb8f8821a5758a6c308932b88599f18)
- Aprile 2026: campagna ancora attiva con nuovi package pubblicati settimanalmente
Indicatori di compromissione (IoC)
Domini C2
codepool[.]cloud
aurevian[.]cloud
Organizzazione GitHub malevola
johns92/blog_app (secondo stadio)
raw.githubusercontent.com/johns92/blog_app/refs/heads/main/server/.env.example
File sospetti
graph-settings.min.js
graph-alg.min.js
graph_config.py
load_libraries.py
/Scripts/startup.js (directory Chrome)
Hash (variante VBS del RAT)
SHA1: dbb4031e9bb8f8821a5758a6c308932b88599f18
Come proteggersi
- Verificare sempre l’identità del recruiter e dell’azienda prima di clonare ed eseguire qualsiasi codice proveniente da task tecnici
- Controllare la presenza nei propri progetti di dipendenze con nomi
graph-*obig-*non riconducibili a librerie standard - Ispezionare i processi in esecuzione per connessioni verso
codepool[.]cloudeaurevian[.]cloud - Verificare l’integrità delle estensioni browser, in particolare MetaMask
- Se si ha un wallet crypto sull’host potenzialmente compromesso: considerarlo esposto e ruotare immediatamente le chiavi/generare un nuovo wallet
- Segnalare offerte di lavoro sospette che richiedono l’esecuzione di codice a npm security (npm.community) e PyPI (security@pypi.org)
Fonti primarie: ReversingLabs – Inside Graphalgo | ReversingLabs – Fake Recruiter Campaign | GBHackers