Shai-Hulud की वापसी: 300 से अधिक NPM पैकेज संक्रमित
(helixguard.ai)- NPM रजिस्ट्री में 1,000 से अधिक कंपोनेंट्स कुछ ही घंटों में एक ही तरीके से संक्रमित हुए और malicious code वाले नए versions वितरित किए गए
- malicious packages ने Bun runtime install script का रूप धारण करके
setup_bun.jsऔर obfuscatedbun_environment.jsजोड़ा, और execution के समय TruffleHog का उपयोग कर local credentials चुरा लिए - एकत्र की गई AWS/GCP/Azure·GitHub·NPM tokens जैसी sensitive information को
SHA1HULUDनाम के GitHub Action runner के जरिए बाहर भेजा गया - malicious script ने
npm publishअपने आप चलाकर worm-शैली self-replication किया, जिसके परिणामस्वरूप 27,000 से अधिक GitHub repositories संक्रमित हो गईं - इसे open source ecosystem में फैले supply chain security threat को फिर से उजागर करने वाली घटना के रूप में देखा जा रहा है
हमले का अवलोकन
- 24 नवंबर 2025 को HelixGuard ने NPM रजिस्ट्री में 1,000 से अधिक पैकेजों को कुछ घंटों के भीतर एक ही तरीके से संक्रमित पाया
- नए versions ऐसे छिपाए गए थे मानो वे Bun runtime जोड़ रहे हों, और उनमें
preinstall: node setup_bun.jsscript शामिल थी - साथ में वितरित
bun_environment.jsफ़ाइल obfuscated malicious code थी, जो चलने पर TruffleHog को डाउनलोड करके execute करती थी
- नए versions ऐसे छिपाए गए थे मानो वे Bun runtime जोड़ रहे हों, और उनमें
- TruffleHog local environment में NPM tokens, AWS/GCP/Azure credentials, environment variables आदि को scan करके चुरा लेता था
- चुराई गई जानकारी को GitHub Action runner
SHA1HULUDबनाकर,Sha1-Hulud: The Second Coming.विवरण वाले GitHub repository के जरिए बाहर भेजा गया - HelixGuard ने संकेत दिया कि यह हमला सितंबर 2025 में हुई “Shai-Hulud” घटना के उसी हमलावर द्वारा किया गया हो सकता है
malicious code के व्यवहार का विश्लेषण
- उदाहरण के तौर पर
@asyncapi/specsपैकेज के विश्लेषण में पाया गया कि NPM पर वितरित version संक्रमित था, लेकिन GitHub का मूल repository सुरक्षित था - हमलावर ने
package.jsonमें बदलाव करsetup_bun.jsजोड़ा, और उसेbun_environment.jsको call करने के लिए configure किया bun_environment.js10MB से अधिक आकार की उच्च स्तर पर obfuscated JavaScript file थी, जिसके मुख्य कार्य इस प्रकार थे- environment variables से cloud credentials और tokens एकत्र करना
- TruffleHog का उपयोग करके secret key scan करना
- GitHub Actions के जरिए data exfiltration करना
- इसके अलावा
package.jsonमें बदलाव कर infection code डाला गया औरnpm publishअपने आप चलाकर worm-शैली propagation की गई
GitHub संक्रमण और data exfiltration
- malicious script ने
.github/workflows/formatter_123456789.ymlफ़ाइल बनाई औरSHA1HULUDrunner को register किया - उस workflow ने repository के secrets को double Base64 encoding के साथ
actionsSecrets.jsonफ़ाइल में package किया - इसके बाद
Sha1-Hulud: The Second Coming.विवरण वाले random नाम के GitHub repositories बनाकर data upload किया गया - HelixGuard ने पुष्टि की कि 27,000 से अधिक GitHub repositories संक्रमित हुईं
- चुराए गए secret data में
AWS_ACCESS_KEY_ID,SLACK_WEBHOOK_URL,CODECOV_TOKEN,WEBFLOW_TOKENसहित कई services के credentials शामिल थे
संक्रमित पैकेजों की सूची
- HelixGuard ने बताया कि सैकड़ों NPM पैकेज संक्रमित हुए
- प्रमुख रूप से
@asyncapi,@ensdomains,@posthog,@zapier,@postman,@voiceflowजैसे संगठनों के पैकेज शामिल थे - प्रत्येक पैकेज के कई versions (जैसे
@asyncapi/specs@6.8.2,@postman/csv-parse@4.0.5) संक्रमित हुए
- प्रमुख रूप से
- अधिकांश संक्रमित पैकेज सामान्य open source projects का रूप धारण किए हुए थे, और automated deployment process में malicious code डाले जाने के रूप में पाए गए
सुरक्षा संबंधी संकेत
- यह हमला supply chain security की कमजोरी का दुरुपयोग कर बड़े पैमाने पर open source ecosystem को संक्रमित करने का मामला है
- इससे NPM·GitHub·cloud credentials सहित पूरे development infrastructure में security management को मजबूत करने की जरूरत सामने आई
- HelixGuard ने संक्रमित पैकेजों की installation तुरंत रोकने और संबंधित tokens व credentials को तुरंत revoke करने की सिफारिश की
5 टिप्पणियां
js इकोसिस्टम वाकई पूरी तरह बिखरा हुआ कचरा है।
https://github.com/search/…
मैंने एक real-time scanner script बनाकर देखा है।
संदिग्ध repository के path में
npx sha1-hulud-scannerदर्ज करें।
Source code : https://github.com/developerjhp/sha1-hulud-scanner
Hacker News टिप्पणियाँ
एक टिप साझा कर रहा हूँ: NPM की जगह PNPM इस्तेमाल करना बेहतर है
PNPM 10.x कई attack vectors को ब्लॉक करता है
1️⃣ डिफ़ॉल्ट रूप से post-install scripts नहीं चलाता, और manual approval चाहिए
2️⃣ इसे ऐसे configure किया जा सकता है कि नया release publish होने के कुछ समय बाद ही install हो, जैसे 4 दिन
production CLI environment में NPM बहुत अस्थिर है
publisher keys को least privilege तक सीमित रखना चाहिए, उन्हें सिर्फ़ खास packages से bind करना चाहिए, और IP को CI/CD runners से बाँधना चाहिए
publish keys को local में न रखें, और ज़रूरत हो तो OIDC Trusted Publisher या token-based access पर विचार करें
सिर्फ़ lockfile पर ही पाँच बार कोशिश की गई, फिर भी वह अब तक पूरी तरह सही नहीं है
structure और commit history देखें तो टीम मेहनत से सुधार कर रही है, लेकिन लगता है शुरुआत बहुत गहरे गड्ढे से हुई थी
अब भी यह file transfer के दौरान early EOF detect नहीं कर पाता, और cache में अधूरी files छोड़ देता है, इसलिए धीमे internet environment में update fail होने पर बहुत समय बर्बाद होता है
शुरुआत में यह जटिल लगता है, लेकिन secrets को lease के concept से manage किया जा सकता है
हर CI build के लिए lease बनाई जा सकती है और खत्म होने पर यह अपने-आप revoke हो जाती है, साथ ही TTL और automatic rotation भी मिलता है
इससे long-term credentials छिपाए जा सकते हैं, और सिर्फ़ build के समय short-lived token जारी किए जा सकते हैं
ऐसे हमलों की वजह से कंपनी के भीतर असली security discussions सक्रिय होना एक सकारात्मक बात है
npm ciइस्तेमाल करेंयह केवल package-lock.json में दिए गए versions install करता है, इसलिए automatic updates से होने वाले हमले का जोखिम घटाया जा सकता है
सिर्फ़ intentional updates करने की आदत महत्वपूर्ण है
pip install --only-binary=:all:option से ऐसी ही protection मिल सकती हैयह source distributions को पूरी तरह ब्लॉक कर देता है और सिर्फ़ wheel install करता है
हालाँकि version constraints की समस्या हो सकती है
uvमें--exclude-neweroption से PNPM के ‘minimum release age’ feature जैसा व्यवहार पाया जा सकता हैमैं सभी dependencies को pin करता हूँ और dependabot alerts को manually review करता हूँ
यह ज़्यादा सतर्कता है या सही आदत, इस पर अब भी सोच रहा हूँ
आज ख़ास तौर पर एक प्रासंगिक लेख है: “We should all be using dependency cooldowns”
automatic dependency updates एक दिन की vulnerability से भी ज़्यादा खतरनाक हो सकती हैं
क्योंकि हज़ारों lock files में फैल चुके infected packages को वापस हटाना कहीं ज़्यादा कठिन होता है
अगर सब ठीक चल रहा है, तो उसे छेड़ने की कोई वजह नहीं है
uvमेंuv lock --exclude-newer $(date --iso -d "24 hours ago")command से मिलता-जुलता असर पाया जा सकता हैइससे जुड़ी चर्चा issue #14992 में है
npx npm-check-updates -c 7command से 7 दिन का cooldown सेट किया जा सकता हैnpm-check-updates docs देखें
cooldown 0-day vulnerabilities के फैलाव का समय बढ़ा सकता है
अगर सब एक ही cooldown अपनाएँ, तो बस detection delay होगा
मैं PostHog का सह-संस्थापक हूँ
हम इस हमले के पीड़ितों में थे
संक्रमित versions थे posthog-node 4.18.1, 5.13.3, 5.11.3 / posthog-js 1.297.3 / posthog-react-native 4.11.1 / posthog-docusaurus 2.0.6
हमने सभी keys और passwords बदल दिए हैं, और नए versions release कर दिए हैं
हम root cause analysis कर रहे हैं और status.posthog.com पर updates देंगे
अगर किसी website ने संक्रमित version deploy किया था, तो जानना चाहूँगा कि क्या visitors को नुकसान पहुँचा
एक गंभीर सवाल: क्या Node में नया project शुरू करना सही है
मैं Astro से SaaS frontend बना रहा हूँ, और हर dependency update पर बेचैनी होती है
npm ecosystem में security की कमी बहुत गंभीर लगती है
Rust जैसे ecosystems, जो असंख्य subpackages पर निर्भर हैं, वे भी कभी न कभी यही झेलेंगे
C, C++, Odin की तरह package manager न होना सुरक्षा के लिहाज़ से शायद ज़्यादा समझदारी हो सकती है
हाल में मैं Deno के JSR पर ज़्यादा भरोसा करता हूँ
JSR-based packages npm पर भी cross-publish होते हैं, और कुछ packages सिर्फ़ Deno के लिए भी हैं
उदाहरण के लिए Lume धीमा है, लेकिन एक स्थिर SSG के रूप में प्रभावशाली लगा
npm सबसे बड़ा repository है, इसलिए attackers के लिए इसकी value ज़्यादा है
RubyGems या Cargo में भी यह पूरी तरह हो सकता है
बस यह सबसे ज़्यादा इस्तेमाल होने वाला ecosystem है, इसलिए हमले यहीं केंद्रित होते हैं
dependencies को सावधानी से manage करें, और रोज़ update न करें, बस इतना काफ़ी है
इसका एक फ़ायदा यह है कि page rendering के लिए 100 से ज़्यादा dependencies की ज़रूरत नहीं पड़ती
project link देखें
आजकल मैं सारा development सिर्फ़ Podman containers के अंदर करता हूँ
जो code मैंने नहीं पढ़ा, उसे हमेशा isolated environment में चलाता हूँ
यह perfect नहीं है, लेकिन कम से कम एक बुनियादी security habit तो है
security अक्सर experts को सौंपा गया क्षेत्र बन जाता है, इसलिए व्यवहार में बदलाव लाना कठिन है
12 साल पहले NPM एक बार पूरी तरह डाउन हो गया था
तब वह सिर्फ़ एक open source project था, लेकिन अब यह Microsoft के पास है
अगर दुनिया की सबसे बड़ी कंपनियों में से एक इसके पीछे है, तो क्या उसे ऐसी समस्याएँ हल नहीं करनी चाहिए?
लेकिन अब भी बहुत कुछ बदला हुआ नहीं दिखता
enterprise licensing से सीधा पैसा न बने तो चीज़ों को छोड़ देता है
इसलिए Windows 11 एक marketing package जैसा लगता है
हम फिलहाल हमलावर गतिविधि को monitor कर रहे हैं, और संक्रमित packages की सूची Wiz ब्लॉग पर अपडेट कर रहे हैं
हम malicious payload का reverse engineering कर रहे हैं, और कुछ घंटों में नतीजे साझा करेंगे
PostHog का “Talk to a human” chat वास्तव में robot response दे रहा था, जो काफ़ी परेशान करने वाला था
emergency support link भी ठीक से नहीं दिखाया गया
इसलिए मैं पूछना चाहता हूँ — किन versions से बचना चाहिए?
संक्रमित versions थे posthog-node 4.18.1, 5.13.3, 5.11.3 / posthog-js 1.297.3 / posthog-react-native 4.11.1 / posthog-docusaurus 2.0.6
latest version पर update कर लेने से आप सुरक्षित हैं
मुझे हैरानी है कि ऐसी package-level अव्यवस्था हमेशा Node ecosystem में ही क्यों दिखती है
समझ नहीं आता कि यह community जटिल install hooks और automatic updates को अच्छी engineering क्यों मानती है
अब समझ आता है कि Node के creator ने इसे क्यों छोड़ दिया
विशाल ecosystem, नए developers की भरमार, security awareness की कमी, और छोटे-से feature के लिए भी library dependency
Debian की तरह भरोसेमंद maintainers को verification करना चाहिए, लेकिन JS community इसे gatekeeping कहकर ठुकरा देती है
इसलिए ऐसी स्थितियाँ बार-बार दोहराई जाती हैं
उस रवैये से कुछ भी नहीं बदलेगा
थोड़ा विषय से हटकर, लेकिन जानना चाहता हूँ कि HelixGuard कौन है
उसकी website बुरी हालत में है, और जानकारी भी लगभग नहीं के बराबर है
कहा जा रहा है कि उसके clients crypto exchanges हैं, जो कुछ संदिग्ध लगता है
HelixGuard X account
2️⃣ नया release deploy होने के बाद एक तय अवधि (जैसे: 4 दिन) बीतने पर ही install होने के लिए सेट किया जा सकता है
यह तो बहुत बढ़िया फीचर है। Google भी कभी-कभी bug की वजह से काम न करने वाला version NPM पर upload कर देता है, इसलिए कभी-कभी मुझे लगता है कि क्या यह मेरी ही bug है, और मैं घबरा जाता हूँ।