TL; DR
En enkelt npm-udgiver, deadcode09284814, har kørt en typosquat-kampagne mod den legitime axios og chalk-template pakker siden midten af maj 2026.
Kampagnen begyndte som en konventionel tyveri af legitimationsoplysninger og tegnebøger, hvor data blev stjålet til en Serveo HTTPS-tunnel.
On 2026-05-17, med axois-utils:1.0.9, byttede operatøren nyttelasten fuldstændigt om: samme triple install-hook scaffold, samme udgiver, samme pakkenavn.
Men installationsscriptet er nu en DDoS-botnet-rekruttering på tværs af platforme.
Nyttelasten taler til en localhost.run tunnel og accepterer oversvømmelseskommandoer, hvilket forvandler inficerede miljøer til en del af et DDoS-kompatibelt botnet.
Operatøren sendte endda C2-server binær inde i tar-filen, hvilket viser en klar eskalering fra tyveri af legitimationsoplysninger til aktiv botnet-infrastruktur.
To pakker, fire versioner stadig aktive i registreringsdatabasen, og én operatør kører nu begge moduler parallelt.
Sværhedsgrad: høj.
Angrebet: Sådan fungerer det
Kampagnen er bygget på et bevidst kedeligt leveringsstillads: to typosquat-pakkenavne, et bogstavforskydning fra pakker med hundredvis af millioner ugentlige downloads (Axios, kridtskabelon), og tredobbelt installation hooks der garanterer udførelse. Det interessante er, hvad stilladset bærer — og det faktum, at operatøren ændrede lasten uden at ændre noget andet.
Det delte stillads
Hver publiceret version af begge pakker erklærer de samme tre livscyklusser hooks in pakke.json:
"scripts": { "preinstall": "node <payload>.js", "install": "node <payload>.js", "postinstall": "node <payload>.js" } Angivelse af nyttelasten under alle tre hooks er overdrevet – efterinstallation alene ville køre som standard npm installereValget er vigtigt: npm install –ignore-scripts springer scripts over, men flere almindelige arbejdsgange (CI-cache-gendannelser, der kører livscyklussen igen hooks selektivt, eller udviklere, der kun reviderer efterinstallation) lave en tredobbelt redundant erklæring er det sikreste bud for angriberen.
kridtskabelon tilføjer en anden mekanisme: den erklærer axois-utils:^1.0.7 som en runtime afhængighedInstallation af typosquatted kridtskabelon trækker derfor også den søskende typosquat ind, og begge nyttelaster kører. De to pakker er et koordineret par, ikke uafhængige lister.
Fase A — legitimationsoplysninger / tegnebogstyver (2026-05-15 → nutid)
Fase A er den oprindelige nyttelast. Læsseren er en kort postinstall.js der peger på en Serveo HTTPS reverse-tunnel:
// chalk-tempalte/postinstall.js:11-13 const C2_HOST = "f04a273bd84c0622-80-200-28-28.serveousercontent.com"; const C2_PORT = 443; const C2_PATH = '/collect'; Serveo-underdomænet koder destinations-IP'en (80.200.28.28) direkte i værtsnavnet — en genkendelig konvention for den pågældende tjeneste. Operatoren roterer det tilfældige underdomænepræfiks mellem versioner for at undgå naive domæneblokeringslister, men den underliggende IP flyttes aldrig.kridtskabelon: 1.0.14 anvendte 8a3e818ea8f11186-80-200-28-28…brug ; 1.0.16 / 1.0.19 / 1.0.20 f04a273bd84c0622-….)
postinstall.js hænderne væk til phantom.js, et bundtet "samler"-modul med 7,667 linjer. phantom.js går med værten for:
SSH private nøgler (~/.ssh/*) |
.npmrc indhold og evt. npm_* miljøtokens |
| AWS-, GCP- og Azure-legitimationsfiler |
GitHub personlig adgangstoken regex (ghp_*, gho_*, ghu_*, ghs_*) |
| Krypto-wallet-artefakter til Bitcoin, Exodus, Electrum, Monero, Litecoin, Dogecoin, Zcash, Dash |
En rekursiv .env* går igennem ~/projects, ~/dev, ~/code, ~/workspaceog installations-cwd'en |
Shells historier og den fulde process.env |
Bundtet sendes til Serveo-tunnelen kl. / indsamleDer er ingen forvirring, ingen anti-VM-logik, ingen staging – operatørens satsning er på volumen og hastighed.
Fase B — PhantomBot DDoS-rekruttering (2026-05-17, kun axois-utils:1.0.9)
Fase B erstatter phantom.js + postinstall.js med en enkelt fil ved navn distrube.js (tastefejlen er operatorens). Triple-hook-scaffoldet i package.json er uændret; pakken beholder samme navn, omfang og versionsbump-mønster. Udefra set ligner axois-utils:1.0.9 en mindre efterfølger til 1.0.6. Indvendigt er det en anden malware-familie.
distrube.js åbner med en konfigurationsblok, der navngiver operatørens eget branding:
// 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')}`; |
Kommentarerne er rettet til en fremtidig operatør, der kører kittet ("Brug din localhost.run HTTPS URL"). Det, plus det, der vises ved siden af botklienten, er et tegn på, at dette ikke bare er en offernyttelast - det er kittet.
Strømmen:
- Vedholdenhed kører først. Scriptet installerer sig selv på tre forskellige måder pr. operativsystem (registreringsdatabasen Kør + Startmappe + opgaver på Windows; crontab + phantom-bot.service systemd-enhed + .bashrc/.zshrc tilføj + /etc/rc.local på Linux; LaunchAgent com.phantom.bot.plist på macOS). Navnet på persistenstjenesten og LaunchAgent-etiketten er begge fantombot / com.phantom.bot, hvilket også er derfra kampagnenavnet stammer.
- Systeminfo exfil kører én gang — en one-shot fingeraftryks-POST til b94b6bcfa27554.lhr.life:443/collect, der indeholder værtsnavn, platform, arch, brugernavn, CPU/RAM, netværksgrænseflader, process.env, cwd, homedir, nodeversion og offentlig IP. Dette er meget mindre aggressivt end Fase A: ingen SSH, ingen wallets, ingen .env-rekursion. Bottens opgave er at tilmelde, ikke at stjæle.
- Hjerteslagsløjfe åbner et HTTPS POST hvert 30. sekund til b94b6bcfa27554.lhr.life:443/. Brugeragenten er PhantomBot/1.0. TLS-verifikation er eksplicit deaktiveret (rejectUnauthorized: false). C2-svaret parses som JSON af formatet {type, target, port, duration, threads, method} og afsendes.
- Oversvømmelsesarsenal er forbundet til seks kommandoer:
| Kommandotype | Moduler | Noter |
|---|---|---|
| ping | Livlighedssvar | Bot identificerer sig selv |
| http | HTTP oversvømmelse | Lag-7 anmodningsoversvømmelse |
| https | HTTPS-oversvømmelse | Samme som http, TLS-indpakket |
| tcp | TCP-oversvømmelse | 65 KB tilfældig nyttelast spam |
| uDP | UDP-oversvømmelse | 65,507-byte UDP-pakker |
| hurtige | HTTP/2 hurtig nulstilling af DoS | 2023 CVE-2023-44487-teknikken |
Alle fem oversvømmelsesmoduler tager en mål, port, varighedog tråde argument — botten er en generisk lejebottle, ikke rettet mod et bestemt offer. Operatørens offerliste findes på C2, ikke i pakken.
Nyheder her — den leverede C2-binære fil
Fase A er en velkendt form: tyveri af legitimationsoplysninger, installationshook, leverandørtunneleret C2. Fase B er også en velkendt form — DDoS-botnets har været en fast bestanddel af ondsindede npm-pakker i årevis. Det usædvanlige er, at operatøren sendte serversiden af kittet inde i npm tarballen:
- c2 — en 4-megabyte kompileret Go ELF binærfil
- c2.go — Go-kildekoden på 426 linjer for den binære fil
Ingen af filerne kaldes af nogen installationshook. De er ikke en del af offerets nyttelast. De sidder i pakkemappen på samme måde som en dokumentationsfil ville. Den mest plausible læsning er, at operatøren pushede deres udviklingsarbejdstræ til npm uden at kuratere fillisten - en rigtig OpSec-fejl - og det, der blev leveret, er det komplette tosidede sæt: klienten, som et offer kører, og serveren, som operatøren kører.
Det er den del af historien, der retfærdiggør fremstillingen af "nøglefærdigt botnet-sæt". Enhver, der downloadede axois-utils:1.0.9 før nedtagningen ikke kun har en offerprøve — de har en fungerende C2-server.
Omdrejningspunktet, i én sætning
Samme udgiver, samme pakkenavne, samme triple-hook-scaffold, samme "fantom"-branding - men nyttelasten ændrede monetiseringsmodellen natten over: fra "høsthemmeligheder jeg kan videresælge" til "leje oversvømmelseskapacitet jeg kan lease". De TTP'er på installationstidspunktet, som forsvarere bør holde øje med, er næsten identiske på tværs af begge faser; signaturbaserede forsvar, der er knyttet til Fase A's tegnebogssti-strenge eller til phantom.js's 7,667-linjers samler ville have gået glip af Fase B helt.
| Dato (UTC) | Begivenhed |
|---|---|
| 2026-05-15 | Første udgivelse: axois-utils:1.0.4 (LAN-testbygning, udviklingsrigg hos 192.168.129.19) |
| 2026-05-15 | axois-utils:1.0.6 udgivet — Fase A C2 ombyttet til 80.200.28.28 via Serveo-tunnelen; kildekommentaren // Change to '80.200.28.28' for public bekræfter dev→prod-byttet |
| 2026-05-16 | chalk-tempalte:1.0.14 og 1.0.16 udgivet — kædet læsser erklærer axois-utils:^1.0.7 som en runtime-afhængighed; Serveo-underdomæne roteret |
| 2026-05-16 | Fase A-kampagne opdaget under rutinemæssig npm-scanning; bekræftede skadelige domme anvendt |
| 2026-05-17 | axois-utils:1.0.9 udgivet — nyttelast-pivot: PhantomBot DDoS-rekruttering via localhost.run-tunnel; operatørside c2 binær og c2.go kildekode leveret i tarballen |
| 2026-05-17 | chalk-tempalte:1.0.19 og 1.0.20 udgivet — stadig Fase A (tyver); operatøren kører nu begge moduler parallelt |
| 2026-05-17 | Opdagelse af fase B under rutinemæssig scanning; vurderinger anvendt på tværs af alle 2026-05-17 versioner |
| (igangværende) | Fjernelsesrapporter afventer; alle fire udgivne pakker er stadig tilgængelige i registreringsdatabasen på tidspunktet for skrivningen |
Indikatorer for kompromis
Pakker
| Ecosystem | Pakke | versioner |
|---|---|---|
| NPM | axois-utils (typosquat af axios) | 1.0.4, 1.0.6, 1.0.9 |
| NPM | chalk-tempalte (typosquat af kridtskabelon) | 1.0.14, 1.0.16, 1.0.19, 1.0.20 |
Forfatteridentitet
| Felt | Værdi |
|---|---|
| npm-udgiver | deadcode09284814 |
| Udgiverens e-mail | phantomdeadcode@tutamail.com |
| SCM verifikation | ingen |
Kommando-og-kontrol
| Fase | Endpoint | Transport |
|---|---|---|
| A | f04a273bd84c0622-80-200-28-28.serveousercontent.com:443/collect | Serveo HTTPS-tunnel |
| A | 8a3e818ea8f11186-80-200-28-28.serveousercontent.com:443/collect | Serveo HTTPS-tunnel (tidligere version) |
| A | 80.200.28.28:443/collect | Underliggende VPS-slutpunkt |
| B | b94b6bcfa27554.lhr.life:443/ | localhost.run HTTPS omvendt tunnel |
Filsammendrag (SHA-256)
| File (Felt) | SHA-256 | Noter |
|---|---|---|
c2 (Gå ELF, 4 MB) | 165fa92d237fd017c227d00da06ab788212a62be94bf61e95df2d22d00377ef2 | Operatørside C2-server, leveres indeni axois-utils:1.0.9 |
c2.go (426 linjer) | 7d0ae79fdb1e9968f3323a3712b624643a782ba3efb2cf3a2cb9c4c5513cea30 | Gå til kildekoden for C2-binærfilen |
distrube.js | 308b15c023088a7188dea4ef609010ac2493eb4c365b103053d7621a9ca5b935 | Fase B botklient |
phantom.js (chalk-tempalte:1.0.19) | 9e380ec88d3ccf3929e1a104e3b868d4d7b59ca189a8a431a54e9f3357dfdd81 | Fase A-legitimationsoplysninger / tegnebogsindsamler |
phantom.js (chalk-tempalte:1.0.20) | d1c9e3f296ee9f7d5032f73f9c504cede50334bc14c394055fd5cb9c3a6e08b3 | Fase A-kollektor (variant 1.0.20) |
postinstall.js (chalk-tempalte:1.0.19 = 1.0.20) | ffba9bdd6793edd5b38e12900252c1813a693f59c25af51c3b658cf3f27b6162 | Fase A-loader, byte-identisk på tværs af begge versioner |
Attribuering og motivation
Vi følger denne kampagne som PhantomBot, der tager operatørens eget branding fra Brugeragent: PhantomBot/1.0 hjerteslagsoverskriften, den phantom-bot.service systemd-enheden, com.phantom.bot LaunchAgent-mærkatet og fantomdødkode@ e-mailadresse. Operatoren er konsekvent omkring dette navn på tværs af mindst fire artefakter.
Signalkatalog
- Forlægger — deadcode09284814 på npm. Enkelthåndskonto, engangs-e-mail fra Tutamail, nej SCM verifikation. Ingen tidligere publikationshistorik ud over denne kampagne.
- Genbrug af branding — “phantom” vises i udgiverens e-mail, i fase A-samlerens filnavn (phantom.js), i navnet på fase B-persistenstjenesten (phantom-bot.service), i LaunchAgent-etiketten (com.phantom.bot), og i bot-brugeragenten (PhantomBot/1.0).
- Infrastruktur — En enkelt VPS kl. 80.200.28.28 fronter Fase A via Serveo underdomænerotation; Fase B bevæger sig til en localhost.run omvendt tunnel (b94b6bcfa27554.lhr.lifeBegge leverandørtjenester er gratis og kræver kun udgående SSH fra operatørens side, hvilket er i overensstemmelse med lavbudget- og lav-OpSec-opsætninger.
- kode stil — Almindelig JavaScript overalt; ingen obfuskation, ingen strengkodning, ingen anti-VM-tjek. Variabelnavne er beskrivende (stjæleSystemInfo, udførKommando, httpFloodKommentarer i distrube.js direkte adressere en fremtidig operator ("Brug din localhost.run HTTPS URL"), hvilket antyder, at filen var beregnet til at blive videredistribueret som et kit, ikke brugt af en enkelt angriber.
- OpSec-slip — Fase B-tarballen leverer både botklienten og C2-serveren på operatørsiden (c2 ELF + c2.go kilde). Dette stemmer overens med en operator, der pushede sit arbejdstræ til npm uden at revidere fillisten. Enten er operatoren uerfaren, eller også er kittet betød skal distribueres offentligt, og C2-binærfilen er en del af produktet.
- Selvbekræftelse — axois-utils:1.0.4 indeholder kildekommentaren // Ændr til '80.200.28.28' for offentligheden på linje 12, der bekræfter den udviklings-/staging-/produktionsprogression, som operatører typisk benægter.
Motivation
Fase A-nyttelasten er simpelt finansielt tyveri: legitimationsoplysninger, cloudnøgler, GitHub-tokens og krypto-wallets har alle likvide videresalgsmarkeder. Fase B er også finansiel, men indirekte: DDoS-for-hire ("booter")-tjenester lejer oversvømmelseskapacitet minut for minut, og bots som den, der leveres her, er det inventar, disse tjenester kører på. 30-sekunders hjerteslaget, den generiske mål/port/varighed kommandoskemaet, og oversvømmelsesarsenalet med fem protokoller er standard produkt fra en booter-operatør.
Kørsel af begge moduler parallelt — kridtskabelon: 1.0.19 og 1.0.20 fortsætte med at sende tyveren, mens axois-utils:1.0.9 sender botten — antyder, at operatøren afdækker indtægtsstrømme i stedet for at opgive fase A. Pivot er en Desuden, ikke en erstatning.
Hvad vi ikke påstår
Vi har ikke været i stand til at bekræfte en virkelig identitet bag deadcode09284814 handle, og vi tilskriver ikke denne kampagne til nogen navngiven trusselsaktør, gruppe eller land. "Fantom"-brandingen er ensartet nok på tværs af artefakter til at antyde en enkelt operator, men den kit-lignende levering af C2-binærfilen åbner muligheden for, at fremtidige pakker fra ikke-relaterede handle vil genbruge den samme kode.
Indvirkning, tendenser og hvad forsvarere bør gøre
Impact
De legitime squat-mål Axios og kridtskabelon er i vid udstrækning afhængige af i JavaScript-økosystemet; Axios alene er blandt de 30 mest downloadede npm-pakker. Typosquat-navnene er ét tastetryk væk fra de rigtige (axois ↔ Axios, skabelon ↔ skabelon), og begge er sprogligt plausible stavefejl.
Vi kunne ikke indhente pålidelige downloadstatistikker for de skadelige versioner før fjernelse — npm gemmer ikke antallet af downloads pr. version, efter at en pakke er blevet depubliceret, og npms.io-style proxyer er støjende i denne skala. Enhver organisation, hvis låsefil omdannes til en pakke med navnet axois-utils or kridtskabelon fra udgiveren deadcode09284814 bør behandles som kompromitteret: roter alle tilstedeværende legitimationsoplysninger i proces.env på den berørte vært, revidér persistensvektorer pr. operativsystem (se "Hvad forsvarere bør gøre" nedenfor), og fjern afhængigheden.
Nye mønstre
Denne kampagne eksemplificerer et skift, vi har set i flere nylige npm-hændelser: Installationskrogstilladset er det holdbare aktivnyttelasten kan udskiftesDen samme udgiver, den samme pakke, den samme forudinstallation / installere / efterinstallation tredobbelt, og endda den samme versionsbump-kadence — det eneste, der ændrede sig mellem axois-utils:1.0.6 og axois-utils:1.0.9 var filen den hooks kørsel. Signaturbaseret detektion nøglet til Fase A-nyttelasten (wallet-path-strenge, phantom.js's 7,667-linjers samler, Serveo C2-værten) ville have markeret de første tre versioner og helt misset Fase B.
Det samme mønster er synligt på tværs af andre kampagner i 2026, som vi har fulgt: en enkelt operatør med et stabilt scaffold, der skifter mellem tyveri af legitimationsoplysninger, eksamenssnydende klienter, Telegram-bot exfil og nu DDoS-rekruttering. Forsvarere, der er afhængige af payload-signaturer, vil blive ved med at tabe anden runde af hver kampagne.
Konsekvensen er, at TTP'er på installationstidspunktet er det bedre signalTriple install-hook-deklarationer, installationsscripts der importerer https or barn_proces, installer scripts, der skriver til brugerens opstartsmapper, og installer scripts, der fortolker værtsnavne på gratis reverse-tunnel-tjenester (Serveo, localhost.run, ngrok, cloudflared) er alle sjældne i legitime pakker og almindelige på tværs af ondsindede pakker.
Hvad forsvarere bør gøre
- Låsefilrevision. Søg hver package-lock.json / garn.lås / pnpm-lock.yaml i din organisation for de præcise strenge axois-utils og kridtskabelonBetragt ethvert match som et kompromis.
- Roter hemmeligheder på berørte værter. Fase A masseindsamlede SSH-, cloud-, GitHub-, npm- og wallet-legitimationsoplysninger. Antag, at alle legitimationsoplysninger, der nogensinde er til stede i proces.env, ~ / .ssh, ~/.aws, ~/.npmrc, ~ / .config, eller hvilket som helst .env* Filen på den berørte vært er eksponeret.
- Fjern vedholdenhed (Fase B). Slet på Windows HKCU\Software\Microsoft\Windows\CurrentVersion\Kør\Systemopdatering, fjern %APPDATA%\Microsoft\Windows\Startmenu\Programmer\Opstart\system-update.batog schtasks /delete /tn Systemopdatering /fPå Linux, crontab -e og fjern @genstart-node …, systemctl –bruger deaktiver –now phantom-bot.service derefter slette ~/.config/systemd/bruger/phantom-bot.service, skrubbe .bashrc / .zshrc / /etc/rc.localPå macOS, launchctl unload ~/Bibliotek/LaunchAgents/com.phantom.bot.plist slet derefter plisten.
- Bloker C2-værterne. Tilføj de fire C2-slutpunkter i IOC-tabellen til din udgående blokeringsliste. *.serveousercontent.com og *.lhr.liv kan blokeres i sin helhed, hvis dit miljø ikke har nogen legitim anvendelse til reverse-tunnel-tjenester.
- Søge efter TTP på installationstidspunktet, ikke nyttelast. Lagerlåsefilposter, hvis pakke.json erklærer forudinstallation, installereog efterinstallation alle peger på det samme script. Krydstjek mod pakkens alder og udgiverens verifikationsstatus. Dette mønster er sjældent i legitime pakker og er det mest pålidelige signal, som PhantomBot genbruger.
- Revision for C2-binærfilen. Enhver, der downloadede axois-utils:1.0.9 har operatørens C2-server (c2 ELF, sha256 165fa92d…) på disk. Scan cacher og CI-artefaktlagre. Den binære fil er inaktiv i sig selv, men dens tilstedeværelse på en arbejdsstation er et utvetydigt bevis på, at pakken blev installeret.
Afslutningslinje
Den samme operatør, den samme pakke og den samme installationshook kan levere helt forskellige trusler inden for 48 timer. Hold øje med scaffoldet, ikke nyttelasten.




