خلاصه اجرایی
- در پی افشای حمله TraderTraitor علیه LayerZero در آوریل 2026، شرکت SentinelOne یک قربانی دیگر را با همان درِ پشتیهای macOS شناسایی کرد.
- تحلیل ما سازوکار این درِ پشتیها و گسترش هدفگیری علیه یک قربانی در بخش خدمات IT را که هیچ ارتباطی با معاملات رمزارز نداشت بررسی میکند.
- همچنین مخازن GitHub بیشتری را که در چارچوب طرحهای مهندسی اجتماعیِ بهکاررفته برای هدفگیری جویندگان کار در این کارزارها سلاحسازی شده بودند شناسایی کردیم.
- این گزارش تشریح میکند که فایلهای قفل Terraform چگونه تحویل بدافزار را از رجیستریهای سفارشیِ Terraform provider که تحت کنترل مهاجمان است امکانپذیر میسازد.
نمای کلی
در سراسر سال 2026، زیرگروهِ TraderTraitor از گروه Lazarus که با حمایت دولت DPRK و با انگیزه مالی فعالیت میکند، کارزارهایی را علیه نهادهای درگیر در معاملات رمزارز اجرا کرده است؛ از جمله حملهای پر سر و صدا که در آوریل افشا شد و طی آن از طریق بهخطرانداختن LayerZero، 292 میلیون دلار آمریکا از KelpDAO سرقت شد.
پروتکل KelpDAO یک راهکار مالی غیرمتمرکز (DeFi) است که از استیکِ مجددِ Ethereum پشتیبانی میکند؛ LayerZero خدماتی با قابلیت تبادل رمزارز میان پلتفرمهای مختلف بلاکچین ارائه میدهد.
زیرگروهِ TraderTraitor به LayerZero نفوذ کرد و روشهایی برای ایجاد یک رویداد ساختگیِ ضربِ رمزارز تعیین کرد؛ مهاجم این روش را با یک حمله DDoS علیه سرورهای اعتبارسنجی ترکیب کرد تا سرورهای بهخطرافتاده یک رویداد ضربِ نامعتبر را تأیید کنند و این امر به سرقت گسترده انجامید.
در پی افشای عمومی این رخنه، شرکت SentinelOne یک قربانی دیگرِ آلوده به درِ پشتیهای macOS، FLATROOF (معروف به macOS.Gaslight) و ROOFDECK، که نخستینبار در حمله به LayerZero مشاهده شدند، شناسایی کرد.
برخلاف قربانی پر سر و صدای پیشین، این هدف یک سازمان بسیار کوچکتر در صنعت خدمات IT بود. بررسی ما نشان داد هنگامی که این عامل تهدید یک سازمان کوچکتر را به مخاطره میاندازد چه رخ میدهد؛ به باور ما، در نهایت ارزش حاصل برای حفظ تداوم این نفوذ کافی نبوده است.
پروژههای کدنویسی Terraform مسلحشده
هر کارزار مرتبط با این موج فعالیت از مهندسی اجتماعی از طریق طعمههای مصاحبه شغلی جعلی بهره میبرد، یک رویکرد Contagious Interview سنتی که در میان بازیگران DPRK رایج است. مهاجم با جویندگان کاری از شرکتی که در نهایت دچار نقض امنیتی میشود تماس برقرار میکند؛ پروفایل GitHub هر جوینده کار هدفگرفتهای که شناسایی کردیم در حوزه پروژههای مهندسی DevOps یا رمزارز/FinTech قرار میگیرد.
تمهای مخزن GitHub برای طعمههای پروژه کدنویسی بهصورت پروژههای مهندسی زیرساخت طراحی شدهاند که به شرکتی مربوط میشوند که بازیگران DPRK خود را بهجای آن جا میزنند. با نقطه شروع قرار دادن مخزن gtn-candidate-repo که توسط LayerZero در گزارش رویدادشان بهاشتراک گذاشته شد، طعمههای بیشتری شناسایی کردیم که شامل ارجاع به شرکتهای Northwind و Novacart بود.
مشخص نیست که اینها شرکتهای ساختگیِ مورد استفاده مهاجم تهدید بودند یا اینکه خود را بهجای تیمهای جذب نیرو از شرکتهای واقعی با این نامها جا زده بودند؛ یک نمونه Northwind آن را بهعنوان یک شرکت تجارت الکترونیک توصیف میکند که قرار است بهزودی راهاندازی شود. سایر نامهای مخزنی که شناسایی کردیم عبارتاند از:
- Northwind-IAC
- novacart-interview
- terraform-candidate-repo

این مخزنها در پروژه کدنویسی خود یک فایل .terraform.lock.hcl مسلحشده دارند که یک provider سفارشی در آن به دامنهای اشاره میکند که تحت کنترل مهاجم است. در چندین مخزن سه دامنه مخرب برای provider شناسایی کردیم:
registry.hashicorp-aws[.]com registry.hashicorp-aws[.]io registry.hashicorp-terraform[.]io
هنگامی که قربانی terraform init را با فایل قفل مسلحشده اجرا میکند، Terraform آن provider سفارشی را منبع معتبر تلقی میکند و در نتیجه Terraform ماژولهای مخربِ provider را دانلود و اجرا میکند.
آگاهی توسعهدهنده میتواند در برابر این نوع حمله اصطکاک ایجاد کند؛ در یکی از مخزنها، داوطلبِ در حال مصاحبه یادداشتی افزوده است که میگوید یک provider typosquatted را از فایل قفل اصلی پروژه حذف کرده است، که ممکن است نشان دهد گمان کرده بود مصاحبهکننده در حال سنجش میزان آگاهی امنیتی او است.

بر اساس گزارش LayerZero، مهاجمان backdoorهای macOS با نام FLATROOF و ROOFDECK را پس از آنکه یکی از کارکنان یک پروژه کدنویسی مصاحبهای مسلحسازیشده را روی ایستگاهکاری شرکت نصب کرد، مستقر کردند. گروه TraderTraitor از این backdoorها برای جمعآوری کلیدهای API از سازمان و برای ارتقای سطح دسترسی بهمنظور گسترش به محیطهای Amazon Web Services و Google Cloud Platform قربانی استفاده کرد.
هرچند درباره بسیاری از آلودگیهای بعدی ناشی از مخازن GitHub که یافتیم بینش نداریم، شرکت SentinelOne با جستوجو در تلمتری خود برای backdoorهای macOS مشاهدهشده در حمله LayerZero، یک قربانی نامرتبط را شناسایی کرد.
قربانی دیگر
قربانی
سازمان آسیبدیده یک ارائهدهنده خدمات IT مستقر در هند و بیارتباط با رمزارز است. یک اندپوینت درگیر بود: یک Apple Silicon MacBook متعلق به یک مهندس DevOps. این مهندس در بیشتر روزهای کاری Terraform و Ansible را علیه AWS، OVH و OpenStack اجرا میکرد و این دستگاه اعتبارنامههای ابری و دسترسی کنترل نسخه را در خود داشت؛ مشابه «Developer1» شرکت LayerZero. افرادی که پروفایل شبکههای اجتماعیِ آنها فعالیت زیرساخت یا DevOps را تبلیغ میکند، نامزد این نوع حمله هستند و ارزش هدف همان چیزی است که لپتاپ آنها به آن دسترسی دارد.
جدول زمانی آلودگی
بر اساس تلمتری ما روی این میزبان، هر دو backdoor دستکم از 2026-03-18 روی دیسک وجود داشتند، بنابراین نمیتوانیم نحوه تحویل آنها را اثبات کنیم. آنها تا 2026-03-29 غیرفعال ماندند و سپس بیکنینگ و فعالیت میزبان آغاز شد.
| برچسب زمانی (UTC) | فعالیت | جزئیات / شواهد |
| 2026-03-18 | حضور FLATROOF + ROOFDECK | بر اساس دادههای تلمتری، هشهای FLATROOF و ROOFDECK روی ماشین قربانی پیدا شد. |
| 2026-03-25 to 2026-03-28 | فاز نهفته | محیط Cursor در استفاده روزانه فعال بود. هیچ فعالیت مخربی مشاهده نشد. |
| 2026-03-29 05:00:41 | باز شدن Workspace | توسعهدهنده مسیر ~/DevOps-Automation/cloudshield را در Cursor باز میکند. |
| 2026-03-29 05:00:46 | راهاندازی شلها | ترمینال یکپارچه Cursor شلهای لاگین را راهاندازی میکند (zsh -l) + فرآیندهای Node. |
| 2026-03-29 05:00:53 | نخستین اجرای مشاهدهشده | برنامه Cursor هر دو ایمپلنت را اجرا میکند: nohup …/SystemUpdate –type=renderer و nohup …/iSync –type=renderer. |
| 2026-03-29 05:00:55 | اتصال C2 | برای SystemUpdate => technicais (176[.]97.114.232)، برای iSync => hubpage (45[.]11.59.140)، Telegram در 05:00:58. |
| 2026-03-29 05:00:58 | مسلحسازی مجدد ایمپلنت | اجرای xattr -rd com.apple.quarantine + chmod +x روی iSync (GatekeeperBypass). |
| 2026-03-30 to 2026-04-19 | بیکنینگ پایدار | وابسته به نشستهای Cursor؛ FLATROOF/ROOFDECK تنها هنگام اجرای Cursor بیکنینگ دارند (وقتی Cursor خاموش است، ساکت هستند). |
| 2026-04-13 | طعمه GitHub | توسعهدهنده مخزن terraform-candidate-repo را از طریق GitHub Desktop کلون میکند. |
| 2026-04-14 18:25 | مسلحسازی مجدد ایمپلنت | ابزار FLATROOF، ROOFDECK را دوباره مسلح میکند (حذف مجدد quarantine، chmod +x). |
| 2026-04-20 08:48:59 | آمادهسازی مرحله 3 | ابزار ROOFDECK مرحله بعدی را از 85[.]137.56.10 آماده میکند و مولفه loginwindow مرحله 3 را بازیابی میکند (یک روز پس از بیانیه عمومی LayerZero). |
| 2026-04-20 08:49:38 | اتصال C2 مرحله 3 | فرآیند loginwindow آنلاین => grenight[.]com (85[.]137.56.245). |
| 2026-04-20 13:15:11 | ضد-فورِنزیک | فرآیند loginwindow هر دو ایمپلنت اصلی را حذف میکند (rm -f). |
| 2026-05-03 to 2026-06-01 | ازسرگیری مرحله 3 | loginwindow به بیکنینگ به grenight[.]com (85[.]137.56.245) ادامه میدهد. |
| 2026-06-01 06:08 | آخرین C2 مشاهدهشده | آخرین بیکنینگ loginwindow به grenight[.]com در تلمتری جمعآوریشده. |
ایمپلنتها نخستینبار توسط Cursor در تاریخ 29 مارس، چند ثانیه پس از باز شدن فضای کاری cloudshield اجرا شدند.
| برچسب زمانی (UTC) | نوع فعالیت | جزئیات |
| 2026-03-29 05:00:41 | ایجاد فرایند | Cursor Helper (node)، اولین ارجاع به فضای کاری cloudshield |
| 2026-03-29 05:00:45 | ایجاد فایل | ~/.cursor/projects/…-cloudshield/terminals/1.txt (ترمینال یکپارچه) |
| 2026-03-29 05:00:46 | ایجاد فرایند | bash –init-file …/shellIntegration-bash.sh |
| 2026-03-29 05:00:47 | ایجاد فرایند | zsh -l (شِل لاگین => فایلهای ~/.zshrc/.zprofile را بارگذاری میکند) |
| 2026-03-29 05:00:53 | ایجاد فرایند | Cursor (والد launchd) => nohup …/com.apple.iTunesCloud/SystemUpdate –type=renderer |
| 2026-03-29 05:00:53 | ایجاد فرایند | Cursor (والد launchd) => nohup …/com.apple.internal.ck/iSync –type=renderer |
بدافزارهای macOS
دو خانواده بدافزار در این نفوذ مستقر شدند که با نمونههایی که در حمله LayerZero توصیف شدهاند یکسان هستند و با نامهای FLATROOF و ROOFDECK (توسط LayerZero و Mandiant) شناخته میشوند. هر دو درِ پشتی ARM64 برای macOS هستند که با Rust نوشته شدهاند.
FLATROOF
مشاهده کردیم که درِ پشتی FLATROOF با نام SystemUpdate در مسیر ~/Library/com.apple.iTunesCloud/SystemUpdate مستقر شده است. احتمالاً برای جمعآوری اولیه داده از دستگاه قربانی و استقرار پیلودهای ثانویه در نظر گرفته شده است.
FLATROOF بلافاصله پس از شروع، با حذف صفت com.apple.quarantine از ROOFDECK، Gatekeeper را دور میزند و بیت اجرایی آن را فعال میکند؛ ایمپلنت دوم بدون بررسی امضا و بدون اعلان به کاربر اجرا میشود.
xattr -rd com.apple.quarantine .../com.apple.internal.ck/iSync chmod +x .../com.apple.internal.ck/iSync
تحلیل تفصیلی FLATROOF (معروف به macOS.Gaslight) توسط SentinelLABS در ژوئن 2026 منتشر شد. در اینجا، خلاصهای کوتاه از قابلیتهای این درِ پشتی را بنا بر دستورات C2 پشتیبانیشده آن ارائه میکنیم:
| دستور | کارکرد |
| help | نمایش راهنمای دستور |
| id | شناسایی ایمپلنت برای اپراتور |
| shell | اجرای یک دستور شِل از طریق execvp، با posix_spawnp بهعنوان مسیر جایگزین برای اجرا در دسترس است |
| kill | خاتمه دادن به فرایند هدف بر اساس PID |
| upload | خارجسازی یک فایل از طریق سازوکار پیوست فایل در Telegram |
| stop | توقف اجرای ایمپلنت |
این بکدور یک ماژول Python برای گردآوری داده نیز به همراه دارد که برای جمعآوری دادههای زیر و استخراج و انتقال آنها از طریق Telegram با استفاده از یک توکن بات داخلی Telegram به کار میرود:
- دادههای مرورگرهای Chrome، Brave، Firefox و Safari
- تاریخچۀ دستورات Terminal
- فهرست نرمافزارهای نصبشده
- نمای لحظهای از فرایندهای در حال اجرا از طریق ps aux
- پروفایل سختافزاری و نرمافزاری سیستم از طریق
system_profiler - یک کپی خام از
login.keychain-db
ROOFDECK
ROOFDECK بهعنوان یک بکدور پیشرفتهتر با قابلیتهای گستردهتر شناسایی و جابهجایی جانبی عمل میکند. مشاهده کردهایم که با نام iSync در ~/Library/com.apple.internal.ck/iSync قرار داده میشود.
از طراحی این ایمپلنت روشن است که برای استفاده بهعنوان یک استقرار ثانویه پس از تثبیت جای پای اولیه و کنترل در نظر گرفته شده است، زیرا برای نخستین اتصال به سرور C2 به یک فایل پیکربندی از پیش موجود نیاز دارد که دستکم یک کلید عمومی Nostr متعلق به پروفایل تحت کنترل مهاجم را در خود داشته باشد.
ROOFDECK از یک فایل پیکربندی محلی ~/.config/.repl_history برای ذخیرۀ URLها و کلیدهای C2 و نیز تعیین رفتار beaconing استفاده میکند.
| فیلد | نوع | معنا |
| server_url | string | URL C2 حلشده یا overrideشده (تا زمانی که از طریق dead-drop تعیین شود، خالی است) |
| connection_type | string http|ws | گزینۀ انتقال (HTTPS روی /app_version در برابر WebSocket بهسبک pipe-airway) |
| nostr_public_keys | array of strings | کلید(های) عمومی هویت Nostr گرداننده که برای جستوجوی dead-drop استفاده میشود |
| recovery_url | string | نقطۀ جایگزین/بازیابی (برای راهاندازی اولیه در صورت از دست رفتن C2 اصلی) |
| pastebin_key | string | کلید/شناسه paste برای dead-drop بهسبک Pastebin (حلکنندۀ ثانویه) |
| rsa_private_key | string | کلید خصوصی RSA تعبیهشده در ایجنت |
| config_path_macos | string | override مسیر نسبی برای محل پیکربندی روی macOS |
| interval | integer (seconds) | فاصلۀ زمانی beacon/poll |
در نخستین اجرا، رلههای زنده Nostr را از api.nostr[.]watch/v1/online دریافت میکند و آنها را با یک فهرست رله هاردکد متعلق به سرویسهای مشروع Nostr ترکیب میکند، سپس بر اساس کلید عمومی پروفایلی که در فایل پیکربندی nostr_public_keys داده شده است، در این رلهها بهدنبال پروفایل گرداننده در شبکۀ Nostr جستوجو میکند. پس از یافتن، فیلد website پروفایل را میخواند و آن را بهعنوان URL سرور C2 به کار میگیرد. گروه TraderTraitor پیشتر از Nostr استفاده کرده است.
فهرست زیر شامل relayهای Nostr است که برای کشف پروفایل اپراتور استفاده میشوند:
wss://relay.damus[.]io wss://nos[.]lol wss://nostr[.]mom wss://relay.snort[.]social wss://offchain[.]pub wss://relay.nostr[.]band wss://nostr.oxtr[.]dev wss://nostr[.]wine
ماندگاری از طریق یک ورودی plist به نشانی ~/Library/LaunchAgents/loginwindow.plist بهدست آمده است، با یک رشتهٔ شناسهٔ برنامه که بهصورت پویا تعیین میشود. برای آنکه فرایند ایمپلنت مشروع بهنظر برسد، از پارامتر hardcoded شدهٔ --type=renderer استفاده میکند.

بدافزار ROOFDECK مجموعهٔ گستردهای از فرمانهای C2 را برای مدیریت ایمپلنت، اجرای شناسایی، استخراج داده و اجرای کد مهاجم پشتیبانی میکند. نقطهٔ پایانی C2 بهصورت hardcoded برابر /app_version است. واکشی دورهای فرمانها از طریق HTTPS و با یک گواهی TLS پینشدهٔ سفارشی که داخل ایمپلنت جاسازی شده انجام میشود؛ نمونهٔ آن در ادامه آمده است.
جالب آنکه نویسندهٔ بدافزار تنظیمات پیشفرض فراداده را با mkcert استفاده کرده است که افشا میکند وی در یک VM مبتنی بر QEMU روی Linux با نام کاربری ub در حال اجرا است. چندین دامنه را شناسایی کردیم که از گواهیای با این مقدار CN در گواهی استفاده میکردند (فهرست آنها در بخش Indicators of Compromise آمده است).
Subject = Issuer (self-signed):
O = mkcert development CA
OU = ub@ub-Standard-PC-Q35-ICH9-2009
CN = mkcert ub@ub-Standard-PC-Q35-ICH9-2009
Serial: 1CD6D13FF15ADBF7A42025D10EC99B4A
Key: RSA 3072-bit
Validity: 2025-06-20 11:06:53 UTC -> 2035-06-20 11:06:53 UTC (10-year mkcert default)
فرمانهای ROOFDECK با کلید خصوصی اپراتور امضا میشوند و پیش از اجرا با استفاده از یک کلید عمومی جاسازیشده، صحت آنها راستیآزمایی میشود. قابلیتهای فرمانها در کد منبع به handlerهای مجزا تفکیک شدهاند. ایمپلنت بسیاری از فرمانهای رایج shell مرتبط با عملیات پوشه و فایل را بازپیادهسازی میکند؛ تاکتیکی دیگر که در مجموعهابزارهای پیشرفتهتر همسو با کرهٔ شمالی نیز بهکار میرود، از جمله LightlessCan متعلق به Lazarus.
نشست و کنترل
| فرمان | گرداننده | توضیح / نکات قابل توجه |
| session | — | چرخهٔ عمر نشست C2 را مدیریت میکند (ثبت ایجنت/کلیددهی، اتصال، حلقهٔ وظیفهدهی). |
| config | modules/config.rs | فرمان config |
| sleep | — | فرمان sleep [-r] |
| tasks | modules/task.rs | تسکهای پسزمینه (اجرای مداوم فرمانها) را مدیریت میکند، آنها را فهرست میکند و لغو میکند. وضعیتهای تسک: PENDING/RUNNING/COMPLETED/FAILED/DOWNLOADING/UPLOADING. |
| app_version | — | فرمان app_version فرمانهای امضاشده و رمزگذاریشده را از endpoint HTTPS /app_version دریافت میکند؛ پیش از آنکه یک EncryptedCommand به AgentCommand رمزگشایی شود با RSA-2048 اعتبارسنجی میشود. هم بهعنوان بررسی نسخه/بهروزرسانی عمل میکند و هم یک کانال پشتیبان برای وظیفهدهی است. |
| persist | — | فرمان persist |
| update | — | فرمان update |
| destroy | modules/recovery.rs | خودنابودگری — ماندگاری، پیکربندی و باینری را حذف نصب میکند (با توکن تأیید yes محافظت میشود). |
اجرا
| فرمان | گرداننده | توضیح / نکات قابل توجه |
| run | handlers/run.rs | فرمان run |
| shell | handlers/shell.rs | یک شل تعاملی از طریق یک PTY (openpty) که بر بستر انتقال C2 استریم میشود. |
| rssh | handlers/rssh.rs | شل معکوس — یک شل معکوس دارای حالت بهسمت اپراتور را آغاز یا متوقف میکند. |
| kill | handlers/kill.rs | فرآیندی را بر اساس PID خاتمه میدهد. |
فایلسیستم / داده
| فرمان | گرداننده | توضیح / نکات قابل توجه |
| cd / pwd | — | تغییر / نمایش دایرکتوری کاری ایجنت. |
| ls | handlers/ls.rs | فهرست دایرکتوری (نامها، اندازهها، برچسبهای زمانی، مجوزها). |
| find | handlers/find.rs | جستوجوی بازگشتی فایل ذیل یک ریشهٔ src بر اساس الگو و بازگرداندن فایلهای منطبق؛ برای یافتن دادههای ارزشمند (کیفپولها، کلیدها، اسناد) بهمنظور برونبرد داده استفاده میشود. |
| cat / tail | handlers/tail.rs | خواندن کامل فایل / نمایش انتهای فایل با tail (مثلاً لاگها). |
| stat | — | نمایش فرادادهٔ فایل (اندازه، mode، مالک، برچسبهای زمانی). |
| cp / mv / rm | — | کپی کردن فایلها (copyfile/fclonefileat) / جابهجایی (rename) / حذف (unlink). |
| mkdir / mkfile | — | ایجاد دایرکتوری / ایجاد (نوشتن) فایل — برای رهاسازی پیلودها یا نوشتن دادهٔ مرحلهبندیشده استفاده میشود. |
| chmod / chown | — | تغییر مجوزها / مالکیت فایل (chmod/chown). |
| zip / unzip | — | ایجاد/استخراج آرشیوها از جمله zipهای رمزگذاریشده با AES (نسخه 4.3.0 از zip، zipcrypto/aes.rs). برای آمادهسازی بستههای برونبردِ رمزگذاریشده یا بازکردن آرشیوهای دانلودشده استفاده میشود (برای نمونه، پیلودهای مرحلهٔ بعد). |
انتقال
| فرمان | رسیدگیکننده | توضیح / عناصر قابل توجه |
| upload | handlers/upload.rs | یک فایل محلی را به C2 خارجسازی میکند. |
| wget | handlers/wget.rs | فایلی را از یک URL روی دیسک دانلود میکند (reqwest)؛ تحویل مرحلهٔ دوم/ابزار. |
شناسایی / نظارت
| فرمان | رسیدگیکننده | توضیح / عناصر قابل توجه |
| info | handlers/info.rs | اثر انگشت تجمیعی میزبان: OS/version، hostname/user (whoami)، شناسههای سختافزاری (IOKit)، موقعیت جغرافیایی بر اساس IP (api.myip.com). |
| whoami / uname / uptime / lscpu | — | کاربر فعلی / OS+kernel (uname) / مدت کارکرد سیستم (uptime) / اطلاعات CPU (host_processor_info). |
| df | handlers/df.rs | مصرف دیسک/ولوم و فایلسیستمهای سوارشده (getfsstat، CFURL volume keys). |
| ps | handlers/ps.rs | فهرست پردازهها (proc_listallpids/proc_pidinfo/proc_pid_rusage). |
| clipboard | — | کلیپبورد macOS را میخواند و مینویسد (NSPasteboardTypeString). میتواند رازهای کپیشده را ضبط کند (گذرواژهها، عبارات بازیابی، 2FA) و محتوا را جایگذاری کند (برای نمونه، جایگزینی یک آدرس رمزارزِ کپیشده). |
| screenshot | — | هنوز پیادهسازی نشده است. رسیدگیکننده این پیام را برمیگرداند: “Screenshot command is not implemented yet.” |
تمام فرمانهای C2 در سمت سرور با یک کلید خصوصی که تحت کنترل مهاجم است امضا میشوند. کلید عمومی در payload مربوط به ROOFDECK گنجانده شده و پیش از اجرای فرمانها برای راستیآزمایی مبدأ و یکپارچگی فرمانهای صادرشده استفاده میشود.
-----BEGIN RSA PUBLIC KEY----- MIIBCgKCAQEAzan/EObUVxXNfPHdkDyCVR0AC9apleciK9ZQw+neWo6q+wvAhnLp Pe7FZLomuwntUgI3afLDblgw9t19Kh7w/8CVwFncxh4PdqtdYno4teQ6fDLKXSWa ZBG7zZ9R22jxPpiY70XKilXJuds34q7pfzVfbLvLTmTWyTtcyrOnRSCOwEHP/gHX 0gX+8sdX7go6O37WwzB4zNvThS+E7hG+fVfrgEaH7IUi3RY9esuBS50UomfYefO3 dK1aDMDWIwVj1skacPR9LazEc6PSGjSXxzI/N2xcpP9QKXn/Pk6r9fBzudhBL3Mw vWyNi03JbZGtGFiy6Wai6heJqgY7pF1PAQIDAQAB -----END RSA PUBLIC KEY-----
نسخهای دیگر از ROOFDECK
در 20 آوریل، یک روز پس از نخستین اعلام عمومی شرکت LayerZero دربارهٔ رخداد KelpDAO، مهاجمان نسخهٔ جدیدی از ROOFDECK را روی ماشین بهخطرافتاده استقرار دادند (SHA-1: 5728b11d30586bbfc1d8bd12df1c722a06e767a2، مسیر ~/Library/com.apple.appleaccountd/loginwindow) بهصورت یک فایل اجرایی با نام loginwindow.
پس از آنکه نسخهٔ جدید مقداردهی اولیه شد و ارسال beacon را آغاز کرد، مهاجمان از آن برای حذف باینریهای قدیمی ROOFDECK و FLATROOF استفاده کردند. این ROOFDECK جدید از نظر کارکردی با نسخهٔ قبلی یکسان بود، اما نمادها و اطلاعات اشکالزدایی از آن برداشته شده بود؛ اقدامی که احتمالاً با هدف مؤثرتر دورزدن شناسایی انجام شده است. نمیتوانیم جز حدس و گمان بگوییم که آیا این اقدامی در واکنش به انتشار LayerZero بوده است یا نه، با این حال زمانبندی آن قابل توجه است.
پس از بهروزرسانی، تا 1 ژوئن فعالیت بیکنزدن بهصورت مقطعی به یک سرور C2 جدید با نام grenight[.]com مشاهده کردیم. در 17 ژوئن، باینری loginwindow به سطل زباله منتقل شد.
جمعبندی
بازیگران همسو با DPRK مانند TraderTraitor بهطور جدی بر هدفگیری توسعهدهندگان برای تثبیت جای پا در شبکه متمرکز شدهاند و هرچه بیشتر از طریق مصاحبههای شغلی جعلی اقدام میکنند. رویدادی که بررسی کردیم نشان میدهد که هر سازمانی که به آن نفوذ میکنند لزوماً به هدف مناسب برای سرقت گسترده رمزارز تبدیل نمیشود.
اقدامات این گروهها برای دسترسی اولیه شامل هدفگیری طرفهای ثالث و زنجیره تأمین نرمافزار آنها است؛ جایی که بخش زیادی از سطح مواجهه صنعت به آنجا منتقل شده است و نقطه پایانی توسعهدهنده را در مرکز دفاع قرار میدهد. نقطههای پایانی مورد استفاده برای توسعه به منابع cloud، pipelineها و کد منبع دسترسی دارند؛ در نتیجه نظارت و حفاظت از آنها برای سازمانها اولویت بالایی دارد. این کمپینها از محیطهای توسعه اختصاصیِ طراحیشده برای این منظور که هر بار یک مهندس را هدف میگیرد، همراه با buildهای Terraform آلوده به درپشتی که برای هر قربانی متفاوت است، استفاده میکنند.
توصیهها
برای سازمانها:
- توصیه میشود مهندسانی که مجوزهای cloud engineering و دسترسی به کنترل نسخه دارند، بهعنوان یک گروه حساس برای پایش امنیت نقطه پایانی علامتگذاری شوند.
- برای باینریهای بدون امضا که از دایرکتوری home اجرا میشوند، فرایندهای فرزند محیط یکپارچه توسعه (IDE) که اجزای امضاشده IDE بهشمار نمیآیند، و ترافیک خروجی TLS از هر یک از آنها جستوجو کنید.
- گزارشهای مربوط به تکالیف خانگی مصاحبه و مخازن ناخواسته از سوی این کاربران نیز ارزش پیگیری دارند، زیرا صرفِ تلمتری نشان نخواهد داد که یک کارشناس جذب آن را ارسال کرده است.
- به سیاستی سازمانی بیندیشید که استفاده از ایستگاههای کاری سازمان برای مصاحبههای شغلی بیرونی را منع میکند و درباره چگونگی اعمال این نوع سیاست تصمیم بگیرید.
- آموزش توسعهدهندگانی که دسترسیهای حساس دارند حیاتی است؛ دامنه provider مربوط به Terraform که سلاحسازی شده بود، توسط یک جویای کار حذف شد که دامنه typosquatted را مشکوک علامتگذاری کرده بود. سازمانها باید به برنامههای آموزش آگاهی امنیتی خود محتوایی بیفزایند تا ریسکهای استفاده از پروژههایی با منشأ نامعلوم و نیز ماهیت هدفگیری کارکنان توسط بازیگران تهدید برای به خطر انداختن سازمان برجسته شود.
برای توسعهدهندگان:
- پیش از اجرای پروژهٔ کدی که شامل فایل
.terraform.lock.hclاست، اطمینان حاصل کنید رجیستریِ ارائهدهنده به دامنههای معتبر و شناختهشده تعلق دارد؛ هرآنچه نامفضای شناختهشدهای ذیلregistry.terraform.io، دامنهٔ رسمیِ رجیستریِ ارائهدهنده، نباشد باید مشکوک تلقی شود. - بستههای مخرب ممکن است روی دامنهٔ رسمی رجیستریِ ارائهدهنده نیز میزبانی شوند؛ بنابراین هنگام استفاده از فایل قفلِ همراه، بررسی منبع همهٔ بستهها اهمیت دارد. رجیستریِ رسمیِ رجیستری در Terraform مرورِ ماژولها و ارائهدهندهها را پشتیبانی میکند، و هر ماژول پیوندی به کد منبع خود دارد.
این گزارش همزمان با ارائهای در LABScon 2026، با ما تماس نگیرید، ما APIهای شما را فراخوانی میکنیم: کالبدشکافیِ یک نفوذ چندابریِ در حال گسترشِ DPRK منتشر میشود. شرکت SentinelOne از Google و Mandiant بابت مشارکت در ارائهٔ جزئیات فنی دربارهٔ ابزارها و تکنیکهای این عامل تهدید سپاسگزاری میکند، و از Nick Simonian نیز برای همکاری در این پژوهش قدردانی میکند.
شاخصهای سازش
IoCها (قربانیِ دیگر)
| نوع | IOC | توضیح |
| SHA1 | 02df07a173ab03b82a4fb6a08973fff8b1467f28 | FLATROOF (SystemUpdate) |
| SHA1 | c491d477dbe0ae04e9aed9dbe237144c03f73ec4 | ROOFDECK (iSync) |
| SHA1 | 5728b11d30586bbfc1d8bd12df1c722a06e767a2 | ROOFDECK بدون نماد (loginwindow) |
| Domain | technicais.sytes[.]net | C2 مربوط به FLATROOF |
| Domain | storage.hubpage[.]cloud | C2 مربوط به ROOFDECK |
| Domain | grenight[.]com | C2 مربوط به ROOFDECK |
| IP | 176.97.114[.]232 | C2 مربوط به FLATROOF (technicais.sytes[.]net) |
| IP | 45.11.59[.]140 | C2 مربوط به ROOFDECK (storage.hubpage[.]cloud) |
| IP | 85.137.56[.]245 | C2 مربوط به ROOFDECK (grenight[.]com) |
| IP | 85.137.56[.]10 | سرور staging مربوط به ROOFDECK |
| Path | ~/Library/com.apple.iTunesCloud/SystemUpdate | مسیر فایل باینریِ FLATROOF |
| Path | ~/Library/com.apple.internal.ck/iSync | مسیر فایل باینریِ ROOFDECK |
| Path | ~/Library/com.apple.appleaccountd/loginwindow | مسیر فایل باینریِ ROOFDECK بدون نماد |
| File | /private/tmp/.pipe-airway | لولهٔ IPC مربوط به ROOFDECK |
| File | $TMPDIR/tmp*.lock | فایل قفلِ FLATROOF |
| Workspace | ~/DevOps-Automation/cloudshield | مسیر فضای کاریِ مخرب |
گواهی سفارشی مورد استفاده برای ارتباط TLS
| نوع | مقدار |
| SHA-256 | 4b2d3e8ccce8920a6d01e7d02b84236545a20e5f754b3eec253f8b416b731daa |
| SHA-1 | 4ad92bf92ee614b05c340ce17bef7b6ef5a25e82 |
| Serial | 1cd6d13ff15adbf7a42025d10ec99b4a |
| Subject/Issuer | O=mkcert development CA, OU=ub@ub-Standard-PC-Q35-ICH9-2009, CN=mkcert ub@ub-Standard-PC-Q35-ICH9-2009 |
| Validity | 2025-06-20 → 2035-06-20 |
شاخصهای نفوذ میزبان – ROOFDECK
| نوع | مقدار |
| ماندگاری | ~/Library/LaunchAgents/*.plist (پیشوند برچسب com.، ProgramArguments شامل –type=renderer، RunAtLoad=true) |
| فایل پیکربندی | $HOME/.config/.repl_history |
شاخصهای نفوذ شبکه – ROOFDECK
| نوع | مقدار |
| نقطه پایانی دریافت دستور از طریق HTTPS | /app_version (نام میزبان در زمان اجرا تعیین میشود) |
دامنههای گواهی مرتبط با کاربر «ub»
| 185-66-91-112.cprapid[.]com |
| 213-111-146-132.cprapid[.]com |
| anesthesiaschool[.]com |
| app.heyhay[.]online |
| dela.servehttp[.]com |
| galaxy-royal[.]online |
| game.galaxy-royal[.]online |
| grenight[.]com |
| heyhay[.]online |
| mactroubleshoots[.]pro |
| mx01.galaxy-royal[.]online |
| ns4.galaxy-royal[.]online |
| storage.hubpage[.]cloud |
| tinklify[.]com |
| update.heyhay[.]online |
| vaimage[.]com |
| wss.sytes[.]net |
| www.anesthesiaschool[.]com |
| www.freehealth[.]lat |
| www.heyhay[.]online |
| www.mactroubleshoots[.]pro |
| www.tinklify[.]com |
مخازن چالش کدنویسی
ارائهدهنده hashicorp-aws[.]com:
| https://github.com/exubient0/terraform-candidate-repo/blob/main/.terraform.lock.hcl | فایل قفل Terraform سلاحسازیشده |
| https://github.com/radupopa369/gtn-candidate-repo/blob/feat/three-tier-infrastructure/live/.terraform.lock.hcl | فایل قفل Terraform سلاحسازیشده |
ارائهدهنده hashicorp-aws[.]io:
| https://github.com/chainstacker/Northwind-IAC/blob/930e5be6d34511bedbfb0d762bd08fffe64e9630/aws/us-east-1/prod/northwind/global/vpc/.terraform.lock.hcl | فایل قفل Terraform سلاحسازیشده |
| https://github.com/RyanLRay/Technical-Assessments/blob/19af09ebe8b7ad03419677dda515507dd099bc39/README.md?plain=1#L175 | فایل README با ارجاع به دامنه ارائهدهنده سلاحسازیشده |
ارائهدهنده hashicorp-terraform[.]io:
| https://github.com/Steed-LHV/assessment | فایل README با ارجاع به دامنه ارائهدهنده سلاحسازیشده |






