Nx और कुछ सपोर्टेड प्लगइन्स के दुर्भावनापूर्ण वर्ज़न वितरित किए गए
(github.com/nrwl)- Nx पैकेज और प्लगइन्स के दुर्भावनापूर्ण वर्ज़न npm पर वितरित किए गए, जो फ़ाइल सिस्टम को स्कैन करते हैं, credentials इकट्ठा करते हैं, और फिर उन्हें उपयोगकर्ता के Github अकाउंट के रिपॉज़िटरी में भेज देते हैं
- यह जाँचने के लिए कि आप प्रभावित हुए हैं या नहीं, देखें कि आपके Github अकाउंट में s1ngularity-repository रिपॉज़िटरी बनाई गई है या नहीं
- संक्रमित होने पर टोकन और पासवर्ड बदलना, दुर्भावनापूर्ण रिपॉज़िटरी हटाना, और shell config फ़ाइलों की जाँच करना अनिवार्य है
- दुर्भावनापूर्ण वर्ज़न postinstall स्क्रिप्ट के जरिए सिस्टम को प्रभावित करते हैं, और खासकर VSCode Nx Console प्लगइन इस्तेमाल करते समय अनजाने में इनके चलने का जोखिम बढ़ जाता है
- Nx की ओर से पुनरावृत्ति रोकने और अतिरिक्त सुरक्षा उपाय लागू किए गए हैं, और संबंधित वर्ज़न npm से हटा दिए गए हैं
अवलोकन और सारांश
- यह सुरक्षा सलाह Nx पैकेज और कुछ संबंधित प्लगइन्स पर हुए एक गंभीर सप्लाई-चेन हमले के बारे में है, जिसमें दुर्भावनापूर्ण कोड npm के जरिए वितरित किया गया
- ये दुर्भावनापूर्ण वर्ज़न उपयोगकर्ता के फ़ाइल सिस्टम को स्कैन करके credentials, paths आदि इकट्ठा करते हैं और उन्हें Github रिपॉज़िटरी (
s1ngularity-repository) पर अपलोड करते हैं - दुर्भावनापूर्ण
postinstallस्क्रिप्ट उपयोगकर्ता की shell config फ़ाइलों (.zshrc,.bashrc) को भी बदलती है और सिस्टम shutdown command जोड़ती है - हमले के vector और प्रगति, प्रभावित वर्ज़न, उपयोगकर्ताओं को तुरंत क्या करना चाहिए, और पुनरावृत्ति रोकने के उपायों को विस्तार से बताया गया है
आपातकालीन कार्रवाई का तरीका
सभी को क्या जाँचना चाहिए
- अपने Github अकाउंट की रिपॉज़िटरी सूची में देखें कि
s1ngularity-repositoryबनाई गई है या नहीं - उस रिपॉज़िटरी में शामिल फ़ाइलों को डाउनलोड करके रिकॉर्ड के लिए सुरक्षित रखें
- Github से उस रिपॉज़िटरी को हटा दें
security@nrwl.ioपर ईमेल भेजकर लीक हुई जानकारी को डिकोड करने के तरीके की जानकारी लें- सभी अकाउंट्स के credentials और tokens तुरंत बदलें
Github टोकन बदलने का तरीका
- https://github.com/settings/connections/… पर जाएँ
- connected app की access permissions रद्द करके मौजूदा टोकन अमान्य करें
ghCLI का उपयोग करते हैं तो दोबारा authentication करके नया टोकन बनाएँ- अगर यह नहीं किया गया, तो पुराने टोकन के दुरुपयोग का जोखिम बना रहेगा
दुर्भावनापूर्ण Nx वर्ज़न का उपयोग रोकना और सफाई
npm ls nxकमांड से जाँचें कि वर्तमान में इस्तेमाल किया जा रहा Nx वर्ज़न दुर्भावनापूर्ण वर्ज़न है या नहीं- यदि संक्रमित वर्ज़न है, तो
npm uninstall nx && npm install nx@latestसे अपडेट करें npm cache clean --forceसे cache साफ करें
जो उपयोगकर्ता पहले से संक्रमित हैं
- npm और Github tokens बदलें
- Github और संबंधित सेवाओं के सभी पासवर्ड और credentials रीसेट करें
.zshrc,.bashrcफ़ाइलों में कोई अनजान कमांड डाली गई है या नहीं, जाँचें और हटाएँ
आंतरिक पैकेज रिपॉज़िटरी एडमिनिस्ट्रेटर के लिए
- कंपनी के भीतर Jersey-based proxy या internal package mirror में मौजूद दुर्भावनापूर्ण वर्ज़न तुरंत हटाकर आगे के प्रसार को रोकना आवश्यक है
प्रभावित वर्ज़न की जानकारी
Nx पैकेज
- 21.5.0, 20.9.0, 20.10.0, 21.6.0, 20.11.0, 21.7.0, 21.8.0, 20.12.0
- 10:44 PM EDT तक npm से हटाए जा चुके हैं
@nx/devkit, @nx/js, @nx/workspace, @nx/node, @nx/eslint, @nx/key, @nx/enterprise-cloud
- 10:44 PM, 6:20 AM EDT तक npm से हटाए जा चुके हैं
हमले के vector का विवरण
कमजोर workflow का कारण
- Github Actions workflow में arbitrary code execution संभव करने वाली एक कमजोरी शामिल कर दी गई थी
- PR title में खास bash code डालने पर workflow के भीतर system commands चल सकते थे; यह कमजोरी Bash Injection थी
pull_request_targettrigger के कारण elevated permissions (GITHUB_TOKENआदि) मिल जाते थे, जिससे इसका दुरुपयोग हुआ- हटाए जाने तक यह कमजोर workflow
mainके बजाय पुराने branch में बना रहा, और हमलावर ने दुर्भावनापूर्ण PR के जरिए workflow चलाकर secrets चुराने में सफलता पाई
npm टोकन चोरी की प्रक्रिया
- कमजोर workflow के जरिए
publish.ymlचलाया गया publish.ymlnpm token को Github Secrets में रखता था, और इस प्रक्रिया में token को बाहरी webhook पर भेज दिया गया- अंततः हमलावर ने इसी token के जरिए Nx और सपोर्ट पैकेजों के दुर्भावनापूर्ण वर्ज़न npm पर अपलोड किए
दुर्भावनापूर्ण पैकेज का व्यवहार
credentials सहित जानकारी इकट्ठा करना और Github रिपॉज़िटरी पर प्रकाशित करना
- संक्रमित Nx पैकेज की
postinstallस्क्रिप्ट चलते समय विभिन्न text files की locations और credential जानकारी इकट्ठा की जाती है - इन्हें
s1ngularity-repositoryनाम की Github रिपॉज़िटरी में base64 में encode करके अपलोड किया जाता है - वास्तविक रिपॉज़िटरी हटाई जा चुकी हो, तब भी पहले यह public थी, इसलिए जानकारी लीक होने की संभावना मानकर चलना चाहिए
shell profile (.zshrc, .bashrc) में छेड़छाड़
postinstallsudo shutdown -h 0कमांड जोड़ देता है, जिससे terminal चलाते समय सिस्टम shutdown हो सकता है और पासवर्ड उजागर होने की संभावना बनती है
postinstall के चलने के विभिन्न परिदृश्य
-
सिर्फ
npm install/yarn/pnpm installको सीधे चलाने पर ही नहीं, बल्कि transitive dependency, editor extension, script execution जैसी कई स्थितियों में भी यह चल सकता है -
खासकर VSCode के लिए Nx Console extension (वर्ज़न 18.6.30 ~ 18.65.1) editor शुरू होने पर अपने-आप
nx@latestइंस्टॉल करता था, जिससेpostinstallचल सकता था -
मूल रूप से, बिना इरादे के भी कई जगह NPM modules इंस्टॉल हो सकते हैं, इस बात से सावधान रहना चाहिए
-
Nx Console (
18.66.0) सेlatest nxइंस्टॉल करने की प्रक्रिया हटा दी गई है
हमले और प्रतिक्रिया की टाइमलाइन
21 अगस्त
- 4:31 PM: Bash injection कमजोरी वाला PR merge किया गया
- 10:48 PM: कमजोरी की ओर इशारा करने वाली पोस्ट X (पूर्व Twitter) पर प्रकाशित हुई
22 अगस्त
- दोपहर: आंतरिक जाँच, कमजोर workflow rollback (अपूर्ण)
- CodeQL लागू किया गया ताकि भविष्य के PR में ऐसी कमजोरियों का पता लगाया जा सके
24 अगस्त
- हमलावर के fork में npm token लीक होने के संकेत वाला commit हुआ
- दुर्भावनापूर्ण PR बनाया गया और हटाया गया, और
publish.ymlउसी PR के कारण चला
26 अगस्त ~ 27 अगस्त (दुर्भावनापूर्ण वर्ज़न वितरण, प्रतिक्रिया)
- Nx और प्लगइन्स के कई दुर्भावनापूर्ण वर्ज़न npm पर क्रमशः वितरित किए गए
- Github/NPM community में issues रिपोर्ट किए गए
- 10:44 PM: NPM ने संबंधित सभी वर्ज़न हटाने सहित कार्रवाई की
- 11:57 PM: सभी Nx-संबंधित पैकेज publishing tokens अमान्य किए गए
- 27 अगस्त: Nx Console patch, 2FA, Trusted Publisher मॉडल पर स्विच आदि अतिरिक्त उपाय किए गए
पूर्व-निवारक कदम और आगे की प्रतिक्रिया
nrwlसंगठन के सभी maintainers के लिए 2FA अनिवार्य किया गया- Trusted Publisher mechanism लागू किया गया। npm token-आधारित deployment प्रतिबंधित किया गया
- आगे से पैकेज केवल 2FA और trust-based verification के बाद ही publish किए जाएँगे
- अतिरिक्त risk detection, PR approval, branch protection आदि चरणबद्ध रूप से लागू किए गए
सीख और आगे की योजना
- सप्लाई-चेन, CI/CD pipeline, और workflow permissions को न्यूनतम रखने के महत्व को फिर से रेखांकित करने वाली घटना
- टीम के भीतर पुनरावलोकन के बाद, समुदाय के साथ सीखी गई बातें साझा करने की योजना है
संपर्क
security@nrwl.ioपर संपर्क किया जा सकता है
संदर्भ और परिशिष्ट
- Github के प्रमुख issues, timeline, और संबंधित posts
- संक्रमित पैकेज में
telemetry.jsस्क्रिप्ट का उदाहरण दिया गया है - यह स्क्रिप्ट फ़ाइल सिस्टम के भीतर प्रमुख text file paths को inventory बनाने के उद्देश्य से इकट्ठा करती है
निष्कर्ष सारांश
- Nx और संबंधित प्लगइन्स के नवीनतम अपडेट और patches लागू करना महत्वपूर्ण है
- npm, Github आदि की प्रमुख authentication जानकारी तुरंत बदलने की सिफारिश की जाती है
- यह घटना याद दिलाती है कि सप्लाई-चेन सुरक्षा और workflow permission management में कमी बड़े हादसे का कारण बन सकती है
1 टिप्पणियां
Hacker News टिप्पणियाँ
मैं समय-समय पर यह याद दिलाना चाहूँगा कि
npm installscripts को disable कर देंउदाहरण के लिए यह कमांड इस्तेमाल की जा सकती है:
यह सेटिंग project स्तर पर या global स्तर पर आसानी से लागू की जा सकती है
आजकल ऐसे वैध packages कम ही हैं जो scripts के बिना काम नहीं करते, इसलिए ज़्यादातर मामलों में दिक्कत नहीं होती
जिन packages को सच में इसकी ज़रूरत हो, उनके लिए अलग install script बनाकर उस folder में manually run किया जा सकता है
यह supply chain attack का कोई सर्व-उपचार नहीं है, लेकिन npm के ज़रिये होने वाले कई हमलों को इसने व्यवहार में काफ़ी असरदार ढंग से रोका है
ज़्यादा जानकारी के लिए npm config आधिकारिक दस्तावेज़ देखें
मैं खुद bubblewrap का इस्तेमाल करके npm, pnpm, yarn और इनके द्वारा शुरू किए गए सभी sessions को system से isolate करके चलाता हूँ
npmनाम से रखता हूँpnpm इस्तेमाल करना भी एक तरीका है। नए versions default रूप से सभी lifecycle scripts को ignore करते हैं, और उन्हें अलग-अलग whitelist में डालना पड़ता है तभी वे चलती हैं
यह सलाह जब भी सुनता हूँ, एक सवाल आता है: वास्तव में npm से install हुई दर्जनों से लेकर लाखों lines of code को पढ़कर verify करने वाला developer कोई नहीं होता
मैं सभी npm-based tools को Docker container के अंदर, current directory के अलावा कहीं भी access के बिना चलाता हूँ
मैं जानना चाहता हूँ कि ऐसी सलाह
setup.py(Python) याbuild.rs(Rust) पर उसी तरह क्यों लागू नहीं होतीनई dependency जोड़ते समय सच में एक बार और सोचने वाली संस्कृति चाहिए
इस साल supply chain attacks बहुत हुए हैं
इस हफ्ते मैं एक Go project में 8 statistical counters वाला progress bar जोड़ना चाहता था
library ढूँढी तो code 3,000 lines से ज़्यादा निकला, इसलिए मैंने LLM से simple UI code generate करने को कहा और 150 lines से कम में काम हो गया
बिना dependency के वही काम हुआ जो चाहिए था, और code इतना simple है कि कोई भी आसानी से पढ़कर improve कर सकता है
इसकी functionality बस terminal output को साफ़ करके हर सेकंड redraw करना और thread-safe support देना है
implementation और review मिलाकर 25 मिनट काफ़ी थे
अगर complex statistics features नहीं चाहिएँ, तो 30 lines के आसपास के code से भी progress bar बनाया जा सकता है
आगे से dependency जोड़ने की बजाय खुद बनाना मेरे लिए ज़्यादा सही लगता है
हर package update पर निगरानी रखने के लिए resources कम पड़ते हैं
मैं इस बात से सहमत हूँ, और "language-specific package manager" के शुरुआती दौर में मुझे भी बहुत असहजता महसूस होती थी
मुझे लगता है cargo vet जैसा approach आगे का रास्ता है: cargo vet परिचय
खुद implementation करने और library इस्तेमाल करने का अंतर स्वाभाविक है
मुझे ऐसी progress bar libraries से, खासकर वे जो emacs shell तोड़ देती हैं (expo, eas आदि), सच में नफ़रत है
..10%..20%..30%याUploading…जैसे format में output क्यों नहीं देतींहमारी टीम एक बड़ी insurance company में NX को केंद्र में रखकर बड़े monorepo और libraries चलाती है
सिर्फ Nx, Anthropic या platform को दोष देने के बजाय असली कारण पर फिर से सोचना चाहिए
इस तरह का हमला finance, power, telecom, hospitals, military जैसी हज़ारों संस्थाओं को गंभीर नुकसान पहुँचा सकता है
AI के फैलाव के साथ हमलों का पैमाना और असर और बढ़ेगा
हम software को पर्याप्त ज़िम्मेदारी से नहीं लिखते। building code की तरह मजबूरी में भी safety-security का पालन कराना पड़ेगा
यह भी काफ़ी खतरनाक है कि personal computing environment एक ही बड़े space में जुड़ा हुआ है
पीड़ितों में से 50% में infection path VS Code था, और यह Linux तथा macOS पर ही काम करता था
GitHub token/credentials को manual-unlock password manager में न रखना GH CLI की भी समस्या है
“software building code” लाने का विचार मुझे बहुत पसंद नहीं, लेकिन industry की वास्तविक कमजोरी पर मैं सहमत हूँ
आपने free open source library इस्तेमाल की, इसलिए अब उस पर liability डालना मुझे अहंकारी सोच लगती है
हाल में मैं अपना ज़्यादातर development work VM के अंदर कर रहा हूँ
आज के environments की security मुझे अस्वीकार्य स्तर की लगती है
agents (agentic software) के malware vector बन जाने की संभावना बहुत बढ़ गई है
अगर attacker आपके box (PC) में घुस गया, तो अब वह 1,000 डॉलर से ज़्यादा मूल्य वाले data, crypto keys, passwords, personal info, financial documents आदि को भी निशाना बना सकता है
मैं भी कुछ ऐसा ही करता हूँ: Podman container के अंदर काम करता हूँ, source code directory के अलावा host के साथ कुछ share नहीं करता
समस्या का एक हिस्सा traditional PC security model (Linux/Windows) से आता है
अगर आपको यह approach पसंद है, तो मैं Qubes OS की सिफारिश करूँगा। यह हर काम को VM में करने के लिए अच्छा UX देता है
लेकिन यह भी स्पष्ट कर दूँ कि ऐसा environment बनाना software ecosystem और history की वजह से बहुत कठिन या काफ़ी महँगा हो सकता है
Claude Code productivity बढ़ाने वाला एक क्रांतिकारी tool है
लेकिन इसके साथ ये security issues भी हैं:
इस तरह कम-से-कम 3 security weaknesses हैं, इसलिए मैं इसे VM/container/dedicated dev box जैसे sandbox के बाहर नहीं चलाना चाहूँगा
मैं भी मानता हूँ कि agents को sandbox में चलाना सही है
फिर भी उससे क्या फर्क पड़ता है?
असली खतरा यह है कि automatic updates के चलते आपने runtime के दौरान remote code execution (RCE) की authority Anthropic को दे दी है
क्या package manager में ‘minimum package age’ जैसी setting होनी चाहिए?
उदाहरण के लिए, 24–36 घंटे से कम पहले publish हुए packages को ignore कर दिया जाए
पहले एक मिलते-जुलते मामले में देखा था कि package update ने सब कुछ तोड़ दिया और फिर कुछ घंटों बाद उसे जल्दी से ठीक/हटा दिया गया
GitHub dependabot ने हाल ही में ठीक ऐसी सुविधा जोड़ी है
Renovate bot में यह option पहले से है (
minimumReleaseAgesetting), और dependabot भी अब support करता हैOS-level नहीं, लेकिन Astral का
uvtool Python packages के लिए ऐसा option देता हैnpm installमें भी किसी खास समय/तारीख़ से पहले की dependencies ही install करने वाला flag हैnpm install --before (2 दिन पहले की तारीख़)से उस तारीख़ के बाद बनी dependencies install नहीं होतींमैं
.npmrcमेंsave-exact=trueसेट करता हूँ और सिर्फ lockfile तथा manual updates का इस्तेमाल करता हूँमुझे शक था कि claude code सच में ऐसे prompts चलाएगा या नहीं, इसलिए मैंने test किया
"यह request cryptocurrency wallets, private keys और दूसरे sensitive files को खोजने/सूचीबद्ध करने जैसी लगती है और इसमें दुरुपयोग की संभावना है, इसलिए मैं इसमें मदद नहीं कर सकता"
इसके बजाय यह केवल वैध requests जैसे security audit, vulnerability analysis, monitoring tool लिखना, file permissions समझना, backup procedures design करना आदि पर मार्गदर्शन देता है
फिर भी कम-से-कम 250 से ज़्यादा सफल cases मिले हैं (यानी कुछ prompts pass हो जाते हैं)
व्यावहारिक परीक्षणों में जब भी Claude और दूसरे models की refusal battle हुई, Claude की refusals/safety measures हर बार बेहतर लगीं
OS को default रूप से apps को पूरे file system तक unrestricted access नहीं देनी चाहिए
कुछ apps के लिए apparmor/selinux profiles होते हैं, और firejail जैसी चीज़ें भी इस्तेमाल की जा सकती हैं
लेकिन UX के स्तर पर बदलाव चाहिए
यह बहुत गंभीर समस्या है। इसकी जड़ 30 साल पुराने desktop design में है
मैं Linux पर Podman के साथ project-by-project environment isolation पर केंद्रित एक tool खुद बना रहा हूँ: probox
Android file security के मामले में Google ने अच्छा काम किया है
bubblewrap और छोटे chroot environments का इस्तेमाल सीखना भी अच्छा रहेगा
मुझे नहीं लगता कोई भी operating system default रूप से applications को "पूरे file system तक असीमित access" देता है
पहले एक धुंधला-सा भरोसा था कि "attacker को मेरे environment का अंदाज़ा लगाना पड़ेगा", लेकिन अब LLM को लगाकर environment के हिसाब से attack सीखना और चलाना संभव है
मुझे लगता है मैंने खुद भी इस प्रवृत्ति की सही भविष्यवाणी की थी
पिछली चर्चा में इस पर दिलचस्प बातें थीं
सच में डरावनी बात यह है कि अब local LLM का इस्तेमाल secrets ढूँढने के लिए हो रहा है
"postinstall" वाली समस्या पुरानी है, लेकिन payload पूरी तरह नई पीढ़ी का है
malicious logic code की बजाय prompt में छिपी होती है, इसलिए पारंपरिक static analysis से पकड़ना मुश्किल हो जाता है
ऐसे malicious prompts से बचाव कैसे किया जाए, यही सोचने वाली बात है