SentinelLabs Don’t Call Us, We’ll Call Your APIs | TraderTraitor Backdoors Resurface on Victim With No Crypto Ties

سوءاستفاده TraderTraitor از Terraform برای نصب backdoorهای macOS

خلاصه اجرایی

  • در پی افشای حمله 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
Interview task from a GitHub repository containing a weaponized .terraform.lock.hcl file
وظیفه مصاحبه از یک مخزن GitHub که شامل یک فایل .terraform.lock.hcl مسلح‌شده است

این مخزن‌ها در پروژه کدنویسی خود یک فایل .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 را از فایل قفل اصلی پروژه حذف کرده است، که ممکن است نشان دهد گمان کرده بود مصاحبه‌کننده در حال سنجش میزان آگاهی امنیتی او است.

Weaponized .terraform.lock.hcl file using a typosquatted provider domain in the weaponized GitHub repository
فایل .terraform.lock.hcl مسلح‌سازی‌شده با استفاده از دامنه provider تایپواسکوات‌شده در مخزن GitHub مسلح‌سازی‌شده

بر اساس گزارش 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 استفاده می‌کند.

فایل plist مورد استفاده برای ماندگاری، <IDENTIFIER> و <EXECUTABLE_PATH> در زمان اجرا درج می‌شوند
فایل plist مورد استفاده برای ماندگاری، و در زمان اجرا درج می‌شوند

بدافزار 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 — پیکربندی زمان اجرا را اعمال و در فایل پیکربندی ماندگار می‌کند. به اپراتور اجازه می‌دهد پس از استقرار، مقصد C2/transport را تغییر دهد.
sleep فرمان sleep [-r] — به مدت N ثانیه می‌خوابد یا با گزینهٔ -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 . گزینهٔ add فایل ‏~/Library/LaunchAgents/.plist را نصب می‌کند (جعلِ Chrome-renderer، ‏RunAtLoad)؛ گزینهٔ remove آن را حذف می‌کند؛ گزینهٔ check وضعیت Is enabled: را گزارش می‌دهد.
update فرمان update — یک باینری جدید دانلود می‌کند و خود را به‌روزرسانی می‌کند.
destroy modules/recovery.rs خودنابودگری — ماندگاری، پیکربندی و باینری را حذف نصب می‌کند (با توکن تأیید yes محافظت می‌شود).

اجرا

فرمان گرداننده توضیح / نکات قابل توجه
run handlers/run.rs فرمان run [background] — یک برنامهٔ دلخواه را اجرا می‌کند (بومی، posix_spawnp/execvp) و خروجی را بازمی‌گرداند؛ از حالت پس‌زمینه پشتیبانی می‌کند (وظیفهٔ طولانی‌مدت که از طریق tasks رهگیری می‌شود).
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 با ارجاع به دامنه ارائه‌دهنده سلاح‌سازی‌شده

مطالب مرتبط

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

انتخاب مسیریاب

برای مسیریابی یکی از اپلیکیشن های زیر را انتخاب کنید.