1 पॉइंट द्वारा GN⁺ 5 시간 전 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • कनाडा के एक डेवलपर को नकली 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.js import होता, 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 से गुजरती है
    • चार postinstall hooks patch-package चलाते हैं
    • इनमें से एक patch file पर git update-index --skip-worktree लागू करता है ताकि वह git status में छिपी रहे
    • loader operators/3.png file के अंत में जुड़े hidden chunk को पढ़ता है
    • वह custom wAsm chunk के छोटे 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_psk generate की जाती है
    • उसके बाद का 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 manipulation
    • dns: दिए गए 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.js anchor 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 होते हैं

बाद में दिखे 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 करना, और अमेरिकी ग्राहकों को निशाना बनाने वाला .cc domain—ये सब साथ दिखे
    • दूर स्थित संगठन की विश्वसनीयता सत्यापित करना और कठिन हो गया
  • अकेले-अकेले संकेत निर्णायक नहीं थे, लेकिन कई yellow flags मिलकर red flag जैसी स्थिति बनाते थे

हमले के पीछे कौन और इसका दायरा

  • हमले के पीछे किसका हाथ था, यह निश्चित रूप से नहीं कहा जा सकता
  • हमला डेवलपर्स को target करता था और इसमें नकली पहचान, विश्वसनीय cover story, कई fake websites, धैर्यपूर्वक की गई scheduling, और परिष्कृत git traps शामिल थे
  • यह 2026 में कई actors द्वारा इस्तेमाल किए जा रहे “fake interview scam” pattern से मेल खाता है
  • Reddit की Rust community में भी इसी तरह target किए जाने का एक मामला बताया गया
  • यही तरीका अगर Rust repository में trap build.rs script के रूप में बना होता, तो लेखक भी फंस सकता था, क्योंकि यह डेवलपर workflow के बहुत करीब फिट किया गया था

1 टिप्पणियां

 
GN⁺ 5 시간 전
Lobste.rs की राय
  • शीर्षक में यह अनुमान लगाना कि यह nation-state-backed attacker हो सकता है, भ्रमित करने वाला है। इसमें ऐसा कुछ नहीं दिखता जिसके लिए उस स्तर की तैयारी या जटिलता जरूरी हो
    संभावना की कल्पना की जा सकती है, लेकिन यह बाकी scenarios जितना ही plausible लगता है

    • शायद इसलिए कि ऐसे sophisticated scams काफी rare होते हैं, क्योंकि इनमें बहुत resources लगते हैं। कोई sophisticated scam दिखे तो यह महसूस होना आसान है कि शायद इसके पीछे कोई nation-state हो
      फिर भी, यह लगभग निश्चित रूप से 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 के बारे में जानकर थोड़ा डर लगा

    • सच में डरावना है। उस लेख पर Lobsters discussion का link भी है
  • पिछले हफ्ते Lua Ventures के D____ S_____ से बिल्कुल इसी तरह का interview offer मिला था। ज्यादातर recruiter spam की तरह इसे ignore कर दिया, और अच्छा किया

    • सोच रहा हूं कि क्या यह Rust से जुड़ा व्यक्ति है। Rust community के प्रमुख लोग Lua के target बने हैं, लेकिन जानना चाहता हूं कि यह सिर्फ Rust तक सीमित है या ज्यादा व्यापक है
  • कुछ दिन या कुछ हफ्ते पहले शायद ऐसी कोई submission आई थी

  • “यह असली email जैसा दिखा” वाली बात हैरान करने वाली है। यह इतना साफ़ तौर पर LLM-generated text था कि मुझे लगता है दूसरी sentence से ही शक हो जाता

    • मुझे यह इतना obvious नहीं लगा। बस LinkedIn-style writing जैसा लगा। वह भी अक्सर LLM ने लिखा हो ऐसा सुनाई देता है, लेकिन smell इतनी मिलती-जुलती है कि मुझे नहीं पता कि मैं दोनों में फर्क कर सकता हूं या नहीं