TL; DR
Sebuah penerbit npm tunggal, deadcode09284814, telah menjalankan kempen typosquat terhadap pihak yang sah axios dan chalk-template pakej sejak pertengahan Mei 2026.
Kempen ini bermula sebagai pencuri kelayakan dan dompet konvensional, yang mengalirkan data ke Terowong HTTPS Serveo.
On 2026-05-17, Dengan axois-utils:1.0.9, operator menukar muatan sepenuhnya: perancah cangkuk pemasangan tiga kali ganda yang sama, penerbit yang sama, nama pakej yang sama.
Tetapi skrip pemasangan kini merupakan rekrut botnet DDoS merentas platform.
Muatan itu bercakap kepada a localhost.run terowong dan menerima arahan banjir, menjadikan persekitaran yang dijangkiti menjadi sebahagian daripada botnet berkemampuan DDoS.
Pengendali itu juga menghantar Perduaan pelayan C2 di dalam tarball, menunjukkan peningkatan yang jelas daripada kecurian kelayakan kepada infrastruktur botnet aktif.
Dua pakej, empat versi masih aktif pada daftaran, dan satu operator kini menjalankan kedua-dua modul secara selari.
Keterukan: tinggi.
Serangan: Bagaimana Ia Berfungsi
Kempen ini dibina di atas perancah penghantaran yang sengaja membosankan: dua nama pakej typosquat, satu huruf di luar pakej dengan ratusan juta muat turun mingguan (axios, templat kapur), dan pemasangan tiga kali ganda hooks pelaksanaan jaminan itu. Apa yang menarik ialah apa perancahnya membawa — dan hakikat bahawa pengendali telah menukar kargo tanpa mengubah apa-apa lagi.
Perancah yang dikongsi
Setiap versi kedua-dua pakej yang diterbitkan mengisytiharkan tiga kitaran hayat yang sama hooks in package.json:
Menyenaraikan muatan di bawah ketiga-tiganya hooks adalah keterlaluan — selepas pemasangan sahaja akan berjalan secara lalai npm memasangPilihan itu penting: npm pasang –abaikan-skrip melangkau skrip, tetapi beberapa aliran kerja biasa (cache CI memulihkan kitaran hayat jalan semula itu hooks secara selektif, atau pemaju yang hanya mengaudit selepas pemasangan) membuat pengisytiharan tiga kali ganda sebagai pertaruhan paling selamat untuk penyerang.
templat kapur menambah mekanisme kedua: ia mengisytiharkan axois-utils:^1.0.7 sebagai masa jalan pergantunganMemasang typosquatted templat kapur oleh itu, typosquat adik-beradik juga akan dimasukkan, dan kedua-dua muatan akan dijalankan. Kedua-dua pakej tersebut merupakan pasangan yang diselaraskan, bukan penyenaraian bebas.
Fasa A — pencuri kelayakan / dompet (2026-05-15 → kini)
Fasa A ialah muatan asal. Pemuat adalah pendek postinstall.js yang menghala ke terowong terbalik Serveo HTTPS:
Subdomain Serveo mengekod IP destinasi (80.200.28.28) secara langsung dalam nama hos — konvensyen yang boleh dikenali untuk perkhidmatan tersebut. Operator memutarkan awalan subdomain rawak antara versi untuk mengelakkan senarai sekatan domain naif, tetapi IP yang mendasari tidak pernah bergerak. (chalk-tempalte:1.0.14 digunakan 8a3e818ea8f11186-80-200-28-28…; 1.0.16 / 1.0.19 / 1.0.20 penggunaan f04a273bd84c0622-….)
postinstall.js lepas tangan ke phantom.js, modul “pengumpul” yang dibundel dengan 7,667 baris. phantom.js berjalan bersama tuan rumah untuk:
Kunci peribadi SSH (~/.ssh/*) |
.npmrc kandungan dan sebarang npm_* token persekitaran |
| Fail kelayakan AWS, GCP dan Azure |
Regex token akses peribadi GitHub (ghp_*, gho_*, ghu_*, ghs_*) |
| Artifak dompet kripto untuk Bitcoin, Exodus, Electrum, Monero, Litecoin, Dogecoin, Zcash, Dash |
Rekursif .env* berjalan melalui ~/projects, ~/dev, ~/code, ~/workspace, dan pemasangan cwd |
Sejarah Shell dan yang lengkap process.env |
Bungkusan tersebut dihantar ke terowong Serveo di / kumpulkanTiada pengeliruan, tiada logik anti-VM, tiada pementasan — taruhan pengendali adalah pada kelantangan dan kelajuan.
Fasa B — Perekrutan DDoS PhantomBot (2026-05-17, axois-utils:1.0.9 sahaja)
Fasa B menggantikan phantom.js + postinstall.js dengan satu fail bernama distrube.js (salah taip adalah operator). Perancah triple-hook dalam package.json tidak berubah; pakej mengekalkan nama, skop dan corak versi-bump yang sama. Dari luar, axois-utils:1.0.9 kelihatan seperti susulan kecil kepada 1.0.6. Di dalamnya, ia adalah keluarga perisian hasad yang berbeza.
distrube.js dibuka dengan blok konfigurasi yang menamakan penjenamaan pengendali sendiri:
// 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')}`; |
Komen-komen tersebut ditujukan kepada pengendali masa hadapan yang menjalankan kit tersebut (“Gunakan URL HTTPS localhost.run anda”). Itu, ditambah dengan apa yang dihantar di sebelah klien bot, adalah petunjuk bahawa ini bukan sekadar muatan mangsa — ia adalah kit tersebut.
Aliran:
- Kegigihan berjalan dahulu. Skrip memasang dirinya sendiri dalam tiga cara berbeza bagi setiap OS (registri Main + Folder permulaan + schtasks pada Windows; crontab + perkhidmatan phantom-bot unit sistem + .bashrc/.zshrc tambah + /etc/rc.local pada Linux; LaunchAgent com.phantom.bot.plist pada macOS). Nama perkhidmatan persistensi dan label LaunchAgent kedua-duanya bot hantu / com.phantom.bot, yang juga merupakan asal usul nama kempen tersebut.
- Maklumat sistem exfil berjalan sekali — cap jari sekali guna POST ke b94b6bcfa27554.lhr.life:443/collect yang membawa nama hos, platform, arch, nama pengguna, CPU/RAM, antara muka rangkaian, process.env, cwd, homedir, versi nod dan IP awam. Ini jauh kurang agresif berbanding Fasa A: tiada SSH, tiada dompet, tiada rekursi .env. Tugas bot adalah untuk mendaftar, bukan mencuri.
- Gelung degupan jantung membuka HTTPS POST setiap 30 saat ke b94b6bcfa27554.lhr.life:443/. Ejen Pengguna ialah PhantomBot/1.0. Pengesahan TLS dinyahdayakan secara eksplisit (rejectUnauthorized: false). Respons C2 dihuraikan sebagai JSON dalam bentuk {type, target, port, duration, threads, method} dan dihantar.
- Senjata banjir disambungkan kepada enam arahan:
| Jenis arahan | Modul | Nota |
|---|---|---|
| ping | Balasan keceriaan | Bot mengenal pasti dirinya |
| http | banjir HTTP | Banjir permintaan Lapisan-7 |
| https | Banjir HTTPS | Sama seperti http, dibalut dengan TLS |
| tcp | banjir TCP | Spam muatan rawak 65 KB |
| udp | banjir UDP | Paket UDP 65,507-bait |
| pesat | DoS penetapan semula pantas HTTP/2 | Teknik CVE-2023-44487 2023 |
Kesemua lima modul banjir mengambil masa sasaran, pelabuhan, tempoh, dan benang hujah — bot tersebut ialah pembanjiri untuk disewa generik, tidak ditujukan kepada mana-mana mangsa tertentu. Senarai mangsa pengendali terdapat pada C2, bukan dalam pakej.
Apa yang Baharu Di Sini — binari C2 yang dihantar
Fasa A ialah bentuk yang biasa: kecurian kelayakan, cangkuk pemasangan, C2 terowong vendor. Fasa B ialah Juga bentuk yang biasa — botnet DDoS telah menjadi sebahagian daripada pakej npm berniat jahat selama bertahun-tahun. Apa yang luar biasa ialah pengendali menghantar bahagian pelayan kit di dalam tarball npm:
- c2 — binari Go ELF yang dikompilasi 4-megabait
- c2.go — sumber Go 426 baris untuk binari itu
Kedua-dua fail tidak dipanggil oleh mana-mana hook pemasangan. Ia bukan sebahagian daripada muatan mangsa. Ia berada dalam direktori pakej dengan cara yang sama seperti fail dokumentasi. Bacaan yang paling munasabah ialah operator menolak pokok kerja pembangunan mereka kepada npm tanpa mengurus senarai fail — slip OpSec sebenar — dan apa yang dihantar ialah kit dua sisi lengkap: klien yang dijalankan oleh mangsa dan pelayan yang dijalankan oleh operator.
Inilah bahagian cerita yang mewajarkan pembingkaian "kit botnet siap guna". Sesiapa sahaja yang memuat turun axois-utils:1.0.9 sebelum takedown bukan sahaja mempunyai sampel mangsa — mereka mempunyai pelayan C2 yang berfungsi.
Pivot, dalam satu ayat
Penerbit yang sama, nama pakej yang sama, perancah tiga cangkuk yang sama, penjenamaan "hantu" yang sama — tetapi muatan telah mengubah model pengewangan dalam sekelip mata: daripada “rahsia tuaian yang boleh saya jual semula” kepada “kapasiti banjir sewa yang boleh saya pajak”. TTP masa pemasangan yang perlu diperhatikan oleh pembela hampir sama merentasi kedua-dua fasa; pertahanan berasaskan tandatangan yang dikunci pada rentetan laluan dompet Fasa A atau kepada phantom.jsPengumpul 7,667 baris itu pasti terlepas Fasa B sepenuhnya.
| Tarikh (UTC) | Acara |
|---|---|
| 2026-05-15 | Penerbitan pertama: axois-utils:1.0.4 (Pembinaan ujian LAN, pelantar pembangunan di 192.168.129.19) |
| 2026-05-15 | axois-utils:1.0.6 diterbitkan — Fasa A C2 ditukar kepada 80.200.28.28 melalui terowong Serveo; komen sumber // Change to '80.200.28.28' for public mengesahkan pertukaran dev→prod |
| 2026-05-16 | chalk-tempalte:1.0.14 dan 1.0.16 diterbitkan — pengisytiharan pemuat berantai axois-utils:^1.0.7 sebagai kebergantungan masa jalan; subdomain Serveo diputar |
| 2026-05-16 | Kempen Fasa A ditemui semasa pengimbasan npm rutin; keputusan berniat jahat yang disahkan telah digunakan |
| 2026-05-17 | axois-utils:1.0.9 diterbitkan — pangsi muatan: PhantomBot DDoS merekrut melalui terowong localhost.run; bahagian operator c2 binari dan c2.go sumber dihantar dalam tarball |
| 2026-05-17 | chalk-tempalte:1.0.19 dan 1.0.20 diterbitkan — masih Fasa A (pencuri); pengendali kini menjalankan kedua-dua modul secara selari |
| 2026-05-17 | Penemuan Fasa B semasa pengimbasan rutin; keputusan digunakan merentasi semua 2026-05-17 versi |
| (berterusan) | Laporan penghapusan sedang menunggu; keempat-empat pakej yang diterbitkan masih tersedia dalam daftar semasa penulisan ini. |
Petunjuk Kompromi
Kami
| Ekosistem | Pakej | versi |
|---|---|---|
| npm | axois-utils (kesalahan taip bagi aksios) | 1.0.4, 1.0.6, 1.0.9 |
| npm | chalk-tempalte (kesalahan taip templat kapur) | 1.0.14, 1.0.16, 1.0.19, 1.0.20 |
Identiti pengarang
| Bidang | nilai |
|---|---|
| penerbit npm | deadcode09284814 |
| E-mel penerbit | phantomdeadcode@tutamail.com |
| SCM pengesahan | tiada |
Perintah-dan-kawalan
| Fasa | Titik akhir | Pengangkutan |
|---|---|---|
| A | f04a273bd84c0622-80-200-28-28.serveousercontent.com:443/collect | Terowong HTTPS Serveo |
| A | 8a3e818ea8f11186-80-200-28-28.serveousercontent.com:443/collect | Terowong HTTPS Serveo (versi terdahulu) |
| A | 80.200.28.28:443/collect | Titik akhir VPS asas |
| B | b94b6bcfa27554.lhr.life:443/ | terowong terbalik HTTPS localhost.jalankan |
Ringkasan fail (SHA-256)
| File | SHA-256 | Nota |
|---|---|---|
c2 (Pergi ELF, 4 MB) | 165fa92d237fd017c227d00da06ab788212a62be94bf61e95df2d22d00377ef2 | Pelayan C2 bahagian pengendali, dihantar ke dalam axois-utils:1.0.9 |
c2.go (426 baris) | 7d0ae79fdb1e9968f3323a3712b624643a782ba3efb2cf3a2cb9c4c5513cea30 | Pergi ke sumber untuk binari C2 |
distrube.js | 308b15c023088a7188dea4ef609010ac2493eb4c365b103053d7621a9ca5b935 | Klien bot Fasa B |
phantom.js (chalk-tempalte:1.0.19) | 9e380ec88d3ccf3929e1a104e3b868d4d7b59ca189a8a431a54e9f3357dfdd81 | Pengumpul kelayakan / dompet Fasa A |
phantom.js (chalk-tempalte:1.0.20) | d1c9e3f296ee9f7d5032f73f9c504cede50334bc14c394055fd5cb9c3a6e08b3 | Pengumpul Fasa A (varian 1.0.20) |
postinstall.js (chalk-tempalte:1.0.19 = 1.0.20) | ffba9bdd6793edd5b38e12900252c1813a693f59c25af51c3b658cf3f27b6162 | Pemuat Fasa A, seiras bait merentasi kedua-dua versi |
Atribusi & Motivasi
Kami menjejaki kempen ini sebagai PhantomBot, mengambil penjenamaan pengendali sendiri daripada Ejen Pengguna: PhantomBot/1.0 pengepala degupan jantung, yang perkhidmatan phantom-bot unit sistemd, yang com.phantom.bot Label LaunchAgent dan kod hantu mati@ Pemegang e-mel. Operator konsisten tentang nama ini merentasi sekurang-kurangnya empat artifak.
Katalog isyarat
- Penerbit - kod mati09284814 pada npm. Akaun pemegang tunggal, e-mel pakai buang Tutamail, tidak SCM pengesahan. Tiada sejarah penerbitan terdahulu selepas kempen ini.
- Penggunaan semula penjenamaan — “phantom” muncul dalam e-mel penerbit, dalam nama fail pengumpul Fasa A (phantom.js), dalam nama perkhidmatan kegigihan Fasa B (perkhidmatan phantom-bot), dalam label LaunchAgent (com.phantom.bot), dan dalam bot Ejen-Pengguna (PhantomBot/1.0).
- Infrastruktur — Satu VPS di 80.200.28.28 hadapan Fasa A melalui putaran subdomain Serveo; Fasa B bergerak ke a localhost.jalankan terowong terbalik (b94b6bcfa27554.lhr.lifeKedua-dua perkhidmatan vendor adalah percuma dan hanya memerlukan SSH keluar di pihak pengendali, selaras dengan persediaan OpSec rendah bajet rendah.
- Gaya kod — JavaScript biasa di seluruh bahagian; tiada pengekodan, tiada pengekodan rentetan, tiada semakan anti-VM. Nama pembolehubah adalah deskriptif (mencuriMaklumatSistem, laksanakanArahan, httpFlood). Komen dalam distrube.js secara langsung menangani operator masa hadapan (“Gunakan URL HTTPS localhost.run anda”), menunjukkan bahawa fail tersebut bertujuan untuk diedarkan semula sebagai kit, bukan digunakan oleh penyerang tunggal.
- Slip OpSec — Tarball Fasa B menghantar kedua-dua klien bot dan pelayan C2 bahagian operator (c2 ELF + c2.go (sumber). Ini selaras dengan operator yang menolak pokok kerja mereka ke npm tanpa mengaudit senarai fail. Sama ada operator tidak berpengalaman, atau kit tersebut bermakna untuk diedarkan secara terbuka dan binari C2 adalah sebahagian daripada produk tersebut.
- Pengesahan diri - axois-utils:1.0.4 mengandungi komen sumber // Tukar kepada '80.200.28.28' untuk umum pada baris 12, mengesahkan perkembangan pembangunan / pementasan / pengeluaran yang biasanya dinafikan oleh pengendali.
Motivasi
Muatan Fasa A adalah kecurian kewangan yang mudah: kelayakan, kunci awan, token GitHub dan dompet kripto semuanya mempunyai pasaran jualan semula cair. Fasa B juga bersifat kewangan, tetapi tidak langsung: perkhidmatan DDoS-untuk-sewa ("booter") menyewa kapasiti banjir setiap minit, dan bot seperti yang dihantar di sini adalah inventori yang dijalankan oleh perkhidmatan tersebut. Denyutan jantung 30 saat, generik sasaran/pelabuhan/tempoh skema arahan, dan senjata banjir lima protokol adalah standard hasil daripada pengendali but.
Menjalankan kedua-dua modul secara selari — chalk-tempalte:1.0.19 dan 1.0.20 terus menghantar pencuri itu sementara axois-utils:1.0.9 menghantar bot — mencadangkan pengendali sedang melindungi aliran hasil dan bukannya meninggalkan Fasa A. Pangsi ialah Selain itu, bukan pengganti.
Apa yang tidak kami dakwa
Kami belum dapat mengesahkan identiti dunia sebenar di sebalik kod mati09284814 pemegang, dan kami tidak mengaitkan kempen ini dengan mana-mana pelaku ancaman, kumpulan atau negara yang dinamakan. Penjenamaan "hantu" cukup konsisten merentasi artifak untuk mencadangkan pengendali tunggal, tetapi penghantaran gaya kit binari C2 membuka kemungkinan bahawa pakej masa hadapan daripada pemegang yang tidak berkaitan akan menggunakan semula kod yang sama.
Impak, Trend & Apa yang Perlu Dilakukan oleh Pembela
Kesan
Sasaran setinggan yang sah axios dan templat kapur banyak bergantung padanya dalam ekosistem JavaScript; axios sahaja berada di antara tiga puluh pakej npm yang paling banyak dimuat turun. Nama typosquat hanya satu ketukan kekunci sahaja daripada yang sebenar (aksis ↔ axios, tempalte ↔ template), dan kedua-duanya adalah salah ejaan yang munasabah dari segi linguistik.
Kami tidak dapat memperoleh statistik muat turun yang boleh dipercayai untuk versi berniat jahat sebelum penghapusan — npm tidak menyimpan kiraan muat turun setiap versi selepas pakej dinyahterbitkan, dan npms.ioProksi gaya-berbising pada skala ini. Mana-mana organisasi yang fail kuncinya menyelesaikan kepada pakej bernama axois-utils or templat kapur daripada penerbit kod mati09284814 harus dianggap sebagai telah dikompromi: putar setiap kelayakan yang ada dalam proses.env pada hos yang terjejas, audit vektor kegigihan setiap OS (lihat “Apa yang perlu dilakukan oleh pembela” di bawah), dan alih keluar kebergantungan.
Corak yang muncul
Kempen ini menunjukkan perubahan yang telah kita lihat dalam beberapa insiden npm baru-baru ini: perancah cangkuk pemasangan ialah aset yang tahan lama; muatan boleh ditukar gantiPenerbit yang sama, pakej yang sama, sama prapasang / memasang / selepas pemasangan tiga kali ganda, dan juga irama versi-bump yang sama — satu-satunya perkara yang berubah antara axois-utils:1.0.6 dan axois-utils:1.0.9 adakah fail itu hooks jalankan. Pengesanan berasaskan tandatangan yang dikunci pada muatan Fasa A (rentetan laluan dompet, phantom.jsPengumpul 7,667 baris, hos Serveo C2) pasti telah menandakan tiga versi pertama dan terlepas Fasa B sepenuhnya.
Corak yang sama dapat dilihat merentasi kempen 2026 lain yang telah kami jejaki: satu operator dengan perancah yang stabil, bertukar-tukar antara kecurian kelayakan, pelanggan yang menipu peperiksaan, exfil bot Telegram dan kini pengambilan DDoS. Pembela yang bergantung pada tandatangan muatan akan terus tewas pada pusingan kedua setiap kempen.
Kesannya ialah TTP masa pemasangan adalah isyarat yang lebih baik. Pengisytiharan cangkuk pemasangan tiga kali ganda, skrip pemasangan yang diimport https or proses_anak, pasang skrip yang menulis ke folder permulaan pengguna dan pasang skrip yang menyelesaikan nama hos pada perkhidmatan terowong terbalik percuma (Serveo, localhost.jalankan, ngrok, cloudflared) semuanya jarang berlaku dalam pakej yang sah dan biasa berlaku pada pakej yang berniat jahat.
Apa yang perlu dilakukan oleh pembela
- Audit fail kunci. Cari setiap package-lock.json / kunci benang / pnpm-lock.yaml dalam organisasi anda untuk rentetan yang tepat axois-utils dan templat kapurAnggap sebarang perlawanan sebagai satu kompromi.
- Putar rahsia pada perumah yang terjejas. Fasa A kelayakan SSH, awan, GitHub, npm dan dompet yang dituai secara pukal. Andaikan setiap kelayakan yang ada dalam proses.env, ~ / .ssh, ~/.aws, ~/.npmrc, ~ / .config, atau mana-mana .env* fail pada hos yang terjejas terdedah.
- Buang kegigihan (Fasa B). Pada Windows, padam HKCU\Perisian\Microsoft\Windows\Versi Semasa\Jalankan\Kemas KiniSistem, buang %APPDATA%\Microsoft\Windows\Menu Mula\Program\Permulaan\kemas kini-sistem.bat, dan schtasks /padam /tn Kemas Kini Sistem /f. Pada Linux, crontab -e dan buang @reboot nod …, systemctl –lumpuhkan pengguna –sekarang phantom-bot.service kemudian padam ~/.config/systemd/user/phantom-bot.service, gosok .bashrc / .zshrc / /etc/rc.localPada macOS, launchctl muat turun ~/Library/LaunchAgents/com.phantom.bot.plist kemudian padam plist tersebut.
- Sekat hos C2. Tambahkan empat titik akhir C2 dalam jadual IOC ke senarai sekatan egress anda. *.serveousercontent.com dan *.lhr.kehidupan boleh disekat secara borong jika persekitaran anda tidak mempunyai kegunaan yang sah untuk perkhidmatan terowong terbalik.
- Pemburuan mengikut TTP masa pemasangan, bukan muatan. Entri fail kunci inventori yang package.json mengisytiharkan prapasang, memasang, dan selepas pemasangan semuanya menunjuk pada skrip yang sama. Semak silang terhadap umur pakej dan status pengesahan penerbit. Corak ini jarang berlaku dalam pakej yang sah dan merupakan isyarat tunggal yang paling boleh dipercayai yang digunakan semula oleh PhantomBot.
- Audit untuk binari C2. Sesiapa sahaja yang memuat turun axois-utils:1.0.9 mempunyai pelayan C2 pengendali (c2 ELF, sha256 165fa92d…) pada cakera. Imbas cache dan stor artifak CI. Binari itu sendiri tidak aktif, tetapi kehadirannya di stesen kerja adalah bukti yang jelas bahawa pakej telah dipasang.
Barisan penutup
Operator yang sama, pakej yang sama dan cangkuk pemasangan yang sama boleh memberikan ancaman yang sama sekali berbeza dalam masa 48 jam. Perhatikan perancahnya, bukan muatannya.




