flawopen.com/Incidents/shai-hulud-npm-worm-september-2025
Shai-Hulud: सितंबर 2025 का npm वर्म और इंस्टॉल के समय भरोसे की सीमा
सितंबर 2025 के Shai-Hulud अभियान ने समझौता किए गए npm अनुरक्षक खातों और दुर्भावनापूर्ण postinstall हुक का उपयोग करके क्रेडेंशियल चुराए और अतिरिक्त संक्रमित पैकेज प्रकाशित किए।[1]
मानिए किसी कारखाने को पुर्ज़ों का डिब्बा मिलता है जिसकी खोलने की हिदायतें अपने आप चलती हैं। वे कारखाने के माल भेजने वाले पहचान पत्रों की नक़ल बनाकर दूसरे कारखानों को बदले हुए डिब्बे भेजती हैं। अपने आप चलने वाली हिदायतें रोकने से यह रास्ता बंद होता है, पर पुर्ज़ों को उपयोग से पहले फिर भी जाँचना होगा।[1]
इस पेज के मुख्य शब्द
Lifecycle hook- सितंबर के अभियान में npm postinstall ने स्थापना के दौरान दुर्भावनापूर्ण कोड चलाया। यह पैकेज का व्यवहार है, CVE वाला npm स्मृति दोष नहीं।
Publishing credential- npm टोकन में खाते या पैकेज के लिए तय अनुमतियाँ होती हैं। चुराई प्रकाशन अनुमति से वर्म फैला; अवधि, दायरा और MFA नीति पर निर्भर हैं।
Trusted publishing / OIDC- OIDC से अधिकृत CI प्रक्रिया संग्रहित npm टोकन के बिना अल्पकालीन प्रकाशन अधिकार ले सकती है। समझौता हुई अधिकृत प्रक्रिया फिर भी असुरक्षित है।
फ्रेमवर्क मैपिंग
घटना का समयक्रम (Timeline)
GitHub के अनुसार उसे Shai-Hulud की सूचना मिली।[1]
GitHub ने 500 से अधिक संक्रमित पैकेज हटाने और दुर्भावनापूर्ण संकेतों वाले अपलोड रोकने की सूचना दी।[1]
हमले का चरण-दर-चरण प्रवाह
सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन
यह Python में सुरक्षित स्थापना योजना की तुलना है: कोई फ़ंक्शन npm नहीं चलाता, क्रेडेंशियल नहीं पढ़ता और रजिस्ट्री से नहीं जुड़ता। उदाहरण npm v10 दस्तावेज़ पर आधारित है। सुरक्षित योजना जाँची हुई लॉकफ़ाइल माँगती है, जीवनचक्र स्क्रिप्ट रोकती है और पुराना वातावरण नहीं लेती। असल रनर में भरोसेमंद npm प्रोग्राम तथा अलग गृह निर्देशिका और विन्यास चाहिए, जिनमें गोपनीय फ़ाइल या संवेदनशील माउंट न हों। --ignore-scripts बाद में आयातित कोड या स्पष्ट रूप से चलाई गई स्क्रिप्ट सुरक्षित नहीं बनाता; लॉकफ़ाइल से कोड की अच्छाई प्रमाणित नहीं होती।
def install_plan(reviewed_lockfile, inherited_env):
# केवल योजना लौटाता है: कोई पैकेज इंस्टॉल या कमांड निष्पादित नहीं होती।
return {"argv": ["npm", "ci"],
"env": dict(inherited_env)}
def install_plan(reviewed_lockfile, inherited_env):
# केवल योजना लौटाता है: कोई पैकेज इंस्टॉल या कमांड निष्पादित नहीं होती।
if reviewed_lockfile is not True:
raise ValueError("Review the lockfile before installation")
return {"argv": ["npm", "ci", "--ignore-scripts"],
"env": {}}
इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- ✓स्थापना कार्य में जाँची हुई लॉकफ़ाइल और npm ci --ignore-scripts आवश्यक करें; CI नीति परीक्षण आदेश और क्रेडेंशियल रहित वातावरण जाँचें। ज़रूरी निर्माण हुक समीक्षा के बाद अलग पृथक कार्य में चलाएँ।[3]
- ✓प्रकाशन और क्लाउड क्रेडेंशियल निर्भरता स्थापित करने वाले कार्य से दूर रखें, जिनमें गृह फ़ाइलें, माउंट और रनर पहचान भी शामिल हैं। जाँचें कि कार्य प्रकाशन अधिकार न ले सके।[1], [2]
- ✓जहाँ उपलब्ध हो विश्वसनीय प्रकाशन अपनाएँ; अधिकृत प्रक्रिया, शाखा और वातावरण सीमित कर बदलाव की समीक्षा करें। फ़िशिंग प्रतिरोधी MFA रखें और अप्रयुक्त टोकन हटाएँ।[1]
- ✓पुष्ट खुलासे पर रनर अलग करके नए बनाएँ, उजागर क्रेडेंशियल रद्द करें और पैकेज संस्करण व प्रक्रिया बदलाव जाँचें। निर्भरता का कोड देखें: लॉकफ़ाइल या नई रिलीज़ अपनाने में देरी अकेले सुरक्षा सिद्ध नहीं करती।[1], [2]