TL; DR
Un unicu editore npm, deadcode09284814, hà fattu una campagna typosquat contr'à u legittimu axios e chalk-template pacchetti dapoi a mità di maghju 2026.
A campagna hà cuminciatu cum'è un ladru di credenziali è di portafogli cunvinziunali, esfiltrandu dati à un Tunnel HTTPS Serveo.
On 2026-05-17, cù axois-utils:1.0.9, l'operatore hà scambiatu cumpletamente u payload: listessa scaffold triplu install-hook, listessu editore, listessu nome di pacchettu.
Ma u script d'installazione hè avà una recluta di botnet DDoS multipiattaforma.
A carica utile parla à un localhost.run tunnel è accetta cumandamenti di inundazione, trasfurmendu l'ambienti infettati in parte di una botnet capace di DDoS.
L'operatore hà ancu speditu u Binariu di u servitore C2 in u tarball, chì mostra una chiara escalation da u furtu di credenziali à l'infrastruttura attiva di botnet.
Dui pacchetti, quattru versioni sempre attive in u registru, è un operatore chì esegue avà i dui moduli in parallelu.
Severità: alta.
L'attaccu: cumu funziona
A campagna hè custruita annantu à un'impalcatura di consegna vuluntariamente noiosa: dui nomi di pacchetti typosquat, una lettera sfarente da i pacchetti cù centinaie di milioni di scaricamenti settimanali (axios, mudellu di gesso), è tripla installazione hooks chì garantiscenu l'esecuzione. Ciò chì hè interessante hè ciò chì l'impalcatura porta — è u fattu chì l'operatore hà cambiatu a carica senza cambià nunda altru.
L'impalcatura spartuta
Ogni versione publicata di i dui pacchetti dichjara i stessi trè cicli di vita hooks in package.json:
"scripts": { "preinstall": "node <payload>.js", "install": "node <payload>.js", "postinstall": "node <payload>.js" } Elencu di u payload sottu à tutti i trè hooks hè eccessivu - postinstallazione solu correrebbe in un predefinitu npm installA scelta hè impurtante: npm installà –ignore-scripts salta i script, ma parechji flussi di travagliu cumuni (restauri di cache CI chì rieseguinu u ciclu di vita hooks selettivamente, o sviluppatori chì verificanu solu postinstallazione) fà una dichjarazione tripla ridondante a scumessa più sicura per l'attaccante.
gesso-tempalte aghjusta un secondu mecanismu: dichjara axois-utils:^1.0.7 cum'è un tempu d'esecuzione dipendenza. Installà u typosquatted mudellu di gesso dunque tira ancu u typosquat fratellu, è i dui carichi utili sò eseguiti. I dui pacchetti sò una coppia coordinata, micca elenchi indipendenti.
Fase A — ladru di credenziali / portafogli (2026-05-15 → presente)
A Fase A hè u payload originale. U caricatore hè un cortu postinstallazione.js chì punta à un tunnel inversu HTTPS Serveo:
// chalk-tempalte/postinstall.js:11-13 const C2_HOST = "f04a273bd84c0622-80-200-28-28.serveousercontent.com"; const C2_PORT = 443; const C2_PATH = '/collect'; U sottuduminiu Serveo codifica l'IP di destinazione (80.200.28.28) direttamente in u nome di l'ospite - una cunvenzione ricunniscibile per quellu serviziu. L'operatore gira u prefissu di u sottoduminiu aleatoriu trà e versioni per evità e liste di bloccu di duminii ingenue, ma l'IP sottostante ùn si move mai. (chalk-template:1.0.14 camion 8a3e818ea8f11186-80-200-28-28…; 1.0.16 / 1.0.19 / 1.0.20 usu f04a273bd84c0622-….)
postinstallazione.js e mani à phantom.js, un modulu "cullettore" di 7,667 linee in bundle. phantom.js cammina l'ospite per:
Chjavi private SSH (~/.ssh/*) |
.npmrc cuntenutu è qualsiasi npm_* gettoni d'ambiente |
| I fugliali di credenziali AWS, GCP è Azure |
Regex di u token d'accessu persunale di GitHub (ghp_*, gho_*, ghu_*, ghs_*) |
| Artefatti di cripto-portafogli per Bitcoin, Exodus, Electrum, Monero, Litecoin, Dogecoin, Zcash, Dash |
Un recursivu .env* camminà attraversu ~/projects, ~/dev, ~/code, ~/workspace, è l'installazione cwd |
Storie di Shell è u cumpletu process.env |
U fasciu hè mandatu per POST à u tunnel Serveo à / cullàÙn ci hè nisuna offuscazione, nisuna logica anti-VM, nisuna messa in scena - a scumessa di l'operatore hè nantu à u vulume è a velocità.
Fase B — Reclutamentu PhantomBot DDoS (2026-05-17, axois-utils:1.0.9 solu)
A Fase B rimpiazza phantom.js + postinstall.js cù un unicu schedariu chjamatu distrube.js (l'errore di battitura hè di l'operatore). L'impalcatura à triplu hook in package.json hè invariata; u pacchettu mantene u listessu nome, scopu è mudellu di versione-bump. Da fora, axois-utils:1.0.9 pare una seconda versione minore di 1.0.6. Dentru, hè una famiglia di malware diversa.
distrube.js si apre cù un bloccu di cunfigurazione chì nomina a marca propria di l'operatore:
// axois-utils-1.0.9/distrube.js:11-15 |
// Use your localhost.run HTTPS URL (the tunnel handles HTTP internally) |
const C2_HOST = 'b94b6bcfa27554.lhr.life'; // Your localhost.run tunnel |
const C2_PORT = 443; // HTTPS port - tunnel handles SSL |
const BOT_ID = `${os.hostname()}_${Date.now()}_${crypto.randomBytes(4).toString('hex')}`; |
I cummenti sò indirizzati à un futuru operatore chì esegue u kit ("Utilizate u vostru URL HTTPS localhost.run"). Què, più ciò chì hè inclusu accantu à u cliente bot, hè l'indicazione chì questu ùn hè micca solu un payload di vittima - hè u kit.
U flussu:
- Persistenza esegue prima. U script s'installa in trè modi diversi per sistema operativu (registru Run + Cartulare di avviu + schtasks nant'à Windows; crontab + phantom-bot.service unità systemd + .bashrc/.zshrc aghjunghje + /etc/rc.local nant'à Linux; LaunchAgent com.phantom.bot.plist in macOS). U nome di u serviziu di persistenza è l'etichetta LaunchAgent sò tramindui robot fantasma / com.phantom.bot, da induve vene ancu u nome di a campagna.
- Espulsione di l'infurmazioni di u sistema funziona una volta - un POST d'impronte digitali unicu à b94b6bcfa27554.lhr.life:443/collect chì porta u nome di l'ospite, a piattaforma, l'architettura, u nome d'utilizatore, a CPU/RAM, l'interfacce di rete, process.env, cwd, homedir, a versione di u nodu è l'IP publicu. Questu hè assai menu aggressivu chè a Fase A: nisun SSH, nisun portafogliu, nisuna recursione .env. U travagliu di u bot hè di iscriversi, micca di arrubà.
- Ciclu di battitu di core apre un HTTPS POST ogni 30 secondi à b94b6bcfa27554.lhr.life:443/. L'User-Agent hè PhantomBot/1.0. A verificazione TLS hè esplicitamente disattivata (rejectUnauthorized: false). A risposta C2 hè analizata cum'è JSON di a forma {type, target, port, duration, threads, method} è spedita.
- Arsenale di l'inundazione hè cablatu à sei cumandamenti:
| Tipu di cumandamentu | Module | Fonti |
|---|---|---|
| ping | Risposta di vivacità | U bot s'identifica |
| situ http | inundazione HTTP | Inundazione di richieste di u livellu 7 |
| https | Inundazione HTTPS | Listessu cum'è http, imballatu in TLS |
| tcp | Inundazione TCP | Spam di carica aleatoria di 65 KB |
| pudu | Inundazione UDP | Pacchetti UDP di 65,507 byte |
| rapidu | Reset rapidu di HTTP/2 DoS | A tecnica CVE-2023-44487 di u 2023 |
Tutti i cinque moduli d'inundazione piglianu un mira, portu, durata, e linee argumentu - u bot hè un flooder genericu à pagamentu, micca destinatu à alcuna vittima particulare. A lista di vittime di l'operatore si trova nantu à u C2, micca in u pacchettu.
Novità quì - u binariu C2 speditu
A Fase A hè una forma familiare: furtu di credenziali, ganciu d'installazione, C2 tunnellatu da u venditore. A Fase B hè ancu una forma familiare - e botnet DDoS sò state un elementu di i pacchetti npm maliziosi per anni. Ciò chì hè insolitu hè chì l'operatore hà speditu u latu servitore di u kit in u tarball npm:
- c2 — un binariu Go ELF compilatu di 4 megabyte
- c2.go — u codice surghjente Go di 426 linee per quellu binariu
Nè l'unu nè l'altru schedariu hè invucatu da alcun hook d'installazione. Ùn facenu parte di u payload di a vittima. Sò situati in u cartulare di u pacchettu in u listessu modu chì un schedariu di documentazione. A lettura più plausibile hè chì l'operatore hà spintu u so arburu di travagliu di sviluppu à npm senza curà a lista di i schedari - un veru lapsus OpSec - è ciò chì hè statu speditu hè u kit cumpletu à duie facce: u cliente chì una vittima esegue, è u servitore chì l'operatore esegue.
Questa hè a parte di a storia chì ghjustifica l'inquadramentu di u "kit di botnet chiavi in manu". Qualchissia chì hà scaricatu axois-utils:1.0.9 prima di a rimozione ùn hà micca solu un campione di vittima - anu un servitore C2 funzionale.
U pivot, in una frase
Stessu editore, stessi nomi di pacchetti, stessa impalcatura à triplu ganciu, stessa marca "fantasma" - ma U payload hà cambiatu u mudellu di monetizazione durante a notte: da "sicreti di a racolta chì possu rivende" à "capacità di inundazione in affittu chì possu affittà". I TTP di u tempu d'installazione chì i difensori devenu surveglià sò guasi identichi in e duie fasi; difese basate nantu à a firma chjave à e stringhe di u percorsu di u portafogliu di a Fase A o à phantom.jsU cullettore di 7,667 linee averia mancatu cumpletamente a Fase B.
| Data (UTC) | Event |
|---|---|
| 2026-05-15 | Prima publicazione: axois-utils:1.0.4 (Custruzzione di prova LAN, piattaforma di sviluppu à 192.168.129.19) |
| 2026-05-15 | axois-utils:1.0.6 publicatu - A Fase A C2 hè stata scambiata per 80.200.28.28 via u tunnel Serveo; u cummentariu di a fonte // Change to '80.200.28.28' for public cunfirma u scambiu trà sviluppatori è pruduttori |
| 2026-05-16 | chalk-tempalte:1.0.14 e 1.0.16 publicatu — caricatore incatenatu chì dichjara axois-utils:^1.0.7 cum'è una dipendenza di runtime; u sottuduminiu Serveo hè statu rotatu |
| 2026-05-16 | Campagna di Fase A scuperta durante a scansione npm di rutina; verdetti cunfirmati-maliziosi applicati |
| 2026-05-17 | axois-utils:1.0.9 publicatu — pivot di carica utile: PhantomBot DDoS recrutamentu via tunnel localhost.run; latu operatore c2 binariu è c2.go surghjente speditu in u tarball |
| 2026-05-17 | chalk-tempalte:1.0.19 e 1.0.20 publicatu - sempre Fase A (stealer); l'operatore avà esegue i dui moduli in parallelu |
| 2026-05-17 | Scuperta di a Fase B durante a scansione di rutina; verdetti applicati in tutti 2026-05-17 versioni |
| (in corsu) | Rapporti di rimozione pendenti; tutti i quattru pacchetti publicati restanu dispunibili in u registru à u mumentu di a scrittura |
Indicatori di compromessi
Packages
| Ecosistema | pacchettu | versioni |
|---|---|---|
| npm | axois-utils (typosquat di axios) | 1.0.4, 1.0.6, 1.0.9 |
| npm | chalk-tempalte (typosquat di mudellu di gesso) | 1.0.14, 1.0.16, 1.0.19, 1.0.20 |
Identità di l'autore
| campu | Value |
|---|---|
| editore npm | deadcode09284814 |
| E-mail di l'editore | phantomdeadcode@tutamail.com |
| SCM Verificazione | mancunu |
Command-and-control
| fase | Endpoint | Trasporti |
|---|---|---|
| A | f04a273bd84c0622-80-200-28-28.serveousercontent.com:443/collect | Tunnel HTTPS Serveo |
| A | 8a3e818ea8f11186-80-200-28-28.serveousercontent.com:443/collect | Tunnel HTTPS Serveo (versione precedente) |
| A | 80.200.28.28:443/collect | Endpoint VPS sottostante |
| B | b94b6bcfa27554.lhr.life:443/ | localhost.run tunnel inversu HTTPS |
Digesti di file (SHA-256)
| File | SHA-256 | Fonti |
|---|---|---|
c2 (Andate à ELF, 4 MB) | 165fa92d237fd017c227d00da06ab788212a62be94bf61e95df2d22d00377ef2 | Servitore C2 da parte di l'operatore, speditu dentru axois-utils:1.0.9 |
c2.go (426 linee) | 7d0ae79fdb1e9968f3323a3712b624643a782ba3efb2cf3a2cb9c4c5513cea30 | Andà à a surghjente per u binariu C2 |
distrube.js | 308b15c023088a7188dea4ef609010ac2493eb4c365b103053d7621a9ca5b935 | Cliente di bot di Fase B |
phantom.js (chalk-tempalte:1.0.19) | 9e380ec88d3ccf3929e1a104e3b868d4d7b59ca189a8a431a54e9f3357dfdd81 | Cullettore di credenziali / portafogli di Fase A |
phantom.js (chalk-tempalte:1.0.20) | d1c9e3f296ee9f7d5032f73f9c504cede50334bc14c394055fd5cb9c3a6e08b3 | Cullettore di Fase A (variante 1.0.20) |
postinstall.js (chalk-tempalte:1.0.19 = 1.0.20) | ffba9bdd6793edd5b38e12900252c1813a693f59c25af51c3b658cf3f27b6162 | Caricatore di Fase A, identicu à byte in e duie versioni |
Attribuzione è Motivazione
Seguitemu sta campagna cum'è PhantomBot, pigliendu a propria marca di l'operatore da u Agente utilizatore: PhantomBot/1.0 intestazione di u battitu cardiacu, u phantom-bot.service unità di sistema, u com.phantom.bot Etichetta LaunchAgent, è u phantomdeadcode@ indirizzu email. L'operatore hè coerente nantu à questu nome in almenu quattru artefatti.
Catalogu di signali
- Publisher - codice mortu09284814 nantu à npm. Contu unicu, email dispunibule Tutamail, nò SCM verificazione. Nisuna storia di publicazione precedente oltre à sta campagna.
- Riutilizazione di a marca — «phantom» appare in l'email di l'editore, in u nome di u schedariu di cullezzione di a Fase A (phantom.js), in u nome di u serviziu di persistenza di a Fase B (phantom-bot.service), in l'etichetta LaunchAgent (com.phantom.bot), è in u bot User-Agent (PhantomBot/1.0).
- Infrastrutture — Un unicu VPS à 80.200.28.28 si trova davanti à a Fase A via a rotazione di u sottuduminiu Serveo; a Fase B si move versu un localhost.run tunnel inversu (b94b6bcfa27554.lhr.life). Tramindui i servizii di i venditori sò gratuiti è richiedenu solu SSH in uscita da parte di l'operatore, coerente cù e cunfigurazioni à bassu budget è low-OpSec.
- Stile di codice — JavaScript chjaru in tuttu; nisuna offuscazione, nisuna codificazione di stringa, nisun cuntrollu anti-VM. I nomi di e variabili sò descrittivi (arrubà l'infurmazioni di u sistema, eseguisceCumanda, httpFlood). Cummenti in distrube.js indirizzà direttamente un futuru operatore ("Utilizate u vostru URL HTTPS localhost.run"), suggerendu chì u schedariu era destinatu à esse ridistribuitu cum'è un kit, micca adupratu da un unicu attaccante.
- Slip OpSec — U tarball di a Fase B cuntene sia u cliente bot sia u servitore C2 da u latu di l'operatore (c2 ELF + c2.go surghjente). Questu hè coerente cù un operatore chì hà spintu u so arburu di travagliu à npm senza verificà a lista di fugliali. O l'operatore hè inespertu, o u kit hè significava per esse distribuitu publicamente è u binariu C2 face parte di u pruduttu.
- Autocunferma - axois-utils:1.0.4 cuntene u cummentariu di a fonte // Cambià à '80.200.28.28' per u publicu à a linea 12, cunfirmendu a progressione di sviluppu / staging / pruduzzione chì l'operatori tipicamente neganu.
Motivazione
U payload di a Fase A hè un furtu finanziariu direttu: credenziali, chjave cloud, gettoni GitHub è portafogli criptografici anu tutti mercati di rivendita liquidi. A Fase B hè ancu finanziaria, ma indiretta: i servizii DDoS-for-hire ("booter") affittanu capacità di inundazione à u minutu, è i bot cum'è quellu speditu quì sò l'inventariu nantu à quale questi servizii funzionanu. U battitu di core di 30 secondi, u genericu mira/portu/durata schema di cummandu, è l'arsenale di inundazione di cinque protokolli sò i standard pruduttu di un operatore di avviatore.
Esecuzione di i dui moduli in parallelu — chalk-template:1.0.19 e 1.0.20 cuntinuà à spedisce u ladru mentre axois-utils:1.0.9 spedisce u bot - suggerisce chì l'operatore copre i flussi di entrate invece di abbandunà a Fase A. U pivot hè un Campu Tondu, micca un rimpiazzamentu.
Ciò chì ùn dichjaremu micca
Ùn simu stati capaci di cunfirmà una identità di u mondu reale daretu à u codice mortu09284814 handle, è ùn attribuemu micca sta campagna à alcun attore di minaccia, gruppu o paese numinatu. A marca "fantasma" hè abbastanza coerente in tutti l'artefatti per suggerisce un unicu operatore, ma a spedizione in stile kit di u binariu C2 lascia aperta a pussibilità chì i pacchetti futuri da handle senza relazione riutilizeranu u listessu codice.
Impattu, Tendenze è Ciò chì i Difensori devenu fà
Impact
I bersagli legittimi di squat axios e mudellu di gesso sò largamente dipendenti in l'ecosistema JavaScript; axios solu si trova trà i trenta pacchetti npm più scaricati. I nomi di typosquat sò à una sola pressione di tastu da quelli veri (axois ↔ axios, template ↔ mudellu), è tramindui sò errori ortografichi linguisticamente plausibili.
Ùn avemu pussutu ottene statistiche di scaricamentu affidabili per e versioni maliziose prima di a rimozione - npm ùn conserva micca i conti di scaricamentu per versione dopu chì un pacchettu hè statu publicatu, è npms.ioI proxy di stile sò rumurosi à sta scala. Ogni urganizazione chì u so schedariu di serratura si risolve in un pacchettu chjamatu axois-utils or gesso-tempalte da l'editore codice mortu09284814 deve esse trattatu cum'è cumprumessu: rotà ogni credenziale prisente in prucessu.ambiente nant'à l'ospite affettatu, verificate i vettori di persistenza per sistema operativu (vede "Ciò chì i difensori devenu fà" quì sottu), è eliminate a dipendenza.
Modelli emergenti
Sta campagna esemplifica un cambiamentu chì avemu vistu in parechji incidenti recenti di npm: L'impalcatura à ganciu d'installazione hè l'attivu durevule; u payload hè scambiabileU listessu editore, u listessu pacchettu, u listessu preinstalla / stallà / postinstallazione triplu, è ancu a listessa cadenza di bump di versione - l'unica cosa chì hè cambiata trà axois-utils:1.0.6 e axois-utils:1.0.9 era u schedariu hooks eseguisce. Rilevazione basata nantu à a firma chjave à u payload di Fase A (stringhe di percorsu di portafogliu, phantom.jsU cullettore di 7,667 linee di , l'ospite Serveo C2) averia segnalatu e prime trè versioni è mancatu cumpletamente a Fase B.
U listessu mudellu hè visibile in altre campagne di u 2026 chì avemu seguitu: un solu operatore cù una impalcatura stabile, chì scambia trà u furtu di credenziali, i clienti chì imbroglianu l'esami, l'espulsione di Telegram-bot, è avà u recrutamentu DDoS. I difensori chì si basanu nantu à e firme di payload continueranu à perde u secondu giru di ogni campagna.
U curullariu hè chì I TTP in tempu d'installazione sò u megliu signaleDichjarazioni triple di install-hook, script d'installazione chì importanu https or prucessu_figliolu, installà scripts chì scrivenu in i cartulari d'avviu di l'utente, è installà scripts chì risolvenu i nomi di host in i servizii di reverse-tunnel gratuiti (Serveo, localhost.run, ngrok, cloudflared) sò tutti rari in i pacchetti legittimi è cumuni in quelli maliziosi.
Ciò chì i difensori devenu fà
- Audit di u schedariu di serratura. Cerca ogni package-lock.json / filatu.serratura / pnpm-lock.yaml in a vostra urganizazione per e stringhe esatte axois-utils e gesso-tempalteTrattate ogni partita cum'è un compromessu.
- Rotate i sicreti nantu à l'ospiti affettati. A Fase A hà raccoltu in massa credenziali SSH, cloud, GitHub, npm è wallet. Suppone ogni credenziale mai presente in prucessu.ambiente, ~ / .ssh, ~/.aws, ~/.npmrc, ~ / .config, o qualsiasi .env* U schedariu nant'à l'ospite affettatu hè espostu.
- Eliminà a persistenza (Fase B). Nant'à Windows, sguassate HKCU\Software\Microsoft\Windows\Versione Attuale\Esegui\Aggiornamentu di u Sistema, sguassà %APPDATA%\Microsoft\Windows\Menu Start\Programmi\Startup\system-update.bat, e schtasks /delete /tn SystemAggiornamentu /fNant'à Linux, crontab -e è caccià @nodu di riavviu …, systemctl –utilizatore disattivatu – avà phantom-bot.service poi sguassà ~/.config/systemd/user/phantom-bot.service, machja .bashrc / .zshrc / /etc/rc.localNant'à macOS, launchctl scarica ~/Library/LaunchAgents/com.phantom.bot.plist dopu sguassate u plist.
- Bluccà l'ospiti C2. Aghjunghjite i quattru punti finali C2 in a tavula IOC à a vostra lista di blocchi di uscita. *.serveousercontent.com e *.lhr.life pò esse bluccatu à l'ingrossu se u vostru ambiente ùn hà micca un usu legittimu per i servizii di tunnel inversu.
- Caccia per TTP à u mumentu di l'installazione, micca carica utile. Entrate di u schedariu di serratura di l'inventariu chì package.json dichjaratu preinstalla, stallà, e postinstallazione tutti chì puntanu à u listessu script. Verificate l'età di u pacchettu è u statutu di verificazione di l'editore. Stu mudellu hè raru in i pacchetti legittimi è hè u signale u più affidabile chì PhantomBot riutiliza.
- Audit per u binariu C2. Qualchissia chì hà scaricatu axois-utils:1.0.9 hà u servitore C2 di l'operatore (c2 ELF, sha256 165fa92d…) nant'à u discu. Scansione di e cache è di i magazzini d'artefatti CI. U binariu hè inattivu da per ellu, ma a so presenza nant'à una stazione di travagliu hè una prova inequivocabile chì u pacchettu hè statu installatu.
Linea di chjusura
U listessu operatore, u listessu pacchettu è u listessu ganciu d'installazione ponu purtà minacce cumpletamente diverse in 48 ore. Fighjate l'impalcatura, micca u payload.




