महज 13 घंटे की अवधि के भीतर, 36 दुर्भावनापूर्ण पैकेजों ने npm रजिस्ट्री में बाढ़ ला दी, जो लोकप्रिय स्ट्रैपी (Strapi) CMS के लिए वैध टूल होने का ढोंग कर रहे थे। यह डिजिटल बर्बरता का कोई रैंडम कृत्य नहीं था; यह मिशन-क्रिटिकल डेटाबेस वातावरण में घुसपैठ करने का एक सुनियोजित और व्यवस्थित प्रयास था। जब तक SafeDep के सुरक्षा शोधकर्ताओं ने इस अभियान की पहचान की, तब तक खतरे के कारकों ने डेवलपर्स द्वारा ओपन-सोर्स इकोसिस्टम में रखे जाने वाले अंतर्निहित विश्वास का लाभ उठाते हुए एक परिष्कृत पकड़ बना ली थी।
जोखिम के दृष्टिकोण से, यह घटना आधुनिक सॉफ्टवेयर विकास में एक अनिश्चित वास्तविकता को उजागर करती है: हमारी आपूर्ति श्रृंखलाएं (supply chains) उतनी ही मजबूत होती हैं जितनी उनकी सबसे कमजोर निर्भरता (dependency)। हमलावरों ने चार कठपुतली खातों—umarbek1233, kekylf12, tikeqemif26, और umar_bektembiev1—का उपयोग उन पैकेजों को वितरित करने के लिए किया जो पहली नज़र में परिपक्व सामुदायिक प्लगइन्स की तरह दिखाई देते थे। हालांकि, पर्दे के पीछे, इन पैकेजों को एक डिजिटल 'ट्रोजन हॉर्स' के रूप में कार्य करने के लिए डिज़ाइन किया गया था, जो Redis और PostgreSQL इंस्टेंस से समझौता करने में सक्षम पेलोड ले जा रहे थे।
व्यस्त डेवलपर्स के मानसिक फिल्टर को बायपास करने के लिए हमलावरों ने एक चतुर नामकरण पद्धति (naming convention) का इस्तेमाल किया। अपने पैकेजों के आगे strapi-plugin- लगाकर और cron, database, या health जैसे सामान्य कार्यात्मक शब्दों को जोड़कर, उन्होंने आधिकारिक स्ट्रैपी इकोसिस्टम के नामकरण संरचना की नकल की। दिलचस्प बात यह है कि उन्होंने सभी 36 पैकेजों में वर्जन नंबर को 3.6.8 पर हार्डकोड कर दिया था। यह सॉफ्टवेयर को एक संदिग्ध नए अपलोड के बजाय एक परिपक्व, स्थिर रिलीज के रूप में दिखाने के लिए किया गया एक जानबूझकर किया गया चुनाव था।
थ्रेट इंटेलिजेंस रिपोर्टों का विश्लेषण करने के मेरे अनुभव में, इस प्रकार का "टाइपोस्क्वैटिंग-आसन्न" (typosquatting-adjacent) व्यवहार तेजी से सामान्य होता जा रहा है। हमलावर जानते हैं कि डेवलपर्स अक्सर पहले कार्यक्षमता की तलाश करते हैं और प्रकाशक को बाद में सत्यापित करते हैं। जबकि आधिकारिक स्ट्रैपी प्लगइन्स कड़ाई से @strapi/ नेमस्पेस के तहत स्कोप्ड होते हैं, सामुदायिक प्लगइन्स के लिए अनिवार्य स्कोप की कमी एक ऐसी खाई पैदा करती है जिसे दुर्भावनापूर्ण तत्व भरने के लिए बहुत खुश होते हैं।
आर्किटेक्चरल स्तर पर, यहां शोषण की गई प्राथमिक भेद्यता स्ट्रैपी या स्वयं npm में कोई बग नहीं है, बल्कि npm लाइफसाइकिल की एक विशेषता है। 36 पैकेजों में से प्रत्येक में एक postinstall.js स्क्रिप्ट थी। npm इकोसिस्टम में, पैकेज डाउनलोड होते ही एक पोस्ट-इंस्टॉल स्क्रिप्ट स्वचालित रूप से निष्पादित हो जाती है, जिसके पेलोड को ट्रिगर करने के लिए शून्य उपयोगकर्ता इंटरैक्शन की आवश्यकता होती है।
नतीजतन, दुर्भावनापूर्ण कोड उसी विशेषाधिकारों के साथ चलता है जो इंस्टॉलेशन करने वाले उपयोगकर्ता के पास होते हैं। एक स्थानीय विकास वातावरण में, इसका अर्थ व्यक्तिगत फ़ाइलों और एनवायरनमेंट वेरिएबल्स तक पहुंच हो सकता है। हालांकि, एक नियामक संदर्भ में जहां डेटा अखंडता सर्वोपरि है, असली खतरा CI/CD पाइपलाइनों और डॉकर कंटेनरों में निहित है। यदि एक स्वचालित बिल्ड प्रक्रिया इनमें से किसी एक पैकेज को खींचती है, तो स्क्रिप्ट प्रभावी रूप से उस कंटेनरीकृत वातावरण के भीतर रूट एक्सेस प्राप्त कर लेती है, जिससे उसे आंतरिक बुनियादी ढांचे पर हमला करने का मौका मिल जाता है।
जो चीज़ इस विशिष्ट अभियान को विशेष रूप से सूक्ष्म और खतरनाक बनाती है, वह है डेटा लेयर पर इसका ध्यान। पेलोड सामान्य नहीं थे; वे विशेष रूप से Redis और PostgreSQL का शोषण करने के लिए तैयार किए गए थे। एक बार postinstall स्क्रिप्ट ट्रिगर होने के बाद, इसने निम्नलिखित प्रयास किए:
अनिवार्य रूप से, हमलावर "साम्राज्य की चाबियों" की तलाश में थे। डेटाबेस अक्सर किसी एप्लिकेशन के आर्किटेक्चर का सबसे संवेदनशील हिस्सा होते हैं, जिसमें उपयोगकर्ता के PII (व्यक्तिगत पहचान योग्य जानकारी) से लेकर मालिकाना व्यावसायिक लॉजिक तक सब कुछ होता है। Redis और PostgreSQL को लक्षित करके, हमलावरों का उद्देश्य एक साधारण पैकेज इंस्टॉलेशन को पूर्ण पैमाने पर डेटा उल्लंघन (data breach) में बदलना था।
खतरे के परिदृश्य को देखते हुए, हमें यह स्वीकार करना चाहिए कि पैचिंग के अलावा, मानवीय तत्व एक महत्वपूर्ण चर बना हुआ है। मुझे डेटा लीक जांच के दौरान एक मामला याद है जहां एक वरिष्ठ डेवलपर ने गलती से एक दुर्भावनापूर्ण निर्भरता को शामिल कर लिया था क्योंकि वे देर रात तक काम कर रहे थे और उन्होंने पैकेज के होमपेज को सत्यापित नहीं किया था। यह हम में से सर्वश्रेष्ठ के साथ भी होता है, लेकिन स्वचालित हमलों की दुनिया में, हम अब ऐसी चूक बर्दाश्त नहीं कर सकते।
एक अंतिम उपयोगकर्ता के दृष्टिकोण से, ऐसे उल्लंघन का प्रभाव अक्सर तब तक अदृश्य रहता है जब तक कि बहुत देर न हो जाए। दूसरे शब्दों में कहें तो, एक समझौता की गई निर्भरता जहाज के पतवार में एक धीमे रिसाव की तरह है; जब तक इंजन विफल नहीं हो जाते, तब तक आप पानी के बढ़ते स्तर को नोटिस नहीं कर सकते। इस मामले में, "इंजन" आपके डेटाबेस हैं, और "पानी" आपके मिशन-क्रिटिकल डेटा तक अनधिकृत पहुंच है।
अंततः, सॉफ्टवेयर आपूर्ति श्रृंखला को सुरक्षित करने की जिम्मेदारी उन प्लेटफार्मों और उन डेवलपर्स दोनों पर आती है जो उनका उपयोग करते हैं। जबकि npm रिपोर्ट किए जाने के बाद इन पैकेजों को हटाने के लिए काम करता है, उपलब्धता की 13 घंटे की खिड़की स्वचालित प्रणालियों के लिए दुर्भावनापूर्ण कोड को ग्रहण करने के लिए पर्याप्त समय से अधिक थी।
अधिक लचीला रुख बनाने के लिए, निम्नलिखित कार्रवाई योग्य कदमों पर विचार करें:
@strapi/ स्कोप के तहत प्लगइन्स को प्राथमिकता दें। उन अनस्कोप्ड पैकेजों के प्रति अत्यधिक संशय में रहें जिनमें विवरण, रिपॉजिटरी या होमपेज की कमी है।npm install चलाते समय --ignore-scripts फ्लैग का उपयोग करें जहां आप स्पष्ट रूप से प्रत्येक निर्भरता पर भरोसा नहीं करते हैं। यह postinstall स्क्रिप्ट को स्वचालित रूप से चलने से रोकता है।npm audit चलाएं और यह सुनिश्चित करने के लिए package-lock.json का उपयोग करें कि आपका डिपेंडेंसी ट्री अनुमानित है और उसके साथ छेड़छाड़ नहीं की गई है।भविष्य के हमलों के खिलाफ एक जवाबी उपाय के रूप में, हमें प्रत्येक तीसरे पक्ष की निर्भरता को एक संभावित जोखिम के रूप में मानना चाहिए। अपने पैकेज प्रबंधकों के प्रति 'जीरो-ट्रस्ट' दृष्टिकोण अपनाकर, हम अपनी विकास पाइपलाइनों को शोषण के लिए खुले दरवाजे के बजाय एक मजबूत रक्षा में बदल सकते हैं।
स्रोत:



हमारा एंड-टू-एंड एन्क्रिप्टेड ईमेल और क्लाउड स्टोरेज समाधान सुरक्षित डेटा एक्सचेंज का सबसे शक्तिशाली माध्यम प्रदान करता है, जो आपके डेटा की सुरक्षा और गोपनीयता सुनिश्चित करता है।
/ एक नि: शुल्क खाता बनाएं