असफल संदिग्ध nation-state हमले का विश्लेषण
(grack.com)- कनाडा के एक डेवलपर को नकली VC इंटरव्यू के बहाने backdoor डालने वाले हमले का निशाना बनाया गया, और हमले का flow इतना डेवलपर-केंद्रित था कि उस पर crates.io package manager को निशाना बनाने का संदेह हुआ
- bait repository ऊपर से “Ticket Harbor” नाम की TypeScript app जैसी दिखती थी, लेकिन
patch-packageऔरtypescript+5.9.2.patchके जरिए TypeScript execution path में malicious code छिपाया गया था - डाला गया stub base64 और XOR obfuscation खोलकर
new Function(...)से execute होता है, फिरoperators/3.pngके छिपे chunk और WASM stub के जरिए 1.68MB का second-stage payload अलग Node process में चलाता है - अंतिम payload “PinpinRAT” RSA-2048 key pair और AES-256-CBC session key बनाता है, और host fingerprinting, file upload/download, process execution, filesystem manipulation, DNS queries और self-removal को support करता है
- अगर repository चलाई गई हो, तो तुरंत network disconnect करना चाहिए और दूसरे device से credentials बदलने चाहिए, साथ ही यह मानकर response करना चाहिए कि cookies और password-protected secrets तक चोरी हो चुकी हो सकती है
नकली इंटरव्यू से शुरू हुआ डेवलपर-टार्गेटेड हमला
- हमलावर ने खुद को “Lua Ventures” से जुड़ा बताने वाले एक नकली व्यक्ति के रूप में पेश किया
- Lua Ventures को सिंगापुर-आधारित DeFi VC के रूप में बताया गया, लेकिन वास्तव में वह पहले ही inactive हो चुका था
- उस व्यक्ति का नाम प्रकाशित नहीं किया गया, क्योंकि उससे वास्तविक समान-नाम वाले लोगों के साथ भ्रम हो सकता था
- ईमेल विश्वसनीय था और उसमें सामान्य लेकिन वैध दिखने वाला LinkedIn profile link भी शामिल था
- सलाह ढूंढने वाली निवेश फर्म के रूप में Lyrasing और Roadpay का उल्लेख किया गया
- दोनों कंपनियों की बुनियादी web presence थी, इसलिए वे पूरी तरह नकली के बजाय शुरुआती चरण की कंपनियों जैसी लगती थीं
- Roadpay साइट का archive.org snapshot भी मौजूद है
- ईमेल के आदान-प्रदान के बाद बात Google Meet call तक पहुंची
- call पर सामने वाला व्यक्ति जर्मन लहजे वाला पुरुष था और उसने कहा कि वह यात्रा में है
- call में खुद कोई स्पष्ट असामान्य बात नहीं थी
“test assignment” के रूप में छिपाया गया execution trigger
- call के बाद हमलावर ने “test” का प्रस्ताव रखा और repository भेजी
- repository को “Ticket Harbor” नाम की ferry ticketing app की तरह सजाया गया था
- शामिल
task.txtमें उबाऊ लेकिन विश्वसनीय task list थी, और अंत में execution instructions दी गई थीं- repository का typecheck, test suite, और संबंधित desktop/server build commands चलाने को कहा गया था
- यही निर्देश वास्तविक infection trigger था
npm run typecheck,build,devजैसे commands में, जैसे ही TypeScript execute होता याtypescript.jsimport होता, payload चल सकता था
TypeScript patch में छिपी execution chain
- पहला warning signal यह था कि repository TypeScript assignment जैसी दिखती थी
- मांगी गई चीज architecture analysis से ज्यादा TypeScript hiring task के करीब थी
- repository को Claude में डालकर जल्दी जांचने पर
patch-packageसे जुड़ी असामान्यताएं सामने आईं
patches/directory असामान्य रूप से बड़ी थी- कुछ patches सामान्य दिखते थे और असली payload छिपाने के लिए noise की तरह काम करते थे
- उदाहरण के तौर पर
sumchecker+3.0.1.patch,@electron+get+2.0.3.patch,extract-zip+2.0.1.patchशामिल थे
- मुख्य malicious code
typescript+5.9.2.patchमें था- इसने
typescript.jsऔर_tsc.jsके सबसे ऊपर तुरंत चलने वाला stub inject किया - stub base64 string decode करता है, हर byte को key
73से XOR-decrypt करता है, फिरnew Function(...)से execute करता है - execution function को
require,Buffer,WebAssembly,process,__dirnameदिए जाते हैं
- इसने
- execution chain कई stages से गुजरती है
- चार
postinstallhookspatch-packageचलाते हैं - इनमें से एक patch file पर
git update-index --skip-worktreeलागू करता है ताकि वहgit statusमें छिपी रहे - loader
operators/3.pngfile के अंत में जुड़े hidden chunk को पढ़ता है - वह custom
wAsmchunk के छोटे WASM stub को चलाता है - 1.68MB का obfuscated second-stage payload एक शांत अलग Node process में चलाया जाता है
- चार
- attack code को execution के बाद traces कम छोड़ने के लिए design किया गया था
git skip-worktreeसे patch छिपाया जाता है- dropper पहले execution के बाद patch file से अपनी inject की गई lines मिटा देता है
- second-stage temporary directory execution के दौरान self-delete हो जाती है
PinpinRAT की क्षमताएं
- अंतिम payload को “PinpinRAT” कहा गया है
- यह नाम internal strings के कारण दिया गया, हालांकि संभव है कि यह किसी और नाम से भी जाना जाता हो
- online इसके अन्य references नहीं मिले
- payload कई obfuscation layers के भीतर था
- obfuscator.io
- अतिरिक्त दो base64 layers
- RAT शुरू होते ही host fingerprint इकट्ठा कर exfiltrate करता है
- primary IP address और पूरी IP list
os.userInfo().usernameका username- hostname
- OS type, release, platform, architecture
- process PID और पूरा
process.argv - Node version
- इसमें encryption structure भी शामिल है
- local स्तर पर RSA-2048 key pair generate किया जाता है
- random AES-256 session key
aes_pskgenerate की जाती है - उसके बाद का traffic AES-256-CBC से encrypt होता है और HMAC-SHA256 integrity tag के साथ जाता है
- supported commands remote access trojan स्तर की functionality देते हैं
env:process.envको JSON string में बदलकर भेजनाupload: arbitrary file path पढ़कर exfiltrate करनाdownload: attacker द्वारा दिए गए bytes को writable path पर लिखनाspawn: optional shell expansion के साथ arbitrary process चलानाls,cd,pwd,cp,mv: सामान्य filesystem manipulationdns: दिए गए resolver के जरिए arbitrary name resolve करनाdismantle: self-removal
compromise indicators और तुरंत response
- payload वाली image को VirusTotal पर किसी भी AV engine ने detect नहीं किया
- अगर इसे execute किया गया हो, तो system को तुरंत network से अलग करना चाहिए
- credentials दूसरे device से बदलने चाहिए
- cookies और password-protected secrets को भी compromised मानना चाहिए
- PinpinRAT से जुड़े compromise indicators इस प्रकार हैं
- C2:
89.124.107.161:80 - Windows scheduled task:
PinpinWrappedJs - macOS process disguise:
com.apple.WebKit.Networking - environment variables:
NODT_PAYLOAD_PATH,NODT_PAYLOAD_ARGS - PNG chunk guard:
WASMPACK(wAsm) PINPIN_NO_AUTOSTART=1: persistence रोकता हैmutex.jsवाला cronjob: यह केवल RAT को उचित permissions होने पर मौजूद हो सकता है, और macOS पर न भी होtypescript.jsanchor strings:12ff4b51,ticket-harbor-tsc-shim-anchor- payload वाला
typescript+5.9.2.patch - artifact directories:
- macOS:
~/Library/Caches/runtime-cache/.cache-<randomhex>/ - Linux:
/tmp/.cache-<randomhex>/ - Windows:
%TEMP%\\.cache-<randomhex>\\ - इनके भीतर
payload.jsऔरmutex.jsहोते हैं
- macOS:
- C2:
बाद में दिखे warning signals
- संदेशों में ध्यान से देखने पर LLM traces जैसे कुछ संकेत थे
- LinkedIn profile पहली नजर में सामान्य लगती थी, लेकिन degree और qualifications की सूची अटपटी थी और वास्तविक गतिविधि भी नहीं थी
- वेबसाइट के social media links का वास्तविक history था, लेकिन नाम नवंबर 2025 में बदला गया था
- posts में specificity कम थी और वे कंपनियों की अस्पष्ट प्रशंसा जैसी लगती थीं
- कंपनी websites आकर्षक थीं, लेकिन वास्तविक presence लगभग नहीं थी
- हमलावर ने औपचारिक calendar invite नहीं भेजा, सिर्फ समय और Google Meet link दिया
- call के दौरान camera लगातार बंद था और उसने कहा कि वह यात्रा में है
- सिंगापुर-आधारित VC, CEST timezone activity, कनाडाई डेवलपर को target करना, और अमेरिकी ग्राहकों को निशाना बनाने वाला
.ccdomain—ये सब साथ दिखे- दूर स्थित संगठन की विश्वसनीयता सत्यापित करना और कठिन हो गया
- अकेले-अकेले संकेत निर्णायक नहीं थे, लेकिन कई yellow flags मिलकर red flag जैसी स्थिति बनाते थे
हमले के पीछे कौन और इसका दायरा
- हमले के पीछे किसका हाथ था, यह निश्चित रूप से नहीं कहा जा सकता
- हमला डेवलपर्स को target करता था और इसमें नकली पहचान, विश्वसनीय cover story, कई fake websites, धैर्यपूर्वक की गई scheduling, और परिष्कृत
gittraps शामिल थे - यह 2026 में कई actors द्वारा इस्तेमाल किए जा रहे “fake interview scam” pattern से मेल खाता है
- Reddit की Rust community में भी इसी तरह target किए जाने का एक मामला बताया गया
- यही तरीका अगर Rust repository में trap
build.rsscript के रूप में बना होता, तो लेखक भी फंस सकता था, क्योंकि यह डेवलपर workflow के बहुत करीब फिट किया गया था
1 टिप्पणियां
Lobste.rs की राय
शीर्षक में यह अनुमान लगाना कि यह nation-state-backed attacker हो सकता है, भ्रमित करने वाला है। इसमें ऐसा कुछ नहीं दिखता जिसके लिए उस स्तर की तैयारी या जटिलता जरूरी हो
संभावना की कल्पना की जा सकती है, लेकिन यह बाकी scenarios जितना ही plausible लगता है
फिर भी, यह लगभग निश्चित रूप से nation-state-backed attacker नहीं लगता। इस तरह के attacks अब इतने मुश्किल नहीं रहे
एक हफ्ते पहले मेरे blog post में बताए गए hypothetical case और इस attack का मिलना सचमुच संयोग है: the hypothetical I describe in my blog post from a week ago
tech-savvy professionals भी फंस सकते हैं, इसका उदाहरण देने के लिए मैंने बस कुछ plausible attacks में से एक चुना था। लोगों को निशाना बनाने वाले कई sophisticated scams बढ़ते हुए देखे थे, लेकिन यह नहीं पता था कि interview scam वाला trend चल रहा है। इसलिए इस attack के बारे में जानकर थोड़ा डर लगा
पिछले हफ्ते Lua Ventures के D____ S_____ से बिल्कुल इसी तरह का interview offer मिला था। ज्यादातर recruiter spam की तरह इसे ignore कर दिया, और अच्छा किया
कुछ दिन या कुछ हफ्ते पहले शायद ऐसी कोई submission आई थी
ऐसा लगा था कि इसी तरह के कई articles थे
“यह असली email जैसा दिखा” वाली बात हैरान करने वाली है। यह इतना साफ़ तौर पर LLM-generated text था कि मुझे लगता है दूसरी sentence से ही शक हो जाता