پرش به محتوای اصلی
پرش به محتوای مقاله

کلاهبرداری PinpinRAT: نفوذ به سیستم برنامه‌نویسان از طریق مصاحبه‌های جعلی

·۶ تیر ۱۴۰۵۸ دقیقه مطالعه
آناتومی یک حمله ناموفق (دولت-ملت؟)
آناتومی یک حمله ناموفق (دولت-ملت؟)
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

استفاده از `patch-package` برای مخفی کردن بدافزار در لایه‌هایی که توسط `git status` نادیده گرفته می‌شوند، یک تاکتیک جدید برای دور زدن نظارت برنامه‌نویسان است.

تصور کنید یک فرآیند استخدام حرفه‌ای، در واقع پوششی برای یکی از پیچیده‌ترین حملات سایبری باشد. در ۲۷ ژوئن ۲۰۲۶، کمپینی آغاز شد که با ترکیب مهندسی اجتماعی دقیق و فریب فنی، ماشین‌های برنامه‌نویسان را هدف قرار داد تا دسترسی کامل به سیستم‌های آن‌ها پیدا کند. در مرکز این حمله، یک تروجان دسترسی از راه دور (RAT) به نام PinpinRAT قرار دارد که به‌جای استفاده از لینک‌های مشکوک رایج، از یک کلاهبرداری شغلی بسیار دقیق استفاده می‌کند تا اعتماد هدف را جلب نموده و سیستم را به تسخیر درآورد.

این حمله در زمانی رخ می‌دهد که طعمه‌های «مصاحبه جعلی» در سال ۲۰۲۶ به یک روند تکراری برای بازیگران تهدید تبدیل شده‌اند. برنامه‌نویسان اهدافی باارزش هستند، زیرا آن‌ها نه تنها به کدهای حساس دسترسی دارند، بلکه دارای دسترسی‌های مدیریتی (Administrative privileges) روی ماشین‌های خود هستند و می‌توانند به محیط‌های حساس تولید (Production environments) نفوذ کنند. این رویکرد یادآور حملات هدفمندی است که برخی بازیگران دولتی کره شمالی نیز برای نفوذ به توسعه‌دهندگان هوش مصنوعی به کار گرفتند تا به زیرساخت‌های حساس دسترسی یابند. مهاجمان در این مورد فقط یک ایمیل اسپم ساده نفرستادند؛ آن‌ها یک اکوسیستم کامل از شخصیت‌های جعلی و شرکت‌های متوقف‌شده ساختند تا زنجیره‌ای از اعتماد ایجاد کنند. حتی برخی از اعضای جامعه Rust در پلتفرم ردیت گزارش داده‌اند که هدف کمپین‌های مشابهی بوده‌اند که از همین الگوهای پیچیده بهره می‌برد.

طبق گزارش وب‌سایت grack.com، کلاهبرداری با ایمیلی از یک شخصیت ساختگی آغاز شد که ادعا می‌کرد نماینده Lua Ventures است؛ یک شرکت سرمایه‌گذاری خطرپذیر (VC) متوقف‌شده در سنگاپور که پیش‌تر در حوزه مالی غیرمتمرکز (DeFi) فعالیت می‌کرد. برای کسب اعتبار بیشتر، مهاجم یک پروفایل لینکدین بسیار حرفه‌ای ارائه داد و نام شرکت‌های نوپایی مانند Lyrasing و Roadpay را آورد تا درخواست خود را به‌عنوان یک نقش مشاوره قانونی و معتبر جلوه دهد. هر دو شرکت مذکور وب‌سایت‌های ساده‌ای داشتند (مانند سایت roadpay.cc) که باعث می‌شد آن‌ها شبیه استارت‌آپ‌های مراحل اولیه به نظر برسند، نه کلاهبرداری‌های آشکار و ساختگی.

همان‌طور که در تحلیل‌های قبلی ما درباره‌ی امنیت مدل‌های بازمتن و زنجیره تأمین نرم‌افزار اشاره کردیم، اعتماد به منابع خارجی در محیط توسعه، بزرگ‌ترین نقطه ضعف امنیتی است.

تله استخدامی

طعمه، یک فرآیند مصاحبه فنی استاندارد و باورپذیر بود. پس از یک تماس صوتی کوتاه با مردی که لهجه آلمانی داشت و ادعا می‌کرد در حال سفر است (که این موضوع کیفیت پایین صدا را توجیه می‌کرد)، یک پروژه «تستی» برای قربانی ارسال شد. این مخزن کد (Repository) با موضوع یک اپلیکیشن خرید بلیط کشتی به نام Ticket Harbor طراحی شده بود. دستورالعمل‌های ارسالی شامل فایلی به نام task.txt بود که مجموعه‌ای از وظایف فنی باورپذیر اما خسته‌کننده را تعریف می‌کرد تا برنامه‌نویس را درگیر جزئیات پروژه کند.

تله اصلی در دستور نهایی نهفته بود: «قبل از ارسال، دستورات typecheck، مجموعه تست و دستورات بیلد دسکتاپ/سرور مربوطه را اجرا کنید». این требоه خاص و فنی تضمین می‌کرد که برنامه‌نویس، اسکریپت‌های مخرب چرخه حیات (Lifecycle scripts) را مستقیماً روی سخت‌افزار شخصی خود اجرا کند.

آناتومی یک حمله ناموفق (دولت-ملت؟)

محموله فنی

خطر واقعی در وابستگی‌های (Dependencies) پروژه نهفته بود. مهاجمان از یک زنجیره پیچیده برای اجرای بدافزار استفاده کردند:

  • سوءاستفاده از Patch-Package: این مخزن از ابزار patch-package استفاده می‌کرد. در حالی که فایل package.json اصلی فاقد قلاب‌های (Hooks) مشکوک مانند postinstall یا preinstall بود، سطح خطر در دایرکتوری‌های patches/ قرار داشت. مهاجمان حجم زیادی از فایل‌های مزاحم و «نویز» مانند sumchecker+3.0.1.patch و @electron+get+2.0.3.patch و extract-zip+2.0.1.patch را اضافه کردند تا محموله واقعی در میان این فایل‌ها پنهان بماند.
  • فریب Git: یک قلاب پس از نصب (postinstall hook)، دستور git update-index --skip-worktree را روی فایل‌های پچ اجرا می‌کرد. این ترفند باعث می‌شود تغییرات مخرب در خروجی دستور git status نمایش داده نشوند و در نتیجه کدبیس در بررسی‌های سریع کاربر، کاملاً پاک و بدون تغییر به نظر برسد.
  • قطعه اجرای بدافزار: بدافزار اصلی در فایل typescript+5.9.2.patch جاسازی شده بود. این کد یک قطعه مبهم‌سازی شده (Obfuscation stub) را به صورت یک بلوک base64 خوداجرا در ابتدای هر دو فایل _tsc.js و typescript.js تزریق می‌کرد.

آناتومی یک حمله ناموفق (دولت-ملت؟)

این قطعه از مکانیزم خاصی برای دور زدن شناسایی استفاده می‌کند: ابتدا یک رشته base64 را رمزگشایی کرده، سپس هر بایت را با استفاده از کلید 73 به روش XOR رمزگشایی می‌کند و در نهایت نتیجه را از طریق new Function(...) اجرا می‌کند. استفاده از new Function به‌جای eval احتمالاً با هدف دور زدن محرک‌های رایج شناسایی بدافزار (Malware detection triggers) انجام شده است. این کد با رشته ticket-harbor-tsc-shim-anchor و شناسه 12ff4b51 مهار شده است تا تضمین شود لحظه‌ای که برنامه‌نویس دستور npm run typecheck یا هر دستور بیلد یا ایمپورتی را که typescript.js را فراخوانی می‌کند اجرا کند، محموله فعال شود.

مبهم‌سازی چندلایه

این ابزار نفوذ (Dropper) فقط یک اسکریپت ساده را اجرا نمی‌کرد، بلکه از یک خط لوله چندمرحله‌ای برای فرار از شناسایی استفاده می‌کرد. قطعه اولیه، یک تکه پنهان را که به انتهای یک فایل تصویری به نام operators/3.png چسبانده شده بود، می‌خواند. این عملیات یک قطعه سفارشی WebAssembly (WASM) را که در یک بخش wAsm قرار دارد فعال می‌کند، که سپس یک پردازش Node جداگانه و بی‌صدا (Detached process) ایجاد می‌کند.

آناتومی یک حمله ناموفق (دولت-ملت؟)

این پردازش، محموله مرحله دوم را با حجم ۱.۶۸ مگابایت تحویل می‌داد. برای شکست دادن تحلیلگران امنیتی، مهاجمان تروجان را در سه لایه مبهم‌سازی پیچیدند: دو لایه base64 و یک لایه از ابزار obfuscator.io؛ ابزاری که صراحتاً ادعا می‌کند در برابر تحلیل‌های مبتنی بر هوش مصنوعی (LLM-based analysis) محافظت می‌کند تا مدل‌های زبانی نتوانند کد را به راحتی تحلیل کنند.

آناتومی یک حمله ناموفق (دولت-ملت؟)

برای پاک کردن کامل ردپای خود، بدافزار در سه سطح عملیات پاکسازی را انجام می‌دهد: اول از طریق ترفند skip-worktree در گیت، دوم اینکه Dropper پس از اولین اجرا، پچ را بازنویسی می‌کند تا خطوط تزریقی خود را حذف کند، و سوم اینکه دایرکتوری موقت مربوط به مرحله دوم بلافاصله پس از اجرا، خود را حذف می‌کند.

قابلیت‌های PinpinRAT

پس از فعال شدن، PinpinRAT یک خط ارتباطی امن با سرور فرمان و کنترل (C2) در آدرس 89.124.107.161:80 برقرار می‌کند. این بدافزار یک جفت کلید RSA-2048 و یک کلید نشست تصادفی AES-256 (به نام aes_psk) ایجاد می‌کند. تمام ترافیک بعدی با استفاده از AES-256-CBC و تگ یکپارچگی HMAC-SHA256 رمزگذاری می‌شود تا ترافیک شبکه شناسایی نشود.

در هنگام راه‌اندازی، یک روتین بررسی (Checkin) را برای جمع‌آوری اثر انگشت میزبان اجرا می‌کند که شامل موارد زیر است:

  • آدرس IP اصلی (با بررسی تمام اینترفیس‌های غیرداخلی)
  • نام کاربری از طریق os.userInfo().username و نام میزبان (Hostname)
  • نوع سیستم‌عامل، نسخه (Release)، پلتفرم و معماری پردازنده
  • شناسه پردازش (PID) و آرگومان‌های کامل process.argv
  • نسخه Node.js نصب شده

آناتومی یک حمله ناموفق (دولت-ملت؟)

این تروجان از طیف گسترده‌ای از دستورات مخرب پشتیبانی می‌کند:

  • env: استخراج و ارسال تمام متغیرهای محیطی سیستم (JSON.stringify(process.env)).
  • upload/download: خواندن مسیرهای دلخواه فایل برای سرقت داده‌ها یا نوشتن بایت‌های ارسالی مهاجم در هر مسیر قابل دسترسی.
  • spawn: اجرای هر پردازش دلخواه در سیستم با قابلیت گسترش شل (Shell expansion).
  • ls / cd / pwd / cp / mv: فراهم کردن ابزارهای پایه سیستم فایل برای پیمایش، جابه‌جایی و دستکاری فایل‌ها.
  • dns: وادار کردن میزبان به резоلو کردن نام‌های دلخواه از طریق یک رِزولور مشخص، که احتمالاً برای ایجاد تونل DNS (DNS tunneling) استفاده می‌شود.
  • dismantle: اجرای روتین حذف خودکار برای پاک کردن کامل RAT از میزبان.

نشانه‌های شناسایی (IoCs)

برای کسانی که در حال بازرسی سیستم‌های خود هستند، نشانه‌های زیر مرتبط با PinpinRAT است:

  • سرور C2: 89.124.107.161:80
  • تسک زمان‌بندی شده ویندوز (Scheduled Task): PinpinWrappedJs
  • پردازش استتار شده در macOS: com.apple.WebKit.Networking
  • متغیرهای محیطی: NODT_PAYLOAD_PATH و NODT_PAYLOAD_ARGS
  • گارد تداوم (Persistence Guard): متغیر PINPIN_NO_AUTOSTART=1 (که از اجرای کرون‌جاب mutex.js جلوگیری می‌کند)
  • دایرکتوری‌های اثر (Artifacts): مسیرهای .cache-<randomhex>/ در پوشه ~/Library/Caches/runtime-cache/ برای مک، /tmp/ برای لینوکس، و %TEMP%\ برای ویندوز، که حاوی فایل‌های payload.js و mutex.js هستند.

نقش هوش مصنوعی در دفاع

نکته قابل توجه این است که قربانی از Claude برای تحلیل مخزن کد استفاده کرد. در حالی که مهاجم از مبهم‌سازی برای متوقف کردن مدل‌های زبانی استفاده کرده بود، این هوش مصنوعی موفق شد لایه‌های متعدد تروجان را در حدود ۵ دقیقه مهندسی معکوس کند — بسیار سریع‌تر از آنچه یک تحلیلگر انسانی می‌توانست انجام دهد. این توانمندی تحلیل در برابر تلاش‌های مهندسی معکوس، در حالی است که برخی سازمان‌ها حتی از مدل‌های کلود برای اهداف صنعتی استفاده کرده‌اند، همان‌طور که در پرونده اتهامات آنتروپیک علیه علی‌بابا مشاهده شد. این نشان‌دهنده تغییری در جنگ تسلیحاتی است: مهاجمان از AI برای ساخت طعمه‌های متقاعدکننده استفاده می‌کنند، اما مدافعان از مدل‌های زبانی برای شتاب بخشیدن به تحلیل بدافزارها بهره می‌برند.

تحلیل نشانه‌های خطر

با نگاه به عقب، چندین «پرچم زرد» وجود داشت که باید هشدار می‌داد:

  • سرنخ‌های زبانی: ایمیل‌ها حاوی تکیه‌کلام‌های ظریفی در متن بودند که نشان می‌داد توسط مدل‌های زبانی تولید شده‌اند.
  • تناقض در پروفایل: پروفایل لینکدین شامل رشته‌ای بی‌معنی و اغراق‌آمیز از مدارک تحصیلی بود («BSc(Hons), MA (Dist), PGDipFM, CEng») و هیچ فعالیت واقعی یا تعاملی نداشت.
  • حضور وب: وب‌سایتی که لینک شده بود، تاریخچه‌ای داشت که در نوامبر ۲۰۲۵ تغییر کرده بود و پست‌های توخالی و مبهمی را در ستایش شرکت‌های نامعلوم منتشر کرده بود.
  • تناقض‌های عملیاتی: این «سرمایه‌گذار» هرگز دعوت‌نامه رسمی تقویم (Calendar invite) نفرستاد و فقط زمان Google Meet را اعلام کرد. دوربین تماس‌گیرنده خاموش بود و جغرافیا کاملاً متناقض بود: یک صندوق سنگاپوری که با ساعت CEST فعالیت می‌کرد، برنامه‌نویسی کانادایی را هدف قرار داده بود در حالی که از دامنه‌های .cc برای مشتریان آمریکایی استفاده می‌کرد.

این حادثه واقعیت تلخی را برای جامعه Rust و TypeScript روشن می‌کند. اگر این پروژه یک پروژه Rust با اسکریپت build.rs آلوده بود، احتمال موفقیت حمله حتی بیشتر می‌شد، زیرا این اسکریپت‌ها اغلب در طول فرآیند بیلد به‌طور کورکورانه مورد اعتماد قرار می‌گیرند.

برای توسعه‌دهندگان، درس این است که نشانه‌های فنی اکنون در کنار هم یک «پرچم قرمز» می‌سازند. هوشیاری دیگر فقط مربوط به شناسایی لینک‌های بد نیست؛ بلکه درباره زیر سؤال بردن کل بستر حرفه‌ای یک درخواست است. برای محافظت از محیط خود، هرگز کدهای ناشناس مربوط به تست‌های استخدامی را روی ماشین اصلی اجرا نکنید. همیشه از یک Sandbox یک‌بار مصرف یا ماشین مجازی (VM) برای بررسی مخازن شخص ثالث استفاده کنید، به‌ویژه مخازنی که نیاز به نصب وابستگی‌ها دارند.

گام بعدی شما

  • هرگز کدهای ناشناس مربوط به تست‌های استخدامی را روی ماشین اصلی خود اجرا نکنید.
  • برای بررسی مخازن شخص ثالث، حتماً از یک Sandbox یک‌بار مصرف یا ماشین مجازی (VM) استفاده کنید.
  • در صورت مشاهده تناقض در مدارک تحصیلی یا تاریخچه وب‌سایت استخدام‌کننده، سریعاً ارتباط را قطع کنید.

اما داستان سخت‌افزاری این تحول حتی شگفت‌انگیزتر است — به تحلیل ما درباره‌ی تراشه‌های Blackwell مراجعه کنید.

چرا این موضوع مهم است؟

این حمله نشان می‌دهد که اعتماد به زنجیره تأمین (Supply Chain) در محیط توسعه، حتی با وجود ابزارهای امنیتی، همچنان آسیب‌پذیر است. اعتبار این گزارش بر اساس تحلیل عملیاتی یک مورد واقعی است که نشان می‌دهد مهندسی اجتماعی اکنون با دقت فنی در سطح سازمانی ادغام شده است.

تأثیر برای ایران

برنامه‌نویسان ایرانی که در پروژه‌های Remote بین‌المللی فعال هستند، به‌ویژه در حوزه DeFi و Web3، باید نسبت به مصاحبه‌های شغلی که درخواست اجرای کد روی سیستم شخصی را دارند، به‌شدت هشدار دهند.

·نگاه ما
تحریریه دات‌هوش

ترکیب مبهم‌سازی‌های سخت‌افزاری مانند WASM با مهندسی اجتماعی سطح بالا، نشان می‌دهد که مهاجمان دیگر به دنبال نقاط ضعف نرم‌افزاری ساده نیستند، بلکه روی «اعتماد حرفه‌ای» شرط‌بندی می‌کنند. نکته کلیدی این است که سرعت تحلیل بدافزار توسط LLMها، برتری زمانی را به مدافعان بازگردانده است و توازن قدرت را از مهاجم به تحلیلگر تغییر می‌دهد.

منابع

این گزارش با خط‌لولهٔ خودکار دات‌هوش از منابع معتبر جهانی تدوین و زیر نظر تحریریه منتشر شده است. روش کار ما

گفتگو

پنج‌شنبه‌های هوش‌محور

بسته‌ی هفتگی دات‌هوش

۵ خبر، ۲ ابزار، ۱ پرامپت در هر شماره. به‌زودی راه‌اندازی می‌شود — هر پنج‌شنبه صبح.

خبر کلیدی
ابزار کاربردی
پرامپت حرفه‌ای
تحلیل پژوهش
به‌زودی
زاویه‌ی ایرانی
به‌زودی
تمرین این هفته
به‌زودی

راهنماهای دات‌هوش

راهنماهای کاربردیِ دات‌هوش برای کار با هوش مصنوعی — از همین‌جا شروع کنید:

دات‌هوش

راهنمای فارسی هوش مصنوعی — با نگاه به ایران

اخبار روزانه، معرفی ابزارها و مدل‌ها، و آموزشِ کار با هوش مصنوعی؛ همیشه با این پرسش که از ایران چه چیزی کار می‌کند و چه چیزی نه.