TL; DR
Jeden vydavateľ npm, deadcode09284814, viedol kampaň s preklepmi proti legitímnym axios a chalk-template balíky od polovice mája 2026.
Kampaň sa začala ako konvenčná krádež poverení a peňaženiek, ktorá odcudzila údaje do HTTPS tunel Serveo.
On 2026-05-17S axois-utils:1.0.9, operátor úplne vymenil užitočné zaťaženie: rovnaký trojitý install-hook scaffold, rovnaký vydavateľ, rovnaký názov balíka.
Inštalačný skript je však teraz multiplatformovým verbovaným DDoS botnetom.
Užitočné zaťaženie hovorí o localhost.run tunel a prijíma príkazy flood, čím sa infikované prostredia stávajú súčasťou botnetu s možnosťou DDoS útokov.
Prevádzkovateľ dokonca odoslal Binárny súbor servera C2 vo vnútri tarballu, čo ukazuje jasnú eskaláciu od krádeže prihlasovacích údajov k aktívnej infraštruktúre botnetu.
Dva balíky, štyri verzie stále aktívne v registri a jeden operátor teraz spúšťa oba moduly paralelne.
Závažnosť: vysoká.
Útok: Ako to funguje
Kampaň je postavená na zámerne nudnom systéme doručovania: dva preklepové názvy balíkov, ktoré sa o jedno písmeno líšia od balíkov so stovkami miliónov stiahnutí týždenne (Axios, kriedová šablóna) a trojitá inštalácia hooks ktoré zaručujú prevedenie. Zaujímavé je, čo lešenie nesie — a skutočnosť, že prevádzkovateľ zmenil náklad bez toho, aby zmenil čokoľvek iné.
Spoločné lešenie
Každá publikovaná verzia oboch balíkov deklaruje rovnaké tri životné cykly hooks in package.json:
"scripts": { "preinstall": "node <payload>.js", "install": "node <payload>.js", "postinstall": "node <payload>.js" } Zoznam užitočného zaťaženia pod všetkými tromi hooks je prehnané — po inštalácii sám by bežal v predvolenom nastavení npm installNa výbere záleží: npm install –ignore-scripts preskakuje skripty, ale niekoľko bežných pracovných postupov (obnovenie vyrovnávacej pamäte CI, ktoré sa opätovne spúšťajú v životnom cykle) hooks selektívne alebo vývojári, ktorí vykonávajú iba audit po inštalácii) urobiť z trojnásobne redundantného vyhlásenia najbezpečnejšiu voľbu pre útočníka.
kriedová šablóna pridáva druhý mechanizmus: deklaruje axois-utils:^1.0.7 ako behové prostredie závislosťInštalácia preklepu kriedová šablóna preto stiahne aj súrodenecký typosquat a spustia sa obe užitočné zaťaženia. Tieto dva balíky sú koordinovaný pár, nie nezávislé zoznamy.
Fáza A – zlodej poverení / peňaženiek (2026-05-15 → súčasnosť)
Fáza A je pôvodné užitočné zaťaženie. Nakladač je krátky postinstall.js ktorý ukazuje na reverzný tunel Serveo HTTPS:
// chalk-tempalte/postinstall.js:11-13 const C2_HOST = "f04a273bd84c0622-80-200-28-28.serveousercontent.com"; const C2_PORT = 443; const C2_PATH = '/collect'; Subdoména Serveo kóduje cieľovú IP adresu (80.200.28.28) priamo v názve hostiteľa – rozpoznateľná konvencia pre túto službu. Operátor strieda náhodný prefix subdomény medzi verziami, aby sa vyhol blokovaniu naivných domén, ale základná IP adresa sa nikdy nezmení. (šablóny kriedy: 1.0.14 použitý 8a3e818ea8f11186-80-200-28-28…; použitie 1.0.16 / 1.0.19 / 1.0.20 f04a273bd84c0622-….)
postinstall.js ruky preč od phantom.js, 7 667-riadkový zväzkový „kolektorový“ modul. phantom.js prechádzky hostiteľa pre:
Súkromné kľúče SSH (~/.ssh/*) |
.npmrc obsah a akékoľvek npm_* tokeny prostredia |
| Súbory s prihlasovacími údajmi AWS, GCP a Azure |
regulárny výraz tokenu osobného prístupu GitHub (ghp_*, gho_*, ghu_*, ghs_*) |
| Artefakty krypto peňaženiek pre Bitcoin, Exodus, Electrum, Monero, Litecoin, Dogecoin, Zcash, Dash |
Rekurzívny .env* prejsť ~/projects, ~/dev, ~/code, ~/workspacea inštalačný cwd |
História Shellu a kompletný popis process.env |
Balík je odoslaný do tunela Serveo na adrese / zbieraťNeexistuje žiadne zahmlievanie, žiadna logika proti virtuálnym počítačom, žiadne stagingové spracovanie – operátor vsádza na objem a rýchlosť.
Fáza B – Nábor PhantomBot DDoS (17. 05. 2026, iba axois-utils:1.0.9)
Fáza B nahrádza súbory phantom.js + postinstall.js jedným súborom s názvom distrube.js (preklep je na strane operátora). Triple-hook scaffold v súbore package.json zostáva nezmenený; balík si zachováva rovnaký názov, rozsah a vzor pre navýšenie verzie. Navonok vyzerá axois-utils:1.0.9 ako menšie pokračovanie verzie 1.0.6. Vo vnútri ide o inú rodinu malvéru.
distrube.js otvára sa konfiguračným blokom, ktorý pomenúva vlastnú značku operátora:
// 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')}`; |
Komentáre sú adresované budúcemu operátorovi, ktorý spúšťa súpravu („Použite URL adresu HTTPS localhost.run“). To, plus to, čo sa dodáva vedľa klienta bota, naznačuje, že nejde len o obeť – je to súprava.
Prietok:
- Vytrvalosť Spustí sa ako prvý. Skript sa nainštaluje tromi rôznymi spôsobmi v závislosti od operačného systému (v registri beh + Priečinok po spustení + schtasks vo Windowse; crontab + služba phantom-bot jednotka systemd + .bashrc/.zshrc pridať + /etc/rc.local na Linuxe; LaunchAgent com.phantom.bot.plist v systéme macOS). Názov služby perzistencie aj označenie LaunchAgent sú fantomový robot / com.phantom.bot, odkiaľ pochádza aj názov kampane.
- Systémové informácie exfil spustí sa raz – jednorazový POST odtlačku prsta na b94b6bcfa27554.lhr.life:443/collect s názvom hostiteľa, platformou, archom, používateľským menom, CPU/RAM, sieťovými rozhraniami, process.env, cwd, domovským adresárom, verziou uzla a verejnou IP adresou. Toto je oveľa menej agresívne ako fáza A: žiadne SSH, žiadne peňaženky, žiadna rekurzia .env. Úlohou bota je registrovať, nie kradnúť.
- Slučka srdcového tepu Otvára HTTPS POST každých 30 sekúnd na b94b6bcfa27554.lhr.life:443/. Používateľský agent je PhantomBot/1.0. Overenie TLS je explicitne zakázané (rejectUnauthorized: false). Odpoveď C2 je analyzovaná ako JSON vo formáte {type, target, port, duration, threads, method} a odoslaná.
- Povodňový arzenál je prepojený so šiestimi príkazmi:
| Typ príkazu | Moduly | Poznámky |
|---|---|---|
| ping | Odpoveď na otázku o živosti | Bot sa identifikuje |
| http | HTTP záplava | Záplava požiadaviek vrstvy 7 |
| https | HTTPS záplava | Rovnaké ako http, obalené TLS |
| tcp | TCP záplava | 65 KB náhodného obsahu spamu |
| udp | UDP záplava | 65 507-bajtové UDP pakety |
| rýchly | DoS s rýchlym resetom HTTP/2 | Technika CVE-2023-44487 z roku 2023 |
Všetkých päť modulov protipovodňovej ochrany zaberie terč, prístav, trvaniaa nite argument – bot je generický flooder na prenájom, nie je zameraný na žiadnu konkrétnu obeť. Zoznam obetí operátora sa nachádza na C2, nie v balíku.
Čo je tu nové — dodaný binárny súbor C2
Fáza A má známy tvar: krádež poverení, inštalačný hook, tunelovanie C2 dodávateľom. Fáza B je Tiež známy tvar – DDoS botnety sú už roky neoddeliteľnou súčasťou škodlivých npm balíkov. Nezvyčajné je, že operátor odoslal strana servera zo súpravy vo vnútri tarballu npm:
- c2 — 4-megabajtový skompilovaný binárny súbor Go ELF
- c2.go — 426-riadkový zdrojový kód Go pre daný binárny kód
Ani jeden zo súborov nie je volaný žiadnym inštalačným hookom. Nie sú súčasťou užitočného zaťaženia obete. Nachádzajú sa v adresári balíka rovnako ako súbor s dokumentáciou. Najpravdepodobnejším výkladom je, že operátor presunul svoj vývojový pracovný strom do npm bez toho, aby upravil zoznam súborov – skutočný OpSec prešľap – a to, čo bolo dodané, bola kompletná obojstranná sada: klient, ktorého spúšťa obeť, a server, ktorý spúšťa operátor.
Toto je časť príbehu, ktorá ospravedlňuje označenie za „kompletnú súpravu botnetov“. Každý, kto si stiahol axois-utils:1.0.9 pred zastavením má nielen vzorku obete – má aj funkčný server C2.
Pivot, jednou vetou
Ten istý vydavateľ, tie isté názvy balíkov, ten istý trojitý systém scaffoldov, ten istý „fantomový“ branding – ale užitočné zaťaženie zmenilo model monetizácie cez nocod „zbierania tajomstiev, ktoré môžem ďalej predať“ po „prenájom zaplavenej kapacity, ktorú si môžem prenajať“. Časové limity TTP v čase inštalácie, ktoré by si mali obrancovia sledovať, sú v oboch fázach takmer identické; obrana založená na podpisoch je kľúčovaná k reťazcom peňaženky fázy A alebo k phantom.jsZberateľ so 7 667 riadkami by Fázu B úplne vynechal.
| Dátum (UTC) | udalosť |
|---|---|
| 2026-05-15 | Prvá publikácia: axois-utils:1.0.4 (Testovacia zostava pre LAN, vývojové zariadenie na 192.168.129.19) |
| 2026-05-15 | axois-utils:1.0.6 publikované — Fáza A C2 vymenená za 80.200.28.28 cez tunel Serveo; komentár k zdroju // Change to '80.200.28.28' for public potvrdzuje výmenu vývojárov a producentov |
| 2026-05-16 | chalk-tempalte:1.0.14 a 1.0.16 publikované — deklarovanie reťazového zavádzača axois-utils:^1.0.7 ako závislosť za behu; subdoména Serveo otočená |
| 2026-05-16 | Kampaň fázy A objavená počas rutinného skenovania npm; aplikované verdikty potvrdeného škodlivého kódu |
| 2026-05-17 | axois-utils:1.0.9 publikované — pivot užitočného zaťaženia: nábor PhantomBot DDoS cez tunel localhost.run; strana operátora c2 binárne a c2.go zdrojový kód je súčasťou tarballu |
| 2026-05-17 | chalk-tempalte:1.0.19 a 1.0.20 publikované — stále fáza A (kradnutie); operátor teraz spúšťa oba moduly paralelne |
| 2026-05-17 | Objav fázy B počas rutinného skenovania; verdikty aplikované na všetky 2026-05-17 verzia |
| (Prebiehajúce) | Správy o zastavení šírenia čakajú na spracovanie; všetky štyri zverejnené balíky sú v čase písania článku stále dostupné v registri. |
Indikátory kompromisu
Balíčky
| ekosystém | Balíček | verzia |
|---|---|---|
| NPM | axois-utils (preklep) | 1.0.4, 1.0.6, 1.0.9 |
| NPM | chalk-tempalte (preklep z kriedovej šablóny) | 1.0.14, 1.0.16, 1.0.19, 1.0.20 |
Identita autora
| Pole | Hodnota |
|---|---|
| vydavateľ npm | deadcode09284814 |
| E-mail vydavateľa | phantomdeadcode@tutamail.com |
| SCM overenie | nikto |
Command-and-control
| Fázy | Endpoint | transport |
|---|---|---|
| A | f04a273bd84c0622-80-200-28-28.serveousercontent.com:443/collect | HTTPS tunel Serveo |
| A | 8a3e818ea8f11186-80-200-28-28.serveousercontent.com:443/collect | HTTPS tunel Serveo (staršia verzia) |
| A | 80.200.28.28:443/collect | Podkladový koncový bod VPS |
| B | b94b6bcfa27554.lhr.life:443/ | localhost.run HTTPS reverzný tunel |
Súborové výťahy (SHA-256)
| rezeň | SHA-256 | Poznámky |
|---|---|---|
c2 (Choď na ELF, 4 MB) | 165fa92d237fd017c227d00da06ab788212a62be94bf61e95df2d22d00377ef2 | Server C2 na strane operátora, dodávaný vo vnútri axois-utils:1.0.9 |
c2.go (426 riadkov) | 7d0ae79fdb1e9968f3323a3712b624643a782ba3efb2cf3a2cb9c4c5513cea30 | Zdrojový kód pre binárny súbor C2 |
distrube.js | 308b15c023088a7188dea4ef609010ac2493eb4c365b103053d7621a9ca5b935 | Klient bota fázy B |
phantom.js (chalk-tempalte:1.0.19) | 9e380ec88d3ccf3929e1a104e3b868d4d7b59ca189a8a431a54e9f3357dfdd81 | Zberateľ poverení fázy A / peňaženiek |
phantom.js (chalk-tempalte:1.0.20) | d1c9e3f296ee9f7d5032f73f9c504cede50334bc14c394055fd5cb9c3a6e08b3 | Kolektor fázy A (variant 1.0.20) |
postinstall.js (chalk-tempalte:1.0.19 = 1.0.20) | ffba9bdd6793edd5b38e12900252c1813a693f59c25af51c3b658cf3f27b6162 | Zavádzač fázy A, bajtovo identický v oboch verziách |
Atribúcia a motivácia
Túto kampaň sledujeme ako PhantomBot, pričom si operátor prevzal vlastnú značku od Používateľský agent: PhantomBot/1.0 hlavička srdcového tepu, služba phantom-bot jednotka systemd, com.phantom.bot Označenie LaunchAgent a phantomdeadcode@ e-mailový identifikátor. Operátor je konzistentný v súvislosti s týmto názvom v najmenej štyroch artefaktoch.
Katalóg signálov
- vydavateľ - mŕtvy kód09284814 na npm. Účet s jedným používateľom, jednorazový e-mail Tutamail, nie SCM overenie. Žiadna predchádzajúca história publikácií okrem tejto kampane.
- Opätovné použitie značky — „phantom“ sa zobrazuje v e-maile vydavateľa, v názve súboru zberateľa fázy A (phantom.js), v názve služby perzistencie fázy B (služba phantom-bot), v označení LaunchAgent (com.phantom.bot) a v používateľskom agentovi bota (PhantomBot/1.0).
- Infraštruktúra — Jeden VPS na 80.200.28.28 fronty Fázy A prostredníctvom rotácie subdomény Serveo; Fáza B sa presúva do a localhost.run spätný tunel (b94b6bcfa27554.lhr.life). Obe služby dodávateľa sú bezplatné a vyžadujú iba odchádzajúce SSH na strane operátora, čo je v súlade s nízkorozpočtovými nastaveniami s nízkou prevádzkovou bezpečnosťou.
- Štýl kódu — Čistý JavaScript v celom texte; žiadne zmätenie, žiadne kódovanie reťazcov, žiadne kontroly anti-VM. Názvy premenných sú popisné (stealSystemInfo, executeCommand, httpFlood). Komentáre v distrube.js priamo oslovovať budúceho operátora („Použite URL adresu HTTPS vášho localhost.run“), čo naznačuje, že súbor bol určený na distribúciu ako súprava, nie na použitie jedným útočníkom.
- Preklep z Operačnej bezpečnosti — Archív fázy B obsahuje klienta bota aj server C2 na strane operátora (c2 ŠKRÍTOK + c2.go zdroj). Toto je v súlade s operátorom, ktorý odoslal svoj pracovný strom do npm bez auditu zoznamu súborov. Buď je operátor neskúsený, alebo je súprava znamenalo na verejnú distribúciu a binárny súbor C2 je súčasťou produktu.
- Sebapotvrdenie - axois-utils:1.0.4 obsahuje komentár k zdroju // Zmena na '80.200.28.28' pre verejné na riadku 12, potvrdzujúc postup vývoja / staging / produkcie, ktorý operátori zvyčajne popierajú.
Motivácia
Fáza A je priamočiara finančná krádež: prihlasovacie údaje, cloudové kľúče, tokeny GitHub a krypto peňaženky majú likvidné trhy s ďalším predajom. Fáza B je tiež finančná, ale nepriama: služby DDoS na prenájom („booter“) si prenajímajú kapacitu zahltenú každou minútou a boty, ako je ten, ktorý je tu uvedený, sú inventárom, na ktorom tieto služby bežia. 30-sekundový srdcový tep, všeobecný terč/prístav/trvania schéma príkazov a arzenál päťprotokolov protipovodňovej ochrany sú standard produkt operátora bootera.
Paralelné spustenie oboch modulov — šablóny kriedy: 1.0.19 a 1.0.20 pokračovať v preprave zlodeja, zatiaľ čo axois-utils:1.0.9 dodáva bota – naznačuje, že prevádzkovateľ skôr zaisťuje zdroje príjmov, než aby opustil fázu A. Zmena smeru je pridanie, nie náhrada.
Čo netvrdíme
Nepodarilo sa nám potvrdiť skutočnú identitu za mŕtvy kód09284814 handle a túto kampaň nepripisujeme žiadnemu menovanému aktérovi hrozby, skupine ani krajine. Značka „phantom“ je v artefaktoch dostatočne konzistentná, aby naznačovala jediného operátora, ale dodávanie binárneho súboru C2 v štýle súpravy necháva otvorenú možnosť, že budúce balíky z nesúvisiacich handlerov budú znova používať rovnaký kód.
Dopad, trendy a čo by mali obhajcovia robiť
Vplyv - CSR
Legitímne ciele drepov Axios a kriedová šablóna sú v ekosystéme JavaScriptu vo veľkej miere závislé; Axios sám o sebe patrí medzi tridsať najsťahovanejších npm balíkov. Názvy s preklepmi sú od skutočných vzdialené len jedno stlačenie klávesu (axois ↔ Axios, šablóna ↔ šablóna) a obe sú jazykovo pravdepodobné pravopisné chyby.
Pred odstránením sa nám nepodarilo získať spoľahlivé štatistiky sťahovania škodlivých verzií – npm neuchováva počty sťahovaní pre jednotlivé verzie po zrušení publikovania balíka a npms.ioProxy v štýle - sú v tomto rozsahu hlučné. Akákoľvek organizácia, ktorej súbor zámku sa rozhoduje pre balík s názvom axois-utils or kriedová šablóna od vydavateľa mŕtvy kód09284814 by sa malo považovať za ohrozené: striedať všetky prítomné poverenia process.env na postihnutom hostiteľovi auditujte vektory perzistencie pre každý operačný systém (pozrite si časť „Čo by mali obrancovia urobiť“ nižšie) a odstráňte závislosť.
Vznikajúce vzorce
Táto kampaň je príkladom posunu, ktorý sme zaznamenali v niekoľkých nedávnych incidentoch týkajúcich sa nových projektov: Lešenie s montážnym hákom je odolným prínosomužitočné zaťaženie je vymeniteľnéTen istý vydavateľ, ten istý balík, ten istý predinštalovať / inštalovať / po inštalácii trojnásobný a dokonca rovnaká kadencia pri zvyšovaní verzií – jediná vec, ktorá sa medzitým zmenila axois-utils:1.0.6 a axois-utils:1.0.9 bol to súbor hooks spustiť. Detekcia založená na podpise je kľúčovaná k dátovej časti fázy A (reťazce cesty k peňaženke, phantom.jsZberač s 7 667 riadkami, hostiteľ Serveo C2), by označil prvé tri verzie a úplne by zmeškal fázu B.
Rovnaký vzorec je viditeľný aj v ďalších kampaniach z roku 2026, ktoré sme sledovali: jeden operátor so stabilnou základňou, striedajúci sa medzi krádežou poverení, klientmi podvádzajúcimi pri skúškach, expiláciou cez Telegram-botov a teraz aj náborom DDoS. Obrancovia, ktorí sa spoliehajú na podpisy užitočného zaťaženia, budú v druhom kole každej kampane prehrávať.
Dôsledkom je, že Časy TTP v čase inštalácie sú lepším signálomTrojité deklarácie install-hook, inštalačné skripty, ktoré importujú https or child_process, nainštalujte skripty, ktoré zapisujú do spúšťacích priečinkov používateľa, a nainštalujte skripty, ktoré prekladajú názvy hostiteľov na bezplatných službách s reverzným tunelom (Serveo, localhost.run, ngrok, cloudflared) sú zriedkavé v legitímnych balíkoch a bežné v škodlivých.
Čo by mali obrancovia robiť
- Audit uzamknutých súborov. Hľadať každých package-lock.json / priadza.zámok / pnpm-lock.yaml vo vašej organizácii pre presné reťazce axois-utils a kriedová šablónaAkýkoľvek zápas berte ako kompromis.
- Striedať tajomstvá na postihnutých hostiteľoch. Fáza A hromadne zhromaždila prihlasovacie údaje SSH, cloudu, GitHubu, npm a peňaženky. Predpokladajte všetky prihlasovacie údaje, ktoré sú kedy prítomné v process.env, ~ / .ssh, ~/.aws, ~/.npmrc, ~ / .configalebo akékoľvek iné .env* súbor na postihnutom hostiteľovi je sprístupnený.
- Odstráňte perzistenciu (fáza B). V systéme Windows odstráňte HKCU\Softvér\Microsoft\Windows\Aktuálna verzia\Spustiť\Aktualizácia systému, odstrániť %APPDATA%\Microsoft\Windows\Ponuka Štart\Programy\Po spustení\system-update.bata schtasks /delete /tn SystemUpdate /fV systéme Linux crontab -e a odstrániť @reštart uzol …, systemctl –užívateľ zakázať –teraz phantom-bot.service potom vymaž ~/.config/systemd/user/phantom-bot.service, kroviny .bashrc / .zshrc / /etc/rc.localV systéme macOS, launchctl unload ~/Library/LaunchAgents/com.phantom.bot.plist potom vymažte plist.
- Blokujte hostiteľov C2. Pridajte štyri koncové body C2 z tabuľky IOC do zoznamu blokovaných výstupných operácií. *.serveousercontent.com a *.lhr.life* môže byť hromadne zablokované, ak vaše prostredie nemá legitímne využitie pre služby reverzného tunelovania.
- Hľadanie podľa TTP v čase inštalácie, nie užitočné zaťaženie. Položky uzamykateľného súboru inventára, ktorých package.json deklaroval predinštalovať, inštalovaťa po inštalácii všetky ukazujú na ten istý skript. Skontrolujte vek balíka a stav overenia vydavateľa. Tento vzorec je v legitímnych balíkoch zriedkavý a je najspoľahlivejším signálom, ktorý PhantomBot opakovane používa.
- Audit pre binárny súbor C2. Každý, kto si stiahol axois-utils:1.0.9 má server C2 operátora (c2 ELF, sha256 165fa92d…) na disku. Skenovať vyrovnávacie pamäte a úložiská artefaktov CI. Binárny súbor je sám o sebe neaktívny, ale jeho prítomnosť na pracovnej stanici je jednoznačným dôkazom, že balík bol nainštalovaný.
Záverečná čiara
Ten istý operátor, ten istý balík a ten istý inštalačný hook môžu v priebehu 48 hodín priniesť úplne odlišné hrozby. Sledujte scaffold, nie payload.




