- npm registry पर हुए supply chain हमले से लाखों enterprise apps और अरबों user records उजागर हो गए, लेकिन ecosystem ने इसे मानो टाला ही नहीं जा सकता था, ऐसे स्वीकार कर लिया
- Senior Frontend Engineer Mark Vance ने इस हकीकत पर तंज कसा कि एक string को uppercase करने के लिए भी unverified package की 40-स्तरीय nested dependency पर निर्भर रहना पड़ता है
- लंबे समय से उपेक्षित utility package के hijack हो जाने और दुनिया भर के production builds में crypto-miner inject हो जाने की स्थिति को मानो प्राकृतिक आपदा की तरह लिया जाता है
- Node.js ecosystem दुर्भावनापूर्ण remote code execution को एक अप्रत्याशित त्रासदी की तरह स्वीकार करता है, और DevOps टीमें AWS keys rotate करने में लगी रहती हैं
- Go, Rust, और native Web API ecosystems मजबूत standard library और cryptographic verification के जरिए third-party dependency घटाने वाले विपरीत उदाहरण के रूप में सामने आते हैं
npm supply chain attack पर व्यंग्य
- npm registry पर supply chain attack से लाखों corporate applications प्रभावित हुए और अरबों user records उजागर हुए, लेकिन JavaScript ecosystem के developers ने इसे इस तरह लिया मानो “इसे पूरी तरह टाला नहीं जा सकता था”
- Senior Frontend Engineer Mark Vance के अनुसार, एक single string को uppercase बनाने के लिए unverified package की 40-स्तरीय nested dependency tree पर निर्भर रहना आधुनिक web app development की कीमत जैसा है
- लंबे समय से छोड़े गए utility package के hijack होकर दुनिया भर के production builds में crypto-miner inject होने की स्थिति को प्राकृतिक आपदा जैसा माना जाता है
- Node.js ecosystem दुर्भावनापूर्ण remote code execution को अप्रत्याशित त्रासदी की तरह देखता है और AWS keys बदलने में व्यस्त DevOps टीमों के लिए “thoughts and prayers” भेजता है
दूसरे ecosystems और npm का अंतर
- Go, Rust, और native Web API ecosystems मजबूत standard library के कारण third-party code पर निर्भरता काफी कम करते हैं, और core toolchain में सख्त cryptographic verification शामिल करते हैं
- इन ecosystems में तुलना इस तरह की जाती है कि “कॉलेज छोड़ चुके किसी व्यक्ति के weekend project” ने आज global logistics infrastructure को नष्ट नहीं किया — और ऐसे मामलों की संख्या शून्य रही
- npm के spokesperson ने जोर देकर कहा कि दुर्भावनापूर्ण actors वाले संसार में इसे स्वीकार करना ही होगा, और इसे रोकने लायक registry policy या build sandbox guardrails मौजूद नहीं हैं
- npm registry को ऐसे open source registry के रूप में चित्रित किया गया है जो local machine पर arbitrary installation scripts को default रूप से चलाता है, जिससे spokesperson की बात और संरचनात्मक जोखिम एक-दूसरे से जुड़ जाते हैं
- अंत में पीड़ितों के लिए संवेदना व्यक्त करते हुए यह कहकर बात समाप्त होती है कि “कल सुबह होने वाले अगले अपरिहार्य breach” तक resilience बनाए रखनी होगी
1 टिप्पणियां
Hacker News की राय
cooldown के बारे में सबकी अपनी राय हो सकती है, लेकिन axios, tanstack समेत हाल की npm supply chain attacks में से काफ़ी को cooldown से टाला जा सकता था
अगर आप Artifactory / Nexus इस्तेमाल करते हैं, तो संभव है कि cooldown पहले से ही हो, और न भी हो तो इसे सेट करना आसान है
ज़्यादातर npm या PyPI compromise कुछ घंटों के भीतर हटा दिए गए, इसलिए cooldown का मतलब है “रिलीज़ हुए N दिन से कम पुराने पैकेज को ignore करो।” 1 दिन भी असरदार है, 3 दिन ठीक है, और 7 दिन थोड़ा ज़्यादा है लेकिन काम करता है
इसे सेट करने के लिए आप default 1-day cooldown वाले latest pnpm का इस्तेमाल कर सकते हैं https://pnpm.io/supply-chain-security, या अगर एक ही बार में सब ठीक करना है तो https://depsguard.com इस्तेमाल कर सकते हैं, जो npm, pnpm, yarn, bun, uv, dependabot में cooldown और recommended settings जोड़ देता है। मैं इसका maintainer हूँ
या फिर https://cooldowns.dev भी है, जो cooldown पर ज़्यादा focused है, और local settings में मदद करने वाली scripts भी हैं। सब open source हैं या free हैं
अगर आप ~/.npmrc वगैरह सीधे edit कर सकते हैं, तो इसकी ज़रूरत नहीं, लेकिन आपके आसपास जिन लोगों को one-click solution चाहिए, उनके लिए यह अगला हमला टालने में मदद कर सकता है
हाँ, जब किसी नई critical CVE को patch करना हो, तब cooldown को bypass करना पड़ेगा, और हर जगह उसके तरीके हैं। मेरे पास सटीक आँकड़े नहीं हैं, लेकिन पिछले कुछ हफ़्तों में जोखिम नई zero-day CVE से ज़्यादा software supply chain attacks से आता दिखा है
नियमित dependency upgrades पर भी यही बात लागू होती है। हाँ, vulnerability response जैसी स्थिति में तुरंत upgrade करना पड़ सकता है, और तब developer जिस नए version को चाहता है उसे explicitly specify करने देना ठीक है
अगर सब लोग 7-day cooldown लगा दें, तो क्या बस विस्फोट देर से नहीं होगा?
यह लिखते-लिखते और सोच रहा हूँ तो भी, हाल के 10 दिनों में आई चीज़ें install न करने वाला 10-day cooldown मुझे फिर भी ठीक लगता है। बस इसे इकलौता mitigation मानकर नहीं चलना चाहिए
यह जानने की जिज्ञासा है कि Go या Rust, Python/npm की तुलना में वास्तव में क्या guarantee देते हैं। कभी-कभी लगता है कि Python/npm बस ज़्यादा आकर्षक target हैं
मैं तो धीरे-धीरे सभी third-party packages से बचने की कोशिश कर रहा हूँ
Maven Central दशकों से मौजूद है, लेकिन namespace hijacking की घटनाएँ बहुत कम रही हैं
ycombinator.com domain का ownership verify किए बिना आप groupId "com.ycombinator" के साथ package publish नहीं कर सकते। और एक बार publish हो जाने के बाद package 100% immutable होता है, चाहे उसमें malicious code ही क्यों न हो। हाँ, ऐसी libraries को हर जगह vulnerable के रूप में mark किया जाता है
समझ नहीं आता कि NPM इतने लंबे समय में Maven Central जैसी safety rails क्यों नहीं अपना पाया
language के साथ shipped verified libraries का bundle होने के बजाय, applications को चीज़ें या तो खुद बनानी पड़ती हैं या third-party package repository से लानी पड़ती हैं। NIH से बचने की सीख लगातार दी गई है, इसलिए लोग package उठा लेते हैं
यह अपने आप में ज़रूरी नहीं कि बुरा हो, लेकिन अक्सर ज़रूरत से ज़्यादा code खींच आता है। JS ecosystem छोटे modules को भी पसंद करता है, इसलिए बहुत सारे modules लगते हैं, और फिर सब उनके ऊपर और layers बनाते जाते हैं, जिससे dependency graph बहुत बड़ा हो जाता है। जानबूझकर हो या नहीं, समस्या पैदा होने की surface area बहुत बड़ी है
दूसरी languages में बहुत कुछ built-in मिलता है। bugs और security issues वहाँ भी रहे हैं, लेकिन JS ecosystem में जो दिखता है उसके सामने वह बहुत कम है। external dependency graph काफ़ी छोटा होता है और core functionality trusted third parties से आती है
यह NPM के लिए कोई बहाना नहीं है, बल्कि उसके खिलाफ़ एक और point जोड़ता है
यह भी कहा जा सकता है कि ऐसे हमले frontend और backend developers के अंतर को और साफ़ दिखाते हैं, लेकिन मैं वहाँ तक नहीं जाऊँगा
कई नौकरियों में हमें सभी developer machines पर सुरक्षित global npm settings install करनी पड़ीं, लोगों से उन्हें बंद न करने की गुज़ारिश करनी पड़ी, और MDM tools से verify भी करना पड़ा
ज़्यादा सुरक्षित default settings बहुत पहले आ जानी चाहिए थीं
postinstall scripts के अस्तित्व का कोई वैध कारण नहीं होना चाहिए। npm team अब इतनी mature हो जानी चाहिए कि घोषित करे: “npm के version X से, ${today} से पहले publish हुए package versions के लिए ही postinstall scripts चलेंगी।”
वजह यह है कि esbuild जैसे dev toolchains compiled languages में लिखे जाते हैं और npm repositories के ज़रिए binaries के रूप में distribute किए जाते हैं। अगर आप latest Node/npm और आम modern OS/platform इस्तेमाल कर रहे हैं, तो वैध समस्याओं के बिना सभी postinstall scripts disable कर पाना संभव होना चाहिए
install किया गया npm code लगभग बिना किसी अपवाद के execute होता है
लेकिन package के अंदर का सामान्य code भी ऐसा ही है। install के समय न चले तो भी अंततः उसमें से कुछ न कुछ चलेगा। वरना उसे dependency में शामिल ही क्यों किया जाता
यह मान लेना कि postinstall scripts हटा देने से abuse rate पर एक क्षण से ज़्यादा असर पड़ेगा, इस बात का संकेत है कि समस्या को आखिर तक सोचकर नहीं देखा गया। दुर्भाग्य से यह समस्या मूल लेख के संकेत से कहीं ज़्यादा सूक्ष्म है
यह “पंख गिराने वाला बटन लाइट स्विच के बगल में मत रखो” जैसी समस्या नहीं है, बल्कि असली बात यह है कि “किसी और का बुरा code मेरे कंप्यूटर पर चलना” और “किसी और का अच्छा code मेरे कंप्यूटर पर चलना” — इन दोनों में अंतर करने का कोई तरीका बेहद मेहनत वाले manual work के बिना नहीं है। और हम वही मेहनत बचाने के लिए तो दूसरों का code चला रहे हैं
हर Node.js project की शुरुआत npm install से होती है, और अचानक अनचाहे 500 packages आ जाते हैं। उनमें से आधे तो कई सालों से छुए भी नहीं गए होते
एक cultural problem भी है कि लोग जो चीज़ पहले से ठीक चल रही है, उसे भी जितना हो सके latest packages तक upgrade करना चाहते हैं। कई बार तो यह देखने के लिए changelog भी नहीं पढ़ते कि बदलाव लागू भी होता है या नहीं
cooldown maintainers पर थोड़ी patience थोपने का एक तरीका है, और यह वाकई काम करता है
Lisp packages 15 साल तक बिना बदलाव के अच्छे से चल सकते हैं, लेकिन JS packages को maintenance न होने पर मानो आपदा समझा जाता है। जबकि वे 15 साल पहले ही complete हो चुके होते हैं, फिर भी npm और GitHub पर actively maintained दिखने के लिए लोग कुछ भी न जोड़ते हुए, या कभी-कभी breaking changes डालकर भी version bump कर देते हैं। फिर सब कुछ update होने लगता है
7-day cooldown कम मेहनत में लग जाने वाला अस्थायी जुगाड़ लगता है। असली समाधान शायद reproducible builds और signed attestations होंगे, लेकिन ज़्यादातर teams तब तक उसकी लागत नहीं चुकाएँगी जब तक वे खुद शिकार न बन जाएँ
यह किसी Onion article जैसा लगता है
यह लिंक Xe Iaso के लंबे समय से चलते आ रहे joke का साफ़ तौर पर AI से धुला हुआ version है। अफ़सोस
https://xeiaso.net/shitposts/no-way-to-prevent-this/CVE-2024...
https://news.ycombinator.com/item?id=40438408
[0]: https://en.wikipedia.org/wiki/%27No_Way_to_Prevent_This,%27_...
https://en.wikipedia.org/wiki/%27No_Way_to_Prevent_This,%27_...