TL, DR
Jeden vydavatel NPM, deadcode09284814, vedl kampaň s překlepy proti legitimním axios a chalk-template balíčky od poloviny května 2026.
Kampaň začala jako konvenční krádež přihlašovacích údajů a peněženek, která vylákala data do HTTPS tunel Serveo.
On 2026-05-17s axois-utils:1.0.9, operátor zcela vyměnil datovou část: stejný trojitý instalační hook scaffold, stejný vydavatel, stejný název balíčku.
Instalační skript je ale nyní multiplatformní verb do DDoS botnetu.
Užitečné zatížení hovoří o localhost.run tunel a přijímá příkazy flood, čímž se infikovaná prostředí stávají součástí botnetu s možností DDoS útoků.
Provozovatel dokonce odeslal Binární soubor serveru C2 uvnitř tarballu, což ukazuje jasnou eskalaci od krádeže přihlašovacích údajů k aktivní infrastruktuře botnetu.
Dva balíčky, čtyři verze stále aktivní v registru a jeden operátor nyní spouští oba moduly paralelně.
Závažnost: vysoká.
Útok: Jak to funguje
Kampaň je postavena na záměrně nudném systému doručování: dva překlepy v názvech balíčků, o jedno písmeno odlišné od balíčků se stovkami milionů týdenních stažení (axios, křídová šablona) a trojitou instalaci hooks které zaručují provedení. Zajímavé je, co lešení nese — a skutečnost, že provozovatel změnil náklad, aniž by změnil cokoli jiného.
Sdílené lešení
Každá publikovaná verze obou balíčků deklaruje stejné tři životní cykly. hooks in balíček.json:
"scripts": { "preinstall": "node <payload>.js", "install": "node <payload>.js", "postinstall": "node <payload>.js" } Výpis užitečného zatížení pod všemi třemi hooks je přehnané – po instalaci sám by běžel ve výchozím nastavení npm installNa volbě záleží: npm install –ignore-scripts přeskakuje skripty, ale několik běžných pracovních postupů (obnovení mezipaměti CI, které znovu spouštějí životní cyklus) hooks selektivně nebo vývojáři, kteří pouze auditují po instalaci) učinit z trojitě redundantní deklarace nejbezpečnější sázku pro útočníka.
křídová šablona přidává druhý mechanismus: deklaruje axois-utils:^1.0.7 jako běhové prostředí závislostInstalace překlepu křídová šablona proto načte i sourozenecký typosquat a oba datové části se spustí. Tyto dva balíčky jsou koordinovaný pár, nikoli nezávislé výpisy.
Fáze A — zloděj přihlašovacích údajů / peněženek (2026-05-15 → současnost)
Fáze A je původní užitečné zatížení. Nakladač je krátký postinstall.js který ukazuje na reverzní tunel HTTPS služby 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'; Subdoména Serveo kóduje cílovou IP adresu (80.200.28.28) přímo v názvu hostitele – rozpoznatelná konvence pro danou službu. Operátor střídá náhodný prefix subdomény mezi verzemi, aby se vyhnul blokovacím seznamům naivních domén, ale podkladová IP adresa se nikdy nezmění. (křída-šablona:1.0.14 použitý 8a3e818ea8f11186-80-200-28-28…; použití 1.0.16 / 1.0.19 / 1.0.20 f04a273bd84c0622-….)
postinstall.js ruce pryč od phantom.js, sběratelský modul s 7 667 řádky. phantom.js prochází hostitele po dobu:
Soukromé klíče SSH (~/.ssh/*) |
.npmrc obsah a jakékoli npm_* tokeny prostředí |
| Soubory s přihlašovacími údaji AWS, GCP a Azure |
Regex osobního přístupového tokenu GitHubu (ghp_*, gho_*, ghu_*, ghs_*) |
| Artefakty krypto peněženky pro Bitcoin, Exodus, Electrum, Monero, Litecoin, Dogecoin, Zcash, Dash |
Rekurzivní .env* projít ~/projects, ~/dev, ~/code, ~/workspacea instalační cwd |
Historie Shellu a kompletní informace process.env |
Balíček je odeslán do tunelu Serveo na adrese / sbíratNeexistuje žádné zmatkování, žádná logika proti virtuálním strojům ani staging – operátor sází na objem a rychlost.
Fáze B – Nábor PhantomBot DDoS útoků (17. 05. 2026, pouze axois-utils:1.0.9)
Fáze B nahrazuje phantom.js + postinstall.js jedním souborem s názvem distrube.js (překlep je na straně operátora). Triple-hook scaffold v package.json zůstává nezměněn; balíček si zachovává stejný název, rozsah a vzor pro zvýšení verze. Zvenčí vypadá axois-utils:1.0.9 jako drobné pokračování verze 1.0.6. Uvnitř se jedná o jinou rodinu malwaru.
distrube.js otevírá se konfiguračním blokem, který pojmenovává 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áře jsou adresovány budoucímu operátorovi, který bude sadu spouštět („Použijte HTTPS URL localhost.run“). To, plus to, co je dodáváno s klientem bota, je varovným signálem, že se nejedná jen o datovou část oběti – jde o samotnou sadu.
Průtok:
- Perzistence Spustí se jako první. Skript se sám nainstaluje třemi různými způsoby v závislosti na operačním systému (registr Běh + Složka po spuštění + schtasks ve Windows; crontab + služba phantom-bot jednotka systemd + .bashrc/.zshrc přidat + /etc/rc.local na Linuxu; LaunchAgent com.phantom.bot.plist v systému macOS). Název služby perzistence a popisek LaunchAgent jsou oba fantomový robot / com.phantom.bot, odkud také pochází název kampaně.
- Systémové informace exfil spustí se jednou – jednorázový POST s otiskem prstu na b94b6bcfa27554.lhr.life:443/collect s uvedením názvu hostitele, platformy, archu, uživatelského jména, CPU/RAM, síťových rozhraní, process.env, cwd, domovského adresáře, verze uzlu a veřejné IP adresy. Toto je mnohem méně agresivní než Fáze A: žádné SSH, žádné peněženky, žádná rekurze .env. Úkolem bota je registrovat, ne krást.
- Smyčka srdečního tepu Otevírá HTTPS POST každých 30 sekund na b94b6bcfa27554.lhr.life:443/. Uživatelský agent je PhantomBot/1.0. Ověřování TLS je explicitně zakázáno (rejectUnauthorized: false). Odpověď C2 je analyzována jako JSON ve formátu {type, target, port, duration, threads, method} a odeslána.
- Povodňový arzenál je zapojen do šesti příkazů:
| Typ příkazu | Modul | Poznámky |
|---|---|---|
| ping | Odpověď na živost | Bot se identifikuje |
| http | HTTP záplava | Záplava požadavků vrstvy 7 |
| https | HTTPS záplava | Stejné jako http, zabalené v TLS |
| tcp | TCP záplava | 65 KB náhodného datového obsahu spamu |
| udp | UDP záplava | 65 507 bajtů UDP paketů |
| rychlý | DoS s rychlým resetem HTTP/2 | Technika CVE-2023-44487 z roku 2023 |
Všech pět protipovodňových modulů zabere cíl, přístav, trvání, a nitě argument – bot je obecný flooder k pronájmu, který není zaměřen na žádnou konkrétní oběť. Seznam obětí operátora se nachází na C2, nikoli v balíčku.
Co je zde nového — dodaný binární soubor C2
Fáze A má známý tvar: krádež přihlašovacích údajů, instalační hook, tunelování C2 dodavatelem. Fáze B je také známý tvar – DDoS botnety jsou již léta nedílnou součástí škodlivých npm balíčků. Neobvyklé je, že operátor dodal strana serveru sady uvnitř tarballu npm:
- c2 — 4MB kompilovaný binární soubor Go ELF
- c2.go — 426řádkový zdrojový kód Go pro daný binární kód
Ani jeden ze souborů není vyvolán žádným instalačním hookem. Nejsou součástí datové části oběti. Nacházejí se v adresáři balíčku stejně jako soubor s dokumentací. Nejpravděpodobnějším výkladem je, že operátor odeslal svůj vývojový pracovní strom do npm bez úpravy seznamu souborů – skutečný OpSec překlep – a to, co bylo dodáno, je kompletní oboustranná sada: klient, kterého spouští oběť, a server, který spouští operátor.
Toto je část příběhu, která ospravedlňuje označení za „kompletní sadu pro botnet“. Každý, kdo si stáhl axois-utils:1.0.9 před zastavením má nejen vzorek oběti – má také funkční server C2.
Pivot, jednou větou
Stejný vydavatel, stejné názvy balíčků, stejný trojitý systém scaffoldů, stejný „fantomový“ branding – ale datové zatížení přes noc změnilo model monetizaceod „sklízení tajemství, která mohu dále prodat“ po „pronájem kapacity pro zahlcení, kterou mohu pronajmout“. Doby trvání instalace (TTP), které by si měli obránci hlídat, jsou v obou fázích téměř identické; obrana založená na podpisech je klíčována k řetězcům peněženky fáze A nebo k phantom.jsSběratel s 7 667 řádky by Fázi B zcela minul.
| Datum (UTC) | událost |
|---|---|
| 2026-05-15 | První publikace: axois-utils:1.0.4 (Testovací sestavení pro LAN, vývojové zařízení na 192.168.129.19) |
| 2026-05-15 | axois-utils:1.0.6 publikováno — Fáze A C2 vyměněna za 80.200.28.28 přes tunel Serveo; komentář ke zdroji // Change to '80.200.28.28' for public potvrzuje swap mezi vývojáři a produkčními produkty |
| 2026-05-16 | chalk-tempalte:1.0.14 a 1.0.16 publikováno — deklarace řetězeného zavaděče axois-utils:^1.0.7 jako závislost za běhu; subdoména Serveo otočena |
| 2026-05-16 | Kampaň fáze A odhalena během rutinního skenování NPM; aplikovány verdikty o potvrzeném škodlivém produktu. |
| 2026-05-17 | axois-utils:1.0.9 publikováno — pivot datového zatížení: nábor PhantomBot DDoS přes tunel localhost.run; strana operátora c2 binární a c2.go zdrojový kód je součástí tarballu |
| 2026-05-17 | chalk-tempalte:1.0.19 a 1.0.20 publikováno — stále Fáze A (zloděj); operátor nyní spouští oba moduly paralelně |
| 2026-05-17 | Objev fáze B během rutinního skenování; verdikty aplikované na všechny 2026-05-17 verze |
| (pokračující) | Zprávy o zastavení šíření čekají na vyřízení; všechny čtyři zveřejněné balíčky jsou v době psaní článku stále k dispozici v registru. |
Ukazatele kompromisu
Balíčky
| Ekosystém | Balíček | verze |
|---|---|---|
| Npm | axois-utils (překlep) | 1.0.4, 1.0.6, 1.0.9 |
| Npm | chalk-tempalte (typosquat z křídové šablony) | 1.0.14, 1.0.16, 1.0.19, 1.0.20 |
Identita autora
| Pole | Hodnota |
|---|---|
| vydavatel npm | deadcode09284814 |
| E-mail vydavatele | phantomdeadcode@tutamail.com |
| SCM ověření | žádný |
Command-and-control
| Fáze | Konečný bod | DOPRAVA |
|---|---|---|
| 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ší verze) |
| A | 80.200.28.28:443/collect | Podkladový VPS endpoint |
| B | b94b6bcfa27554.lhr.life:443/ | localhost.run HTTPS reverzní tunel |
Souborové výtahy (SHA-256)
| Soubor | SHA-256 | Poznámky |
|---|---|---|
c2 (Přejít na ELF, 4 MB) | 165fa92d237fd017c227d00da06ab788212a62be94bf61e95df2d22d00377ef2 | Server C2 na straně operátora, dodáván uvnitř axois-utils:1.0.9 |
c2.go (426 řádků) | 7d0ae79fdb1e9968f3323a3712b624643a782ba3efb2cf3a2cb9c4c5513cea30 | Zdrojový kód Go pro binární soubor C2 |
distrube.js | 308b15c023088a7188dea4ef609010ac2493eb4c365b103053d7621a9ca5b935 | Klient botů fáze B |
phantom.js (chalk-tempalte:1.0.19) | 9e380ec88d3ccf3929e1a104e3b868d4d7b59ca189a8a431a54e9f3357dfdd81 | Fáze A - sběrač pověření / peněženek |
phantom.js (chalk-tempalte:1.0.20) | d1c9e3f296ee9f7d5032f73f9c504cede50334bc14c394055fd5cb9c3a6e08b3 | Kolektor fáze A (varianta 1.0.20) |
postinstall.js (chalk-tempalte:1.0.19 = 1.0.20) | ffba9bdd6793edd5b38e12900252c1813a693f59c25af51c3b658cf3f27b6162 | Zavaděč fáze A, bajtově identický v obou verzích |
Atribuce a motivace
Tuto kampaň sledujeme jako PhantomBot, přičemž si operátor přebírá vlastní značku od Uživatelský agent: PhantomBot/1.0 záhlaví srdečního tepu, služba phantom-bot jednotka systemd, ta com.phantom.bot Popisek LaunchAgent a phantomdeadcode@ e-mailový handle. Operátor je ohledně tohoto názvu konzistenční napříč nejméně čtyřmi artefakty.
Katalog signálů
- Vydavatel - mrtvý kód09284814 na npm. Účet s jedním správcem, jednorázový e-mail Tutamail, ne SCM ověření. Žádná předchozí publikační historie mimo tuto kampaň.
- Opětovné použití značky — „phantom“ se objevuje v e-mailu vydavatele, v názvu souboru kolektoru fáze A (phantom.js), v názvu služby perzistence fáze B (služba phantom-bot), v popisku LaunchAgent (com.phantom.bot) a v uživatelském agentu bota (PhantomBot/1.0).
- Infrastruktura — Jeden VPS na 80.200.28.28 fronty Fáze A prostřednictvím rotace subdomény Serveo; Fáze B se přesouvá do localhost.run zpětný tunel (b94b6bcfa27554.lhr.life). Obě služby dodavatele jsou zdarma a vyžadují pouze odchozí SSH na straně operátora, což je v souladu s nízkorozpočtovými nastaveními s nízkými provozními náklady.
- styl kódu — Čistý JavaScript v celém textu; žádné zmatkování, žádné kódování řetězců, žádné kontroly anti-VM. Názvy proměnných jsou popisné (stealSystemInfo, executeCommand, httpFlood). Komentáře v distrube.js přímo oslovovat budoucího operátora („Použijte URL adresu HTTPS vašeho localhost.run“), což naznačuje, že soubor byl určen k další distribuci jako sada, nikoli k použití jedním útočníkem.
- Prohlášení o operační bezpečnosti — Archiv fáze B obsahuje jak bot klienta, tak i server C2 na straně operátora (c2 ELF + c2.go zdroj). To je v souladu s operátorem, který odeslal svůj pracovní strom do npm bez auditu seznamu souborů. Buď je operátor nezkušený, nebo je sada znamenalo k veřejné distribuci a binární soubor C2 je součástí produktu.
- Sebepotvrzení - axois-utils:1.0.4 obsahuje komentář ke zdroji // Změnit na '80.200.28.28' pro veřejné na řádku 12, potvrzující postup vývoje / staging / produkce, který operátoři obvykle popírají.
Motivace
Fáze A představuje přímočarou finanční krádež: přihlašovací údaje, cloudové klíče, tokeny GitHubu a krypto peněženky mají likvidní trhy pro další prodej. Fáze B je také finanční, ale nepřímá: služby DDoS for-hire („booter“) si pronajímají kapacitu každou minutu a boti, jako je ten, který je zde uveden, jsou inventářem, na kterém tyto služby běží. 30sekundový srdeční tep, obecný cíl/přístav/trvání schéma příkazů a pětiprotokolová arzenál povodní jsou standard produkt operátora bootera.
Spuštění obou modulů paralelně — křída-šablona:1.0.19 a 1.0.20 pokračujte v přepravě zloděje, zatímco axois-utils:1.0.9 odesílá bota – naznačuje, že provozovatel se snaží zajistit zdroje příjmů, spíše než aby opustil fázi A. Pivot je přidání, nikoli náhrada.
Co netvrdíme
Nebyli jsme schopni potvrdit skutečnou identitu za mrtvý kód09284814 handle a tuto kampaň nepřipisujeme žádnému jmenovanému aktérovi hrozby, skupině ani zemi. Značení „fantoma“ je napříč artefakty dostatečně konzistentní, aby naznačovalo jediného operátora, ale dodávání binárního souboru C2 ve stylu stavebnice ponechává otevřenou možnost, že budoucí balíčky z nesouvisejících handleů budou znovu používat stejný kód.
Dopad, trendy a co by měli obránci dělat
Dopad
Legitimní cíle pro dřepy axios a křídová šablona jsou v ekosystému JavaScriptu široce závislé; axios sám o sobě patří mezi třicet nejstahovanějších npm balíčků. Názvy s překlepy jsou od skutečných názvů vzdáleny jen o stisknutí klávesy (axois ↔ axios, šablona ↔ šablona) a oba jsou jazykově pravděpodobné pravopisné chyby.
Před odstraněním balíčku se nám nepodařilo získat spolehlivé statistiky stahování škodlivých verzí – npm neukládá počty stahování pro jednotlivé verze po zrušení publikování balíčku a npms.ioProxy ve stylu - jsou v tomto měřítku hlučné. Jakákoli organizace, jejíž soubor zámku se definuje jako balíček s názvem axois-utils or křídová šablona od vydavatele mrtvý kód09284814 by mělo být považováno za ohrožené: střídat všechny dostupné přihlašovací údaje process.env na postiženém hostiteli auditujte vektory perzistence pro každý operační systém (viz níže „Co by měli obránci dělat“) a odstraňte závislost.
Vznikající vzorce
Tato kampaň je příkladem posunu, který jsme zaznamenali v několika nedávných incidentech týkajících se nových marketingových aktivit: Lešení s montážními háky je trvanlivým aktivem; užitečné zatížení je vyměnitelnéStejný vydavatel, stejný balíček, stejný předinstalace / instalovat / po instalaci trojitý, a dokonce i stejná kadence při zvyšování verze – jediná věc, která se mezitím změnila axois-utils:1.0.6 a axois-utils:1.0.9 byl to soubor hooks spustit. Detekce založená na podpisu s klíčem k datové části fáze A (řetězce cesty k peněžence, phantom.jsSběrač o délce 7 667 řádků, hostitel Serveo C2), by označil první tři verze a Fáze B by zcela minul.
Stejný vzorec je patrný i u dalších kampaní z roku 2026, které jsme sledovali: jeden operátor se stabilní základnou, střídající se mezi krádeží přihlašovacích údajů, klienty podvádějícími zkoušky, expilací pomocí Telegram-botů a nyní i náborem DDoS. Obránci, kteří se spoléhají na podpisy dat, budou i nadále prohrávat druhé kolo každé kampaně.
Důsledkem je, že Doba trvání instalace (TTP) je lepším signálem.Trojité deklarace install-hooku, instalační skripty, které importují https or podřízený_proces, nainstalujte skripty, které zapisují do spouštěcích složek uživatele, a nainstalujte skripty, které překládají názvy hostitelů na bezplatných službách reverzního tunelování (Serveo, localhost.run, ngrok, cloudflared) jsou vzácné v legitimních balíčcích a běžné v těch škodlivých.
Co by měli obránci dělat
- Audit uzamčených souborů. Hledat každých balíček-lock.json / yarn.lock / pnpm-lock.yaml ve vaší organizaci pro přesné řetězce axois-utils a křídová šablonaBerte jakýkoli zápas jako kompromis.
- Otáčení tajných kódů na postižených hostitelích. Fáze A hromadně shromažďovala přihlašovací údaje SSH, cloudu, GitHubu, npm a peněženky. Předpokládejme všechny přihlašovací údaje, které kdy byly přítomny v process.env, ~ / .ssh, ~/.aws, ~/.npmrc, ~ / .config, nebo nějaký .env* soubor na postiženém hostiteli je zpřístupněn.
- Odstraňte perzistenci (fáze B). Ve Windows smažte HKCU\Software\Microsoft\Windows\Aktuální verze\Spustit\Aktualizace systému, odstranit %APPDATA%\Microsoft\Windows\Nabídka Start\Programy\Po spuštění\system-update.bat, a schtasks /delete /tn SystemUpdate /fV Linuxu crontab -e a odstranit @reboot uzel …, systemctl –uživatel zakázat –nyní phantom-bot.service poté smažte ~/.config/systemd/user/phantom-bot.service, křoviny .bashrc / .zshrc / /etc/rc.localV systému macOS launchctl unload ~/Library/LaunchAgents/com.phantom.bot.plist pak smažte soubor plist.
- Zablokujte hostitele C2. Přidejte čtyři koncové body C2 z tabulky IOC do seznamu blokovaných výstupních adres. *.serveousercontent.com a *.lhr.life* lze hromadně zablokovat, pokud vaše prostředí nemá legitimní využití pro služby reverzního tunelování.
- Hledání podle TTP v době instalace, nikoli užitečné zatížení. Položky uzamčeného souboru inventáře, jejichž balíček.json prohlašuje, předinstalace, instalovat, a po instalaci všechny ukazují na stejný skript. Proveďte křížovou kontrolu porovnání stáří balíčku a stavu ověření vydavatele. Tento vzorec je u legitimních balíčků vzácný a je nejspolehlivějším signálem, který PhantomBot opakovaně používá.
- Audit pro binární soubor C2. Každý, kdo si stáhl axois-utils:1.0.9 má server C2 operátora (c2 ELF, sha256 165fa92d…) na disku. Prohledejte mezipaměti a úložiště artefaktů CI. Binární soubor je sám o sobě neaktivní, ale jeho přítomnost na pracovní stanici je jednoznačným důkazem, že balíček byl nainstalován.
Závěrečná čára
Stejný operátor, stejný balíček a stejný instalační hook mohou během 48 hodin poskytnout zcela odlišné hrozby. Sledujte scaffold, ne payload.




