تصور کنید یک فرآیند استخدام حرفهای، در واقع پوششی برای یکی از پیچیدهترین حملات سایبری باشد. در ۲۷ ژوئن ۲۰۲۶، کمپینی آغاز شد که با ترکیب مهندسی اجتماعی دقیق و فریب فنی، ماشینهای برنامهنویسان را هدف قرار داد تا دسترسی کامل به سیستمهای آنها پیدا کند. در مرکز این حمله، یک تروجان دسترسی از راه دور (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 مراجعه کنید.




گفتگو