Shai-Hulud ने डेवलपर मशीनों को संक्रमित कर GitHub ऑर्गनाइज़ेशन एक्सेस चुरा लिया: पोस्टमॉर्टम विश्लेषण
(trigger.dev)- Shai-Hulud 2.0 malicious npm package ने डेवलपर मशीनों को संक्रमित करके Trigger.dev के GitHub organization access को चुरा लिया
- संक्रमण तब शुरू हुआ जब डेवलपर ने
pnpm installचलाया और malicious package का preinstall script execute हुआ; TruffleHog tool का इस्तेमाल कर credentials चुराए गए - हमलावर ने 17 घंटे तक 669 repositories clone कीं, और फिर 10 मिनट के दौरान 199 branches पर force push तथा 42 PR बंद करने की कोशिश की
- Packages और production systems प्रभावित नहीं हुए, और हमला 4 मिनट के भीतर detect होकर account access block कर दिया गया
- घटना के बाद npm scripts disable करना, pnpm 10 upgrade, OIDC-आधारित npm deployment, branch protection का पूर्ण लागूकरण जैसी security measures मजबूत की गईं
हमले का अवलोकन
- 25 नवंबर 2025 को, internal Slack debugging के दौरान कई repositories में Linus Torvalds के नाम से “init” commit बनने जैसी असामान्य गतिविधि दिखी
- जांच में पता चला कि Shai-Hulud 2.0 supply-chain worm ने डेवलपर मशीन को संक्रमित कर GitHub credentials चुरा लिए थे
- रिपोर्ट के अनुसार इस worm ने 500 से अधिक npm packages को संक्रमित किया और 25,000 से अधिक repositories को प्रभावित किया
- Trigger.dev के official npm packages (
@trigger.dev/*, CLI) संक्रमित नहीं हुए
हमले की टाइमलाइन
- 24 नवंबर 04:11 UTC: malicious package का वितरण शुरू
- 20:27 UTC: जर्मनी में एक डेवलपर मशीन संक्रमित
- 22:36 UTC: हमलावर की पहली पहुंच और बड़े पैमाने पर repository cloning शुरू
- 15:27~15:37 UTC (25 नवंबर): 10 मिनट तक destructive attack
- 15:32 UTC: असामान्य गतिविधि detect हुई और 4 मिनट के भीतर access block
- 22:35 UTC: सभी branches की recovery पूरी
संक्रमण की प्रक्रिया
- जब डेवलपर ने
pnpm installचलाया, malicious package का preinstall script execute हुआ, जिसने TruffleHog को download और run किया - TruffleHog ने GitHub tokens, AWS credentials, npm tokens, environment variables आदि scan करके बाहर exfiltrate किए
- संक्रमित मशीन में
.trufflehog-cachedirectory और उससे जुड़े files मिले - संक्रमण का कारण बना package delete कर दिया गया था, इसलिए tracing संभव नहीं रही
हमलावर की गतिविधियां
- संक्रमण के बाद 17 घंटे तक reconnaissance activity जारी रही
- अमेरिका और भारत-आधारित infrastructure का उपयोग करके 669 repositories clone की गईं
- डेवलपर गतिविधियों की monitoring करते हुए GitHub token access बनाए रखा गया
- “Sha1-Hulud: The Second Coming” नाम की repository बनाई गई, जिसका उपयोग credentials store करने के लिए हुआ माना गया
- इसके बाद 10 मिनट तक destructive actions की गईं
- 16 repositories में 199 branches पर force push की कोशिश
- 42 PR बंद किए गए, जिनमें कुछ branch protection settings के कारण block हो गए
- सभी commits “Linus Torvalds <email> / init” के रूप में दिखे
detection और response
- Slack alerts के जरिए असामान्य गतिविधि real time में detect हुई
- 4 मिनट के भीतर संक्रमित account का GitHub access block किया गया, और उसके बाद AWS·Vercel·Cloudflare सहित सभी services की access revoke की गई
- AWS CloudTrail log analysis में सिर्फ read-only API calls मिले, production data access नहीं मिला
- AWS ने अलग से Shai-Hulud से जुड़ी संदिग्ध गतिविधि detect कर warning भेजी
नुकसान और recovery
- 669 repositories clone, 199 branches पर force push, 42 PR बंद
- GitHub में server-side reflog न होने से recovery कठिन थी, लेकिन event API और local reflog की मदद से 7 घंटे में पूरा restore कर लिया गया
- npm packages और production infrastructure प्रभावित नहीं हुए
GitHub App key exposure
- जांच के दौरान डेवलपर laptop के trash में GitHub App private key मिली
- इस key के पास customer repositories पर read/write permission थी, इसलिए इसे तुरंत rotate किया गया
- database (installation ID storage) प्रभावित नहीं हुआ, इसलिए customer repository access का कोई प्रमाण नहीं मिला, हालांकि इसे पूरी तरह नकारा नहीं जा सकता
- GitHub support team से अतिरिक्त logs मांगे गए और customers को email notice भेजा गया
Shai-Hulud का तकनीकी विश्लेषण
setup_bun.jsचलने पर Bun runtime install होता है और background मेंbun_environment.jsexecute होता है- TruffleHog का उपयोग कर
$HOMEdirectory के credentials इकट्ठा किए जाते हैं - इकट्ठा किया गया data (
contents.json,cloud.json,truffleSecrets.jsonआदि) random GitHub repositories पर triple base64 encoding के रूप में upload किया जाता है - अगर npm token मौजूद हो, तो संक्रमित account के packages को modify और republish कर worm फैलाया जाता है
- अगर credentials न मिलें, तो home directory delete करने की कोशिश की जाती है
- infection indicators:
setup_bun.js,bun_environment.js,.trufflehog-cache/आदि
security hardening measures
- npm scripts पूरी तरह disable (
ignore-scripts=true) - pnpm 10 upgrade: scripts default रूप से disabled,
minimumReleaseAge(3 दिन) सेट कर नए packages की install delay - OIDC-आधारित npm Trusted Publishers अपनाकर long-lived tokens हटाए गए
- सभी repositories पर branch protection लागू
- AWS SSO में Granted लागू, session tokens encrypt किए गए
- GitHub Actions में external contributor workflows चलाने के लिए approval अनिवार्य किया गया
अन्य टीमों के लिए सबक
- npm install के दौरान होने वाला arbitrary code execution model स्वयं एक attack surface है
ignore-scripts=trueसेट करना और सिर्फ जरूरी packages को whitelist करना आवश्यक है- pnpm minimumReleaseAge से नए packages की installation delay की जा सकती है
- branch protection और OIDC-आधारित deployment आवश्यक security controls हैं
- local machine पर long-lived credentials store नहीं करने चाहिए; deployment सिर्फ CI के जरिए होना चाहिए
- Slack alert noise ही detection की key साबित हुई
मानवीय पहलू
- संक्रमित डेवलपर की कोई गलती नहीं थी; सिर्फ
npm installचलाने से यह नुकसान हुआ - हमले के दौरान उस account से सैकड़ों random repositories को अपने-आप ‘star’ किए जाने के संकेत मिले
- इस घटना ने किसी एक व्यक्ति की गलती नहीं, बल्कि ecosystem की structural vulnerability को उजागर किया
सारांश मेट्रिक्स
- पहली infection से पहले attack तक: लगभग 2 घंटे
- हमलावर का access बना रहने का समय: 17 घंटे
- destructive activity की अवधि: 10 मिनट
- detection तक 5 मिनट, block तक 4 मिनट
- पूरी recovery में 7 घंटे
- cloned repositories: 669 / प्रभावित branches: 199 / बंद PR: 42
संदर्भ संसाधन
- Socket.dev: Shai-Hulud Strikes Again V2
- PostHog, Wiz, Endor Labs, HelixGuard की analysis reports
- npm Trusted Publishers, pnpm
onlyBuiltDependencies,minimumReleaseAge, Granted documentation
3 टिप्पणियां
लगता है कि pnpm की संरचना ऐसी थी जिसमें default रूप से post-install को अलग-अलग अनुमति देनी पड़ती थी, लेकिन आखिरकार developers भी अनजाने में इसे allow करने लगते हैं।
मेरी समझ में,
npmडिफ़ॉल्ट रूप से चलने के लिए सेट होता है, इसलिएpnpmपर स्विच करके डिफ़ॉल्ट रूप से उसे disable कर दिया गया, ताकि सुरक्षा मज़बूत की जा सके।Hacker News टिप्पणियाँ
npm installचलाना लापरवाही नहीं हैसमस्या यह है कि package install प्रक्रिया में मनमाना code execution स्वीकार करने वाला ecosystem मौजूद है
लेकिन मूल security failure यह है कि हम ऐसे package manager का उपयोग कर रहे हैं जिसमें कोई third party बिना किसी verification के मेरे product में code ठूंस सकता है
आखिरकार हम package managers और उनके operators की नीयत और क्षमता पर असीम रूप से निर्भर हैं
और ऐसा भी लगता है कि OP ने credentials को file system में plain text के रूप में store किया था
language स्तर पर ऐसी संरचना बनाई जा सकती है जो code को input पढ़ने, resources consume करने, और सिर्फ type-correct output generate करने तक सीमित करे
यह supply chain समस्या का पूरा समाधान नहीं है, लेकिन exposure का दायरा काफी कम हो जाएगा
मतलब, “एक व्यक्ति का ऐसे tools इस्तेमाल करना गलत नहीं है, लेकिन जब सब इस्तेमाल करें तो ecosystem समस्या बन जाता है”
यह बात कई बार साबित हो चुकी है कि बहुत से developer tools security-vulnerable हैं
अगर सच में परवाह है, तो उसे व्यवहार में दिखाना होगा
VS Code इस्तेमाल करते समय, एक छोटा सा feature जोड़ने के लिए भी किसी अज्ञात व्यक्ति का plugin install करना पड़े, यह मुझे असुविधाजनक लगा
आखिरकार क्या हमें ऐसा code चलाना ही नहीं पड़ेगा जिस पर भरोसा करना मजबूरी हो?
netrcfile को support करते हैंअगर
gitको HTTP पर इस्तेमाल करें, तो plain-text credential exposure path लगभग हमेशा मौजूद रहता हैpnpm maintainer ने एक साल पहले “post-install scripts को default रूप से block करें” का प्रस्ताव दिया था
user के लिए यह असुविधाजनक होता, लेकिन लंबी अवधि में सब इसके लिए आभारी होते, ऐसा उनका मानना था
संबंधित PR: pnpm/pnpm#8897
आखिरकार यह convenience ने security को हरा दिया वाला एक और मामला है
उन्होंने कहा कि “database प्रभावित नहीं हुआ”, लेकिन अगर attacker ने AWS और secrets तक पहुँच बना ली थी, तो मेरे हिसाब से वह पहले ही compromise हो चुका था
अगर access की संभावना थी, तो उसे compromise मानना चाहिए
malware चलने के बाद origin trace करना लगभग असंभव हो जाता है
pnpm installभी सामान्य रूप से पूरा हो जाता है, इसलिए इसे detect करना मुश्किल हैअगर Sentinel One या CrowdStrike जैसे EDR होते, तो investigation के लिए ज्यादा clues मिल सकते थे
“कुल 669 repo clone किए गए” वाला हिस्सा ध्यान खींचता है
100 से कम कर्मचारियों वाली कंपनी के पास 600 से अधिक repo होना सामान्य है या नहीं, यह जानने की जिज्ञासा है
repo की संख्या पर team size से ज्यादा company की उम्र और projects की lifespan असर डालती है
pnpm ने पहले ही
preinstallजैसे lifecycle scripts के automatic execution को बंद कर दिया है, इसलिए लगता है कि उन्होंने पुराना version इस्तेमाल किया थासंबंधित PR देखें
postinstallscript रही होpnpm dependencies की scripts को block करता है, लेकिन project-level scripts अभी भी चलाता है
इतनी पारदर्शी post-mortem साझा करने के लिए धन्यवाद
ऐसे मामले पूरे industry के लिए महत्वपूर्ण हैं
यह जानने की जिज्ञासा है कि attack traffic सामान्य developer traffic से अलग पहचान में आता था या नहीं
हम भी dev environment में egress filtering मजबूत करने की कोशिश कर रहे हैं, लेकिन
npm installबार-बार टूट जाता है, इसलिए दिक्कत हो रही हैमैं व्यक्तिगत laptop पर
gitsecurity के बारे में सोच रहा हूँअभी local में SSH key रखकर push करता हूँ
admin privileges भी हैं, इसलिए जोखिम है। इसे और सुरक्षित कैसे बनाया जाए, यह जानना चाहता हूँ
इससे signing key और access key को अलग किया जा सकता है, और admin account को अलग से manage किया जा सकता है
संबंधित दस्तावेज़: 1Password SSH Agent, Git Commit Signing, GitHub OAuth, GitHub CLI Login
इसका लाभ यह है कि key बाहर leak नहीं हो सकती, लेकिन अगर malware मेरी machine पर चल रहा हो, तब भी जोखिम बना रहता है
Linux उदाहरण, macOS उदाहरण
TPM या Yubikey से इसे थोड़ा मुश्किल बनाया जा सकता है, लेकिन पूरी सुरक्षा असंभव है
admin काम अलग dedicated machine पर करना ज्यादा सुरक्षित है
gpg-agentसे SSH authentication करने का तरीका भी हैpush या commit के समय PIN डालकर unlock किया जाता है
mainbranch पर direct push रोक दें, और MFA अनिवार्य करें, तो attacker के लिए तुरंत deploy branch तक पहुँचना कठिन होगाTorvalds नाम वाला commit infection के बाद अक्सर दिखने वाला signature था
Microsoft की आधिकारिक analysis post में भी इसका उल्लेख है
यह worm बहुत noisy था, और कुछ attackers ने exposed credentials का उपयोग करके private repo को public कर दिया या readme बदलकर प्रचार के लिए दुरुपयोग किया
अगर attacker बिना तोड़फोड़ किए चुपचाप सिर्फ data exfiltrate करता, तो क्या ऐसी detection संभव होती, इस पर संदेह है