محققای Palo Alto Networks گزارشی در خصوص یک بدافزار موبایلی با نام LANDFALL منتشر کردن، که کاربران برخی از مدلهای گوشی های سامسونگ رو هدف قرار میده. با توجه به اینکه برخی از کاربران ایرانی هم هدف این حمله بودن، این گزارش رو بصورت کامل در سایت قرار دادم.
خلاصه اجرایی:
محققای Palo Alto Networks موفق به شناسایی یک خانواده جدید و ناشناخته از جاسوس افزارهای اندرویدی با نام LANDFALL شدن. مهاجمان برای تحویل این جاسوس افزار، از یک آسیب پذیری زیرودی (CVE-2025-21042) در کتابخانه پردازش تصویر اندروید سامسونگ سوء استفاده کردن.
این نقص امنیتی تنها یک مورد مجزا نیست، بلکه بخشی از یک الگوی گستردهتر از مشکلات مشابه است، که در چندین پلتفرم موبایل مشاهده شده. این آسیبپذیری پیش از انتشار اصلاحیه امنیتی سامسونگ در آوریل ۲۰۲۵، در حملات واقعی مورد اکسپلویت قرار گرفته بود. با وجود این، اکسپلویت مربوطه و جاسوس افزار تجاری مرتبط با اون تا پیش از این گزارش، بصورت عمومی افشا یا تحلیل نشده بودن.
LANDFALL در فایلهای تصویری مخرب با فرمت DNG تعبیه شده و به نظر میرسه از طریق واتساپ ارسال میشدن. این روش بسیار شبیه به زنجیره حملهای است که در آگوست ۲۰۲۵ با هدف قرار دادن، اپل و واتساپ انجام شده بود. همچنین شباهتهایی با زنجیره حمله دیگه ای داره که از یک آسیبپذیری زیرودی مشابه (CVE-2025-21043) در سپتامبر استفاده میکرد. محققین، هیچ آسیبپذیری ناشناختهای در خودِ واتساپ شناسایی نکردن.
نکته مهم اینِ که یافته های محققین قبل از افشای رسمی آسیبپذیریها انجام شده. کمپین LANDFALL از اواسط سال ۲۰۲۴ فعال بوده و از این آسیبپذیری زیرودی سامسونگ (CVE-2025-21042)، ماهها قبل از اصلاحیه امنیتی، استفاده میکردن.
این آسیبپذیری از آوریل ۲۰۲۵ اصلاح شده و کاربران فعلی سامسونگ در معرض خطر نیستن. همچنین، در سپتامبر ۲۰۲۵ سامسونگ یک آسیبپذیری زیرودی دیگه (CVE-2025-21043) در همان کتابخانه پردازش تصویر رو اصلاح کرده تا از حملات مشابه جلوگیری بشه.
تحقیقات محققین نگاهی به دوره اکسپلویت قبل از اصلاح داره و دیدی کم نظیر نسبت به یک عملیات جاسوس افزاری پیشرفته فراهم میکنه که تاکنون بصورت عمومی گزارش نشده بود.
یافته های کلیدی:
- LANDFALL یک جاسوس افزار اندرویدی است که بطور خاص برای دستگاههای Samsung Galaxy طراحی شده و در حملات هدفمند در خاورمیانه استفاده شده.
- این جاسوس افزار قادر به نظارت گسترده شامل: ضبط صدا از میکروفون، ردیابی موقعیت مکانی، جمع آوری تصاویر، مخاطبین و گزارش تماسها هستش.
- فایلهای DNG مخرب که از آسیبپذیری بحرانی زیرودی CVE-2025-21042 در کتابخانه پردازش تصویر سامسونگ سوء استفاده میکردن، برای تحویل بدافزار استفاده شدن.
- زنجیره اکسپلویت احتمالا از حملات بدون تعامل کاربر (Zero-Click) و از طریق تصاویر مخرب استفاده کرده، مشابه زنجیرههای حمله اخیر در iOS و دستگاههای سامسونگ.
- زیرساخت و الگوهای عملیات LANDFALL شباهت زیادی با عملیات جاسوس افزاری تجاری در خاورمیانه داره و احتمالا به بازیگران تهاجمی بخش خصوصی (PSOA) مرتبط است.
- LANDFALL برای ماهها فعال و ناشناخته باقی مانده بود.
کشف جاسوسافزار LANDFALL
در اواسط سال ۲۰۲۵ و پس از افشای عمومی زنجیره اکسپلویتی که دستگاههای iOS رو هدف قرار میداد، محققا در جستجوی نمونههایی از اون اکسپلویت بودن. این جستجو در نهایت منجر به کشف جاسوس افزار اندرویدی جدیدی شد که اون رو LANDFALL نامگذاری کردن.
بطور مشخص، محققا چندین نمونه از فایلهای تصویری DNG رو شناسایی کردن که حاوی جاسوس افزار اندرویدی بوده و در یک زنجیره اکسپلویت برای دستگاههای Samsung Galaxy استفاده شدن. آنالیز محققا تأیید کرده که این نمونهها از آسیبپذیری CVE-2025-21042 برای انتقال LANDFALL سوء استفاده میکنن.
آغاز شکار: زنجیره اکسپلویت iOS و نقطه شروع تحقیق
در آگوست ۲۰۲۵، شرکت اپل برای محصولات خودش بروزرسانیهای امنیتی منتشر کرد تا آسیبپذیری CVE-2025-43300 رو اصلاح کنه. این آسیب پذیری در پردازش تصاویر DNG بود که گفته میشه در حملات واقعی مورد اکسپلویت قرار گرفته بود.
در همان ماه، واتساپ هم آسیبپذیری زیرودی دیگه ای رو با شناسه CVE-2025-55177 اصلاح کرد که در زنجیرهای با نقص پردازش تصویر اپل ترکیب شده و در حملات پیچیدهای علیه دستگاههای iOS استفاده میشد. این آسیبپذیری در واتساپ به مهاجمان اجازه میداد دستگاه قربانی رو مجبور کنن تا محتوای ارسال شده از آدرسهای URL دلخواه رو پردازش کنه.
با ترکیب این دو آسیبپذیری، مهاجمان میتونستن کد مخرب رو بدون نیاز به تعامل کاربر (Zero-Click RCE) از طریق تصاویر مخرب که از طریق واتساپ ارسال میشد، اجرا کنن.
به دنبال افشای عمومی این زنجیره حمله و در نبود نمونههای اکسپلویت عمومی، محققا فرایند شکار تهدید (Threat Hunt) رو شروع کردن. در جریان این جستجو، چندین فایل DNG آلوده با جاسوس افزار اندرویدی رو کشف کردن که از سال ۲۰۲۴ تا اوایل ۲۰۲۵ در VirusTotal آپلود شده بودن.
با توجه به نام فایلها (برای مثال:WhatsApp Image 2025-02-10 at 4.54.17 PM.jpeg و IMG-20240723-WA0000.jpg)، مهاجمان احتمالا این فایلها رو از طریق واتساپ ارسال کردن. بررسی محققا از جاسوس افزار قرار گرفته در این تصاویرT نشان میده که این بدافزار بصورت ویژه برای دستگاههای Samsung Galaxy طراحی شده.
فایلهای DNG مخرب:روند جدید در بردارهای حمله
آنالیز جاسوسافزار LANDFALL از زمانی شروع شد که متوجه شدن فایلهای DNG مخرب وجود دارن.
فرمت DNG (Digital Negative) یک فرمت خام تصویری است که بر پایه فرمت TIFF توسعه یافته. در نمونههایی که شناسایی کردن، در انتهای فایل DNG یک آرشیو ZIP جاسازی شده وجود داشت. شکل زیر، یکی از این نمونهها رو درون یک ویرایشگر هگز (Hex Editor) نشان میده که محل شروع داده های ZIP رو در انتهای فایل مشخص میکنه.

آنالیز محققا نشان میده که این فایلهای DNG از CVE-2025-21042 سوءاستفاده میکنن. یک آسیبپذیری در کتابخانه پردازش تصویر سامسونگ libimagecodec.quram.so که سامسونگ در آوریل ۲۰۲۵ اون رو اصلاح کرد.
اکسپلویت با استخراج فایلهای کتابخانه اشتراکی (so) از آرشیو ZIP قرار داده شده در فایل DNG، اقدام به اجرای جاسوس افزار LANDFALL میکنه. شکل زیر، روند اجرای این جاسوس افزار رو نشان میده.

جدول زیر نمونههای فایلهای تصویری DNG کشف شده توسط محققین رو نشان میده. (هش های SHA256 برای نمایش بهتر )
| SHA256 Hash | نام فایل | اولین مشاهده |
| 9297888746158e38d320b05b27b0032b2cc29231be8990d87bc46f1e06456f93 | WhatsApp Image 2025-02-10 at 4.54.17 PM.jpeg | Feb. 10, 2025
22 بهمن 1403 |
| b06dec10e8ad0005ebb9da24204c96cb2e297bd8d418bc1c8983d066c0997756 | IMG-20250120-WA0005.jpg | Jan. 20, 2025
1 بهمن 1403 |
| c0f30c2a2d6f95b57128e78dc0b7180e69315057e62809de1926b75f86516b2e | WhatsApp Image 2024-08-27 at 11.48.40 AM.jpeg | Aug. 27, 2024
6 شهریور 1403 |
| b975b499baa3119ac5c2b3379306d4e50b9610e9bba3e56de7dfd3927a96032d | PHOTO-2024-08-27-11-48-41.jpg | Aug. 27, 2024 |
| 29882a3c426273a7302e852aa77662e168b6d44dcebfca53757e29a9cdf02483 | IMG-20240723-WA0001.jpg | July 23, 2024
2 مرداد 1403 |
| b45817ffb0355badcc89f2d7d48eecf00ebdf2b966ac986514f9d971f6c57d18 | IMG-20240723-WA0000.jpg | July 23, 2024 |
نام فایلهایی که شامل رشتههایی مثل WhatsApp Image و WA000 هستن، دلالت بر این موضوع داره که مهاجمان ممکنِ تلاش کرده باشن تا جاسوسافزار رو از طریق واتساپ تحویل داده باشن. این موضوع با گزارشهای عمومی قبلی درباره اکسپلویتهای مبتنی بر فایلهای DNG، از طریق واتساپ که دستگاههای اپل رو هدف قرار داده بودن، همخوانی داره. علاوه بر این، محققایِ واتساپ، یک آسیبپذیری DNG مشابه با شناسه CVE-2025-21043 رو هم به سامسونگ گزارش کردن.
تحویل LANDFALL: زنجیره اکسپلویت برای بدافزارهای موبایل
معمولا توزیع بدافزارهای موبایل از طریق اکسپلویتها نیازمند زنجیرهای از آسیبپذیریهای مختلف برای موفقیت آمیز بودن آلودگی است. مطالعات متعددی مواردی رو مستند کرده که حداقل از دو آسیبپذیری برای توزیع جاسوس افزار استفاده شده، اما زنجیره های اکسپلویت مدرن برای جاسوس افزار بسیار پیچیده تر هستن و چندین آسیبپذیری رو به هم، زنجیر میکنن تا کنترل دستگاههای موبایل رو در دست بگیرن و امتیازات لازم رو بدست بیارن. تاکنون محققا هیچ اکسپلویت دیگه ای مرتبط با این فعالیت پیدا نکردن.
آنالیز جاسوسافزار LANDFALL
LANDFALL یک جاسوس افزار اندرویدی ماژولار است که بطور مشخص برای دستگاههای Samsung Galaxy طراحی شده و احتمالا در فعالیتهای نفوذ هدفمند در منطقه خاورمیانه بکار رفته. این بدافزار ماژولار برای عملیات جاسوسی و استخراج داده ساخته شده.
زنجیرهی آلودگی LANDFALL شامل یک اکسپلویت برای CVE-2025-21042 هستش، آسیبپذیری در کتابخانه پردازش تصویر سامسونگ که توسط فروشنده با شناسه SVE-2024-1969 مشخص میشه. محققا معتقدن که یک زنجیره حمله کامل، احتمالا با الگوی اجرای کد از راه دور و بدون تعامل کاربر و با تحویل تصاویر DNG مخرب شروع میشه.
دو مؤلفه از جاسوسافزار LANDFALL درون فایلهای DNG مخرب جاسازی شدن که پس از اکسپلویت موفق، استخراج و اجرا میشن:
- لودر (b.so): یک ELF shared object برای ARM64 به حجم حدود ۱۰۶ کیلوبایت (stripped و بصورت داینامیک لینک شده) که بعنوان بکدور اصلی عمل میکنه.
- دستکاری کننده سیاست SELinux (l.so): از یک باینری ELF فشرده شده با XZ، استخراج میشه. این مؤلفه برای دستکاری سیاست SELinux دستگاه، طراحی شده تا مجوزهای ارتقایافته به LANDFALL بده و به پایداری و پرسیست اون کمک کنه. (در ضمیمه 1، مورد بررسی قرار گرفته.)
جدول زیر فایلهای مؤلفه LANDFALL که در نمونه های مخرب DNG قرار داده شده بودن رو نشان میده.
| SHA256 Hash | مولفه یLANDFALL | اولین مشاهده |
| ffeeb0356abb56c5084756a5ab0a39002832403bca5290bb6d794d14b642ffe2 | b.so component | July 23, 2024
2 مرداد 1403 |
| d2fafc7100f33a11089e98b660a85bd479eab761b137cca83b1f6d19629dd3b0 | b.so component | Aug. 27, 2024
6 شهریور 1403 |
| a62a2400bf93ed84ebadf22b441924f904d3fcda7d1507ba309a4b1801d44495 | b.so component | Jan. 23, 2025
4 بهمن 1403 |
| 384f073d3d51e0f2e1586b6050af62de886ff448735d963dfc026580096d81bd | b.so component | Feb. 10, 2025
22 بهمن 1403 |
| 211311468f3673f005031d5f77d4d716e80cbf3c1f0bb1f148f2200920513261 | XZ compressed file (l) for the SELinux policy manipulator | July 23, 2024
2 مرداد 1403 |
| 69cf56ac6f3888efa7a1306977f431fd1edb369a5fd4591ce37b72b7e01955ee | SELinux policy manipulator (l.so) extracted from XZ compressed file | July 23, 2024
2 مرداد 1403 |
آنالیز محققا نشان میده که LANDFALL یک جاسوسافزار با چندین مولفه است که برای نظارت و استخراج داده طراحی شده. تمرکز آنالیز محققا روی مؤلفه b.so هستش که بعنوان لودر اولیه برای چارچوب گستردهتر LANDFALL عمل میکنه. در شواهد دیباگ مربوط به این مؤلفه، خودش رو با عنوان “Bridge Head” معرفی کرده، نکتهای که در بررسی احتمالی روابط بین LANDFALL و گروههای جاسوسافزاری شناخته شده اهمیت خواهد داشت.
قابلیت های بالقوه LANDFALL
مؤلفه b.so شامل رشتههای دیباگ و وضعیت متعددی است که نشان میده منطق کامل بسیاری از اونا در خود b.so وجود نداره. این موضوع نشان میده b.so احتمالا مؤلفههای اضافی رو برای فعالسازی این قابلیتها دانلود میکنه. تحلیل رشتههای دستوری و مسیرهای اجرایی تعبیه شده در b.so نشان دهنده قابلیتهای گستردهتر LANDFALL است، از جمله:
شناسایی دستگاه:
- نسخه سیستمعامل
- شناسه سختافزاری (IMEI)
- شناسه سیمکارت/مشترک (IMSI)
- شناسه سریال سیمکارت
- اکانتهای کاربری
- شماره صندوق صوتی (Voicemail)
- پیکربندی شبکه
- لیست برنامههای نصبشده
- دسترسی به سرویسهای موقعیت یابی
- وضعیت VPN
- وضعیت USB debugging
- بلوتوث
استخراج دادهها:
- ضبط میکروفون
- ضبط تماسها
- تاریخچه تماسها
- دیتابیس مخاطبین
- دادههای پیامک/پیامرسان
- عکسهای دوربین
- فایلهای دلخواه
- دیتابیس های روی دستگاه (مثلا تاریخچه مرورگر)
اجرا، لوود و پایداری:
- لوود ماژولهای بومی (so)
- لوود و اجرای فایلهای DEX از حافظه و دیسک
- تزریق به فرایندها
- اجرا از طریق LD_PRELOAD
- اجرای دستورات دلخواه
- دستکاری SELinux
- پرسیست
- تغییر سیاست SELinux از طریق باینری فشرده شده
- نظارت روی فولدر رسانه واتساپ برای دریافت پیلودهای اضافی
- ثبت کلاینت وب واتساپ
- دستکاری سیستم فایل در دایرکتوریهای برنامه های اندروید
- دستکاری سیستم فایل
فرار از شناسایی و دور زدن مکانیسم های دفاعی:
- شناسایی وجود TracerPid (دیباگر)
- شناسایی قابلیـتهای ابزارهایی مانند Frida
- شناسایی فریمورک Xposed
- لوود دینامیک کتابخانهها با دستکاری namespace
- پیاده سازی certificate pinning برای ارتباطات C2
- پاکسازی پیلودهای تصویری واتساپ بعد از اجرا
مدل دستگاههای هدف قرار گرفته:
- Galaxy S23 Series (S91[168]BXX.*)
- Galaxy S24 Series (S921BXXU1AWM9, S92[168]BXX.*)
- Galaxy Z Fold4 (F936BXXS4DWJ1)
- Galaxy S22 (S901EXXS4CWD1)
- Galaxy Z Flip4 (F721BXXU1CWAC)
شکل زیر نمونهای از رشته های مدل دستگاه هدف قرار گرفته رو در یک نمونه b.so از LANDFALL نشان میده.

ارتباط با سرور C2:
مولفه ی b.so از LANDFALL از طریق HTTPS با سرور C2 ارتباط برقرار میکنه و از پورت TCP غیر استاندارد و موقتی استفاده میکنه. قبل از شروع ترافیک HTTPS، ممکنِ ترافیک پینگ رو طبق توضیحات بخش “ارتباط با سرور C2” در ضمیمه 2، شروع کنه. برای ترافیک HTTPS، مولفه ی b.so تماس اولیه رو با یک درخواست POST شروع میکنه که شامل اطلاعات دقیق دستگاه و جاسوس افزار هستش، مانند:
- Agent ID
- Device path
- User ID
شکل زیر تفسیر محققا از این درخواست POST اولیه رو نشان میده. از curl برای نمایش ساختار درخواست استفاده شده، هرچند خود LANDFALL از curl برای ایجاد این ترافیک استفاده نمیکنه.

ترافیک اولیه یک HTTP POST به سرور C2 هستش که پارامترهای زیر رو ارسال میکنه:
- protocol: نسخه پروتکل (مثلا A1.5.0)
- protocol_ver: نسخه پروتکل (مثلا “”)
- type: نوع پیام (مثلا MSG_TYPE_GET_AGENT)
- agent_id: شناسه منحصر به فرد عامل
- upload_id: شناسه آپلود
- command_id: شناسه دستور
- source: منبع درخواست (مثلاً bridge_head)
- incremental_build: نسخه بیلد (مثلاً v1.5.0)
- euid: شناسه ی کاربر تحت تاثیر پروسس
- bh_path: مسیر باینری b.so روی دستگاه
- runner: حالت runner (مثلا I)
پیکربندی فایل b.so
پیکربندی فایل b.so از ترکیب مقادیر پیش فرض هاردکد شده و یک شیء JSON رمزنگاری شده تعبیه شده داخل خود فایل، مدیریت میشه. این پیکربندی حاوی جزئیات C2، کلیدهای رمزنگاری و شناسههای منحصر به فرد عامل و دستورهاست.
شکل زیر نمونهای از این پیکربندی رو نشان میده.

برخی مقادیر، بصورت هاردکد شده در b.so هم موجوده تا در صورت نبودن مقدار معادل در JSON، بعنوان مقدار پیش فرض استفاده بشن. هدف کامل بعضی از این مقادیر هنوز بصورت قطعی درک نشده. جدول زیر مقادیر پیش فرض هاردکد شده رو نمایش میده.
| Field Name | Default Value |
|---|---|
| allow_wifi | true |
| allow_mobile | true |
| allow_roaming | false |
| socket_timeout | 5 |
| sleep_time | 60 (0x3c) |
| sleep_time_between_retries | 35 (0x23) |
| suicide_time | 7200 (0x1c20) |
| live_mode_expiration | 0 |
| allow_min_battery | 0 |
| is_persistent | false |
زیرساخت C2 برای جاسوسافزار LANDFALL:
براساس تحلیل نمونهها، محققا شش سرور C2 مرتبط با LANDFALL رو شناسایی کردن که در جدول زیر، قابل مشاهده است.
| IP Address | Domain | First Seen | Last Seen |
| 194.76.224[.]127 | brightvideodesigns[.]com | Feb. 7, 2025
19 بهمن 1403 |
Sept. 19, 2025
28 شهریور 1403 |
| 91.132.92[.]35 | hotelsitereview[.]com | Feb. 3, 2025
15 بهمن 1403 |
Sept. 16, 2025
25 شهریور 1403 |
| 92.243.65[.]240 | healthyeatingontherun[.]com | Oct. 11, 2024
20 مهر 1403 |
Sept. 2, 2025
11 شهریور 1403 |
| 192.36.57[.]56 | projectmanagerskills[.]com | Feb. 3, 2025
15 بهمن 1403 |
Aug. 26, 2025
4 شهریور 1403 |
| 46.246.28[.]75 | Unknown | Unknown | Unknown |
| 45.155.250[.]158 | Unknown | Unknown | Unknown |
جایگاه LANDFALL در تصویری کلی تر:
LANDFALL نمونهای از یک الگوی گستردهتر زنجیرههای اکسپلویت است، که دستگاههای موبایل رو هدف قرار میده و با آسیبپذیریهای پردازش تصاویر DNG مرتبط است. استفاده این کمپین از یک فایل DNG مخرب، یک بردار حمله تکرار شونده و مهم رو نشان میده: هدفگیری کتابخانه های پردازش تصاویر DNG.
نقصی که LANDFALL از آن سوءاستفاده کرده، CVE-2025-21042، بخشی از یک الگوی بزرگتر است. در اوایل ۲۰۲۵ سامسونگ نقص DNG دیگه ای رو در همان کتابخانه با شناسه CVE-2025-21043 شناسایی کرد و همزمان هم زنجیرهای مشابهی در iOS با استفاده از CVE-2025-43300 و CVE-2025-55177 گزارش شد.
ارتباط با CVE-2025-21043 (SVE-2025-1702):
آنالیز محققا نشان از ارتباط احتمالی با یک آسیبپذیری دیگه در همان کتابخانه داره، CVE-2025-21043 (SVE-2025-1702)، که سامسونگ در بروزرسانی امنیتی سپتامبر ۲۰۲۵ اون رو اصلاح کرد. هرچند این آسیبپذیری در نمونههای LANDFALL که محققا کشف کردن بصورت مستقیم مورد اکسپلویت قرار نگرفته، اما شباهتهای بین اکسپلویت CVE-2025-21042 و CVE-2025-21043 قابل توجه هستش. هر دو حول پردازش فایلهای DNG و تحویل از طریق اپلیکیشنهای پیامرسان موبایل بودن.
CVE-2025-43300 در محصولات اپل
در آگوست ۲۰۲۵، اپل CVE-2025-43300 رو که یک زیرودی در تجزیه ی فایلهای DNG بود و در حملات واقعی مورد اکسپلویت قرار گرفته بود، اصلاح کرد. این زنجیره به مهاجمان اجازه میداد از طریق تصاویر مخرب ارسال شده در اپلیکیشنهای پیامرسان، اجرای کد از راه دور بدون تعامل کاربر رو داشته باشن.
محققا نمیتونن تأیید کنن که آیا همان زنجیره اکسپلویت برای تحویل معادلی از LANDFALL به iOS استفاده شده یا خیر، یا اینکه همان بازیگر تهدید پشت هر دو بوده یا نه. با این حال، ظهور همزمان افشاها در اکوسیستمهای iOS و اندروید نشان دهنده الگوی گستردهای از سوءاستفاده پیشرفته از آسیبپذیریهای پردازش DNG هستش.

- جولای ۲۰۲۴ – فوریه ۲۰۲۵ (تیر تا بهمن 1403): نمونههای اولیه فایلهای DNG مخرب حاوی LANDFALL برای اولین بار در VirusTotal از جولای ۲۰۲۴ ارسال و نمونههای بیشتری در ماههای بعد ظاهر میشن.
- این فایلهای DNG از آسیبپذیری در کتابخانه پردازش تصویر سامسونگ سوء استفاده میکنن (SVE-2024-1969، CVE-2025-21042).
- ۲۵ سپتامبر ۲۰۲۴ (4 مهر 1403): آسیبپذیری بصورت خصوصی به سامسونگ گزارش شد.
- آوریل ۲۰۲۵ (فروردین 1404): سامسونگ بروزرسانی برای رفع SVE-2024-1969 (بعدها با شناسه CVE-2025-21042 مشخص شد) منتشر کرد.
- آگوست ۲۰۲۵ (مرداد 1404): تحولات موازی رخ میده:
- اپل نقص زیرودی مربوط به پردازش DNG رو اصلاح کرد (CVE-2025-43300).
- واتساپ آسیبپذیری CVE-2025-55177 رو گزارش کرد که با نقص اپل (CVE-2025-43300) در یک زنجیره ترکیب شده بود.
- محققا نمونههای DNG رو پیدا کردن که از CVE-2025-21042 برای تحویل جاسوس افزار اندرویدی LANDFALL سوءاستفاده میکرد.
- واتساپ CVE-2025-21043 (یک زیرودی مرتبط با DNG در دستگاههای سامسونگ) رو به سامسونگ گزارش کرد.
- سپتامبر ۲۰۲۵ (شهریور 1404): سامسونگ بروزرسانی رو برای CVE-2025-21043 (SVE-2025-1702) منتشر کرد. همزمان، شناسه ی CVE-2025-21042 (SVE-20254-1969) رو به آسیبپذیری قبلی که قبلا هیچ شناسه CVE نداشت، اختصاص داد.
قربانیان بالقوه:
تحلیل دادههای ارسال شده به VirusTotal برای فایلهای DNG مخرب، نشان دهنده قربانیان احتمالی در عراق، ایران، ترکیه و مراکش است. همچنین، مرکز واکنش امنیتی ملی ترکیه (USOM) آدرسهای IP استفاده شده توسط سرورهای C2 LANDFALL رو بعنوان آدرسهایی مخرب، مرتبط با موبایل و APT گزارش کرده که این امر احتمال هدفگیری در ترکیه رو تقویت میکنه.
ارتباط با گروههای جاسوس افزار شناخته شده:
اگرچه محققا نتونستن تمام اجزای فریمورک LANDFALL رو بازیابی کنن، اما شواهد نشان میده این ابزار دارای سطح کیفی تجاری است و احتمالا در زنجیرهی آلودگی خود از چند اکسپلویت زیرودی استفاده کرده. چنین ابزارهایی معمولا توسط شرکتهایی توسعه داده میشن که در حوزهی جاسوسافزار تجاری فعال هستن و تحت عنوان بازیگران تهاجمی بخش خصوصی (PSOA: Private Sector Offensive Actors) شناخته میشن. شرکتهایی که از نظر حقوقی ثبت شدن اما محصولات و خدمات خودشون رو غالبا به نهادهای دولتی عرضه میکنن.
در خصوص جاسوس افزارهای تجاری و شرکتهای مربوطه، گوگل مستند جالبی منتشر کرده که در قالب 4 پست در سایت منتشر کردیم.
در حال حاضر، محققا نتونستن فعالیت LANDFALL رو بطور قطعی به هیچ PSOA یا گروه تهدید خاصی نسبت بدن. این فعالیت با شناسهی CL-UNK-1054 در سیستم رهگیریشون ثبت شده. ولی دو نکته در این میان قابل توجه است:
- شباهت زیرساخت C2 و الگوهای ثبت دامنهی LANDFALL با زیرساختهایی که قبلا در ارتباط با گروه Stealth Falcon مشاهده شده بود. این شباهتها بر اساس گزارشهای عمومی و تحلیلهای Unit 42 از فعالیتهای این گروه در خاورمیانه شناسایی شده.
- Stealth Falcon که با عنوان FruityArmor هم شناخته میشه، یک گروه تهدید هستش که حداقل از سال ۲۰۱۲ حملات جاسوسی هدفمندی رو علیه روزنامه نگاران، فعالان و مخالفان اماراتی انجام داده. شواهد غیرمستقیم نشان میده که ممکن است ارتباطی بین این گروه و دولت امارات متحده عربی وجود داشته باشه، اما این موضوع هنوز تأیید نشده. این گروه از یک آسیب پذیری زیرودی با شناسه ی CVE-2025-33053 در WEBDAV که در بروزرسانی ژوئن مایکروسافت اصلاح شد، برای هدف قرار دادن سازمانهای دولتی در ترکیه، قطر، مصر و یمن استفاده کرده بود.
- در شواهد دیباگ، جاسوس افزار LANDFALL، مولفه ی تحلیل شده ی خودش رو با نام “Bridge Head” معرفی میکنه. این نام قابل تامل است، چون اصطلاح Bridge Head یک نام مستعار رایج در میان برخی شرکتهای سایبری تهاجمی (مانند NSO Group، Variston، Cytrox، و Quadream) برای توصیف لودرهای مرحلهی اول است. با این حال، صرف این نامگذاری به تنهایی نمیتونه دلیل قطعی برای انتساب باشه.
نام BridgeHead در چند فریمورک جاسوس افزاری تجاری دیگه هم دیده شده، از جمله در چارچوب Heliconica که در گزارش Google TAG دربارهی شرکت اسپانیایی Variston ذکر شده. گوگل، Variston رو بعنوان یک PSOA مستقر در بارسلونا معرفی کرده که ابزارهای اکسپلویت تولید میکرد. همچنین مشخص شد، ابزارهای Variston توسط یک واسطه به نام Protect Electronic Systems (یا Protected AE) به مشتریانی در امارات فروخته میشد. این ارتباط احتمالی بین ارائه دهنده (Variston) و مشتری (UAE) جالب توجه است، چون شرکتهایی مانند مایکروسافت و سایر منابع هم گزارش کردن که گروه Stealth Falcon از همین کشور فعالیت زیادی داره. طبق گزارشها، شرکت Variston پس از افشای عمومی فعالیتهاش در اوایل سال ۲۰۲۵، فعالیت خودش رو متوقف کرد.
تا اکتبر ۲۰۲۵، به جز شباهتهای زیرساختی، هیچ همپوشانی مستقیمی میان کمپین LANDFALL و فعالیتهای مبتنی بر نقاط پایانی گروه Stealth Falcon مشاهده نشده. با این حال، شباهتها در طراحی و زیرساخت، قابل تأمل هستن.
نتیجهگیری:
کشف جاسوسافزار LANDFALL نشان دهندهی کمپینی است که دستگاههای اندرویدی سامسونگ رو هدف قرار داده. زنجیرهی اکسپلویت این جاسوسافزار شامل آسیبپذیری CVE-2025-21042 میشه، که سامسونگ در آوریل ۲۰۲۵ با انتشار اصلاحیه ای، اون رو اصلاح کرد. وجود این جاسوس افزار در فایلهای DNG با نامهای مشابه تصاویر واتساپ، نشان میده که مهاجمان احتمالا قصد داشتن اکسپلویت رو از طریق برنامه های پیامرسان (مانند WhatsApp) انتقال بدن.
از زمان مشاهدهی اولین نمونهها در جولای ۲۰۲۴، این فعالیت نشان میده چطوری اکسپلویتهای پیشرفته میتونن مدتها در مخازن عمومی (مانند VirusTotal) باقی بمونن، قبل از اینکه ماهیت واقعی اونا کشف بشه.
تحلیل لودر LANDFALL شواهدی از سطح فعالیت تجاری و حرفهای رو نشان میده. اجزای مختلف این جاسوس افزار قابلیتهای پیشرفتهای برای مخفی کاری، پرسیست و جمعآوری گستردهی دادهها از دستگاههای مدرن سامسونگ داره.
با این حال، مولفه های بعدی این جاسوسافزار هنوز بصورت مستقیم تحلیل نشدن. بررسی جزئیات بیشتر دربارهی این مولفه ها یا روش دقیق تحویل، میتونه بینش بهتری از سازوکار این حمله ارائه بده.
IOCهای گزارش:
لیستی از نمونه های بدافزار مربوط به فعالیت LANDFALL در جدول زیر اومده. برخی از نمونه های این بدافزار رو، برای تحلیل و آنالیز بیشتر، میتونید از گیتهاب دانلود کنید.
| SHA256 Hash | Filename | Size |
|---|---|---|
| b06dec10e8ad0005ebb9da24204c96cb2e297bd8d418bc1c8983d066c0997756 | img-20250120-wa0005.jpg | 6.66 MB |
| c0f30c2a2d6f95b57128e78dc0b7180e69315057e62809de1926b75f86516b2e | 2.tiff | 6.58 MB |
| 9297888746158e38d320b05b27b0032b2cc29231be8990d87bc46f1e06456f93 | whatsapp image 2025-02-10 at 4.54.17 pm.jpeg | 6.66 MB |
| d2fafc7100f33a11089e98b660a85bd479eab761b137cca83b1f6d19629dd3b0 | b.so | 103.31 KB |
| 384f073d3d51e0f2e1586b6050af62de886ff448735d963dfc026580096d81bd | 103.31 KB | |
| b975b499baa3119ac5c2b3379306d4e50b9610e9bba3e56de7dfd3927a96032d | 1.jpeg | 5.66 MB |
| a62a2400bf93ed84ebadf22b441924f904d3fcda7d1507ba309a4b1801d44495 | 103.31 KB | |
| 29882a3c426273a7302e852aa77662e168b6d44dcebfca53757e29a9cdf02483 | img-20240723-wa0001.jpg | 6.58 MB |
| 2425f15eb542fca82892fd107ac19d63d4d112ddbfe698650f0c25acf6f8d78a | 6357fc.zip | 380.71 KB |
| b45817ffb0355badcc89f2d7d48eecf00ebdf2b966ac986514f9d971f6c57d18 | img-20240723-wa0000.jpg | 5.65 MB |
| 69cf56ac6f3888efa7a1306977f431fd1edb369a5fd4591ce37b72b7e01955ee | localfile~ | 1.42 MB |
| 211311468f3673f005031d5f77d4d716e80cbf3c1f0bb1f148f2200920513261 | l | 332.88 KB |
| ffeeb0356abb56c5084756a5ab0a39002832403bca5290bb6d794d14b642ffe2 | 103.31 KB |
آدرس های IP:
- 45.155.250[.]158
- 46.246.28[.]75
- 91.132.92[.]35
- 92.243.65[.]240
- 192.36.57[.]56
- 194.76.224[.]127
دامنه ها:
- brightvideodesigns[.]com
- healthyeatingontherun[.]com
- hotelsitereview[.]com
- projectmanagerskills[.]com
پیوست 1: دستکاری سیاست SELinux
مولفه ی مربوط به دستکاری سیاست SELinux در LANDFALL فایل l.so است. این فایل قابلیتی فراهم میکنه که کنترلهای امنیتی سیستم رو دور بزنه. فرآیند به این شکل است که فایل فشرده شده از مسیر زیر استخراج
|
1 |
/data/data/com.samsung.ipservice/files/l |
و در مسیر زیر نوشته و سپس اجرا میشه.
|
1 |
/data/data/com.samsung.ipservice/files/l.so |
بجای داشتن قواعد هاردکدشده ی ثابت، l.so یک موتور عمومی پیادهسازی میکنه که میتونه بصورت پویا عبارات جدید سیاست SELinux رو از یک منبع خارجی تجزیه و لوود کنه و سیاست در حال اجرا رو در حافظه تغییر بده.
توابع اکسپورت شده مرتبط و منحصر به فرد عبارتند از:
- sepolicy_from_data: لوود سیاست از داده ی باینری
- sepolicy_add_statement: افزودن یک عبارت مجزا به سیاست
- sepolicy_to_buffer: سریالایز کردن سیاستِ اصلاح شده
- sepolicy_delete: پاکسازی اشیاء/منابع مرتبط با سیاست
پیوست 2: جزئیات تکمیلی تحلیل جاسوسافزار LANDFALL
این پیوست قابلیتهای مشاهده شده در مؤلفه لودر LANDFALL رو تشریح میکنه و همچنین فرضیات مربوط به قابلیتهایی رو که در ماژولهای دیگه فریمورک کامل LANDFALL وجود دارن ولی محققا هنوز به اونا دسترسی نداشتن رو مطرح میکنه.
مولفه ی Bridge Head که روی دیسک با نام b.so ذخیره شده، توسط یک اکسپلویت در دستگاه لوود میشه. بلافاصله بعد از لوود، LANDFALL مقدار LD_PRELOAD رو از environment میخونه تا از به ارث بردن پیش لوودهای بالادستی جلوگیری کنه.
بعدش geteuid رو فراخوانی و شناسه کاربر تحت تاثیر (EUID) رو بدست میاره و اونو بصورت سراسری ذخیره میکنه تا شاخههای بعدی رفتار رو برای حالت root در برابر بدون root تطبیق بده. بعدش وارد روتین اصلی میشه.
مجموعهای از اطلاعات پایه ای پروسس رو جمعآوری میکنه (شناسه والد پروسس، euid، رشته ی بیلد اندروید)، یک فلگ runner رو از متغیر محیطی R میخونه و یک کپی از اون برای اقدامات بعدی نگه میداره. این مقدار (معمولا I برای interactive یا P برای passive) به سرور C2 گزارش میشه و تعیینکننده ی نحوه ی راهاندازی پیلودهای مرحله ی بعد خواهد بود.
در ادامه مسیر نگاشت شده (مسیر اجرای باینری یا آدرس نگاشت شده در حافظه) خودش رو شناسایی میکنه، و دایرکتوری خصوصی برنامه (/data/data/com.samsung.ipservice/files/) رو بعنوان مسیر کاری انتخاب میکنه. بعدش دو مسیر جدید داخل اون میسازه:
- یکی برای دانلود مراحل بعدی
- دیگری برای l.so نهایی که برای اجرا استفاده میشه.
پیکربندی:
LANDFALL یک پیکربندی JSON رمزنگاری شده رو مستقیما از درون فایل خودش میخونه و با عملیات XOR اونو رمزگشایی میکنه. بدافزار پیکربندی رو نرمالایز میکنه، بدین صورت که مقادیر پیش فرض داخلی رو در آبجکت تجزیه شده می نویسه:
- فیلدهای عددی وقتی نباشن یا صفر باشن، مقدار پیش فرض میگیرن.
- برخی از مقادیر بولی صرف نظر از پیکربندی ارائه شده، به مقادیر ثابتی، بصورت اجباری تغییر داده میشن.
- در نهایت بررسی میشه که یک کلید عمومی (X.509 DER) در پیکربندی وجود داره یا نه. در صورت عدم وجود، اجرا متوقف میشه.
جدول زیر خلاصهای از نرمالسازی پیکربندی در این مرحله رو نشان میده.
| Key Name | Value Type | Default | Required |
| allow_wifi | boolean | Enforced true (overrides false/missing to true) | No |
| allow_mobile | boolean | Enforced true (overrides false/missing to true) | No |
| allow_roaming | boolean | Default false if missing/false; true remains true | No |
| allow_min_battery | integer | 0 if value is 0 or missing | No |
| sleep_time | integer (seconds) | 60 if value is 0 or missing | No |
| sleep_time_between_retries | integer (seconds) | 35 if value is 0 or missing | No |
| suicide_time | integer (seconds) | 7200 if value is 0 or missing | No |
| live_mode_expiration | integer (seconds) | 0 if value is 0 or missing | No |
| socket_timeout | integer (seconds) | 5 if value is 0 or missing | No |
| is_persistent | boolean | Default false if missing/false; true remains true | No |
| bridge_head_version_major | integer | Hard-set to 2 (always) | No |
| bridge_head_version_minor | integer | Hard-set to 1 (always) | No |
| cnc_hostname | string | None; must be present | Yes |
| cnc_port | integer | None; must be non-zero | Yes |
| cnc_base_url | string | None; must be present | Yes |
| agent_id | string (UUID) | None; must be present | Yes |
| command_id | string (UUID) | None; must be present | Yes |
| commands | array | Must exist; read and freed (structure not retained here) | Yes |
| public_key | X.509 DER (bytes) | None; must be present and valid | Yes |
ارتباط با سرور C2:
پس از تکمیل پیکربندی، b.so توابع شبکه و رمزنگاری لازم رو لوود، محیط SSL رو راهاندازی و یک شرایط امن کلاینت، برای ارتباط HTTPS آینده آماده میکنه. اگه هر بخشی از این تنظیمات با شکست مواجه بشه، بجای ریسک راهاندازی ناقص، بطور کامل از اون خارج میشه.
قبل از ورود به حلقه ی beaconing (به فرایندی میگن که بدافزار بصورت مرتب و پی در پی با سرور C2 تماس میگیره تا وضعیت رو گزارش بده، دستور جدید بگیره یا باینری/پیلود مرحله بعد رو دانلود کنه. یعنی یک حلقه ی تکرار شونده که تا وقتی عامل زنده است اجرا میشه.)، ممکنِ اطلاعاتی از وضعیت خودش رو به سرور ارسال کنه. اگر بصورت root اجرا بشه، یک خط مختصر “started” فرمت بندی میکنه که شامل موارد زیر است:
- یک نشانگر نسخه ی ثابت (مثلاً v1.5.0)
- pid
- euid
- حالت Runner
بعدش این اطلاعات رو بصورت زیر، از طریق یک درخواست POST به سرور C2 ارسال میکنه.

اگه حالت runner برابر I باشه، ابتدا تابع کمکی SELinux رو آماده میکنه: تابع کمکی، سیاست فشرده شده (/data/data/com.samsung.ipservice/files/l) رو پیدا و اون رو از طریق یک دیکدر داخلی XZ در یک بافر جدید قرار داده و نتیجه رو در data/data/com.samsung.ipservice/files/l.so مینویسه. بعدش با ارسال پینگ با استفاده از agent_id بدون خط تیره بعنوان پیلود، به سرور C2 ارسال میکنه. این عملیات فقط گزارش میده، کار عملیاتی یا مخربی رو انجام نمیده.
شکل زیر یک نمونه از I‑mode ping رو نشون میده.

فقط بعد از این مرحله، حلقه ی اصلی beaconing شروع میشه. زمان صفر ثبت میشه و یک محدوده زمانی حدود ۷۲۰۰ ثانیه (suicide_time) برای کل جلسه اعمال میشه. (7200 ثانیه زمان برای اجرا خودش مشخص میکنه)
دو بافر رشته ای برای مسیرها ایجاد و مقدارشون رو برابر 0 قرار میده:
- یکی برای blob خامی که ممکنِ از سرور بیاد.
- یکی برای so که از حالت فشرده خارج شده.
هر دو مسیر در دایرکتوری کاری برنامه قرار دارن (/data/data/com.samsung.ipservice/files/). با آماده شدن مسیرها، بدافزار با ساختن رشته ای کوتاه به سبک URL-encoded از جفتهای key=value با سرور C2 ارتباط میگیره که شامل مواردی چون:
- یک تگ پروتکل/واریانت؛ نوع پیام beacon
- agent_id, command_id و یک upload_id جدید (UUIDv4) برای اینکه سرور بتونه پیام یا فایلهای ارسالی رو به همان عامل و همان دستور خاص مرتبط کنه.
- source=bridge_head
- euid
- فلگ runner و مسیر نصب اون روی دیسک
هرگاه لازم باشه، SHA-1 روی بخشی از پیام محاسبه و به اون اضافه میشه. رشته ی User-Agent که استفاده میکنه همانند نمونه ی کروم زیر هستش:
|
1 |
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36 |
درخواستها به مسیر پایه ی پیکربندی شده هدایت میشن (مثلا POST /is/ HTTP/1.0). قبل از ارسال هر داده ی اپلیکیشن، TLS Certificate Pinning میکنه تا اطمینان حاصل بشه که ارتباط، امن و به سرور درست برقرار هستش.
هنگام خواندن پاسخ از سرور C2، کد وضعیت پاسخ رو بررسی کرده و هدرها رو برای تعیین طول و نوع پیام میخونه. برخی از کدهای وضعیت، بویژه timeoutها و مجموعهای از کدهای 4xx/5xx (مثلا 408، 504)، بعنوان وضعیت موقت در نظر گرفته شده و باعث میشه بدافزار برای مدت مشخصی (sleep_time_between_retries، پیش فرض ۳۵ ثانیه) صبر کنه و بعد با یک اتصال تازه دوباره تلاش کنه. اگه پاسخ پیدا نشه (مثلا 404)، این حالت برای اجرای حلقه پایانی در نظر گرفته شده و حلقه خاتمه پیدا میکنه. اگه وضعیت موفقیت آمیز باشه و بدنه ی پیام وجود داشته باشه، LANDFALL به مرحله ی آمادهسازی و دریافت پیلود مرحله ی بعدی میره.
پیلودهای مرحله بعد:
فرآیند Staging با پاکسازی وضعیت فایل سیستم شروع میشه. اگه blob خام قدیمی در مسیر موقت وجود داشته باشه، اون رو حذف میکنه. سپس بایتهای خام رو در فایلی با نام aa.so در دایرکتوری کاری مینویسه و تلاش میکنه با استفاده از یک دیکدر داخلی XZ/LZMA اون رو از حالت فشرده خارج کنه. این دیکدر داده رو در بافری از پیش تخصیص داده شده با اندازه تقریبا ۵ مگابایت استخراج میکنه.
در صورت موفقیت، دادههای از حالت فشرده خارج شده در فایلی با نام dec_a.so (مسیر نهایی so) در دایرکتوری کاری نوشته میشه، فایل موقت aa.so حذف میشه و سطح دسترسی dec_a.so روی 777 تنظیم میشه تا در محیطهای مختلف قابل لوود باشه.
نمونهای از دیکدر XZ (نسخهی کوتاه شده):

زمانیکه shared object (یعنی dec_a.so) آماده شد، بر اساس مقدار فلگ runner ، یک استراتژی اجرای مناسب انتخاب میشه. در حالت تعاملی که با حرف I مشخص میشه، دو متغیر محیطی اکسپورت شده و یک ابزار سیستمی قانونی بصورت همزمان اجرا میشه:
|
1 2 |
LD_PRELOAD=<final.so> PRELOAD_PATH=/data/data/com.samsung.ipservice/ files/l.so /system/bin/id (where <final.so> is dec_a.so) |
مقدار PRELOAD_PATH به مسیر دستگاهی اشاره داره که محتوای سیاستهای SELinux در اون قرار داره، تا کد پیش لوود شده بتونه در هنگام راه اندازی این سیاستها رو پیدا و اعمال کنه. توجه داشته باشید که PRELOAD_PATH فقط در حالت تعاملی استفاده میشه، در حالت اجرای غیر فعال حذف میشه.
در حالت غیرفعال (Passive) که با حرف P مشخص میشه، همان ابزار بصورت پس زمینه اجرا میشه:
|
1 |
LD_PRELOAD=<final.so> /system/bin/id (with <final.so> is dec_a.so) |
این کار باعث میشه کنترل سریعتر برگرده، در حالیکه پروسس کمکی در پس زمینه راه اندازی شده. در سطح داخلی، هر دو حالت از طریق یک shell wrapper مشابه زیر اجرا میشه:
|
1 |
/system/bin/sh -c <cmd> |
در هر دو حالت، فقط دو مقدار خروجی زیر رو بعنوان موفق، قبول میکنه و بقیه موارد رو بعنوان شکست در نظر میگیره و حلقه رو متوقف میکنه:
- exit code 0
- 0x15
در صورت لوود موفق، پیامی با عنوان “ended” ارسال میشه که مشابه پیام شروع است و شامل موارد زیر:
- Version marker
- pid
- incremental_build
- runner

بعدش رشتهها و بافرهای موقت، آزاد میشن. اگه هیچ پیلودی موجود نباشه یا خطای موقت رخ بده، زمان سپری شده با زمان اولیه ۷۲۰۰ ثانیه مقایسه میشه. اگه هنوز زمان باقی مانده باشه، به مدت زمان پیکربندی شده صبر میکنه (sleep) و دوباره تلاش میکنه.
در نهایت، زمانیکه حلقه تموم بشه، چه پس از لوود موفق مرحله بعد و چه بدلیل اتمام زمان یا خطاهای غیرقابل بازیابی، پروسس بصورت نرمال خاتمه پیدا میکنه. اگه برنامه با دسترسی root اجرا میشه، ترجیح میده از exit(status)_ استفاده کنه تا هیچ اثر جانبی (مثل اجرای توابع cleanup یا تغییرات اضافی در حافظه و فایلها) باقی نمونه. در تمام موارد، هدفش اینِ که فقط حداقل آثار لازم برای ادامه اجرای کد مرحله ی بعدی باقی بمونه.
قابلیتهای بدون فراخوانی:
محققا در فرایند مهندسی معکوس، چندین روتین در مؤلفهی b.so شناسایی کردن که هیچکدام در جریان اجرای مشاهده شده، فراخوانی نمیشن. این قابلیتهای مخفی احتمالا برای استفاده در ماژولهای بعدی طراحی شدن که در مراحل بعد لوود میشن. همچنین احتمال زیاد وجود داره که برخی از این توابع، از نسخه های قدیمی تر بدافزار LANDFALL باقی موندن. این توابع رفتارهایی مرتبط با مسیرهای رسانهای واتساپ، جستجو در DCIM، آمادهسازی فایل سیستم و عدم مشکوک شدن به پروسس در اندروید رو مشخص میکنن. در ادامه، جزئیات هر کدام بررسی شده:
جستجو در DCIM: یک روتین، خط تلهمتری started زیر رو میسازه و با زیر سیستم رسانه ای دستگاه (media subsystem) تعامل برقرار میکنه:
|
1 |
BH v1.5.0 started - pid: , euid=, incremental_build: v1.5.0, runner |
اگه بررسیهای داخلی موفق باشن، با اجرای دستور زیر باعث میشه گالری دستگاه مجددا اسکن بشه:
|
1 |
am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file:///sdcard/DCIM/hacked.jpg |
در همان جریان، یک دستور دیگه هم ساخته میشه تا جدیدترین تصویر گرفته شده با دوربین رو در پوشهی DCIM پیدا کنه :
|
1 |
find /sdcard/DCIM -type f -exec ls -t1 {} + | grep -v hacked| head -1 |
این روتین در کد کامپایل شده وجود داره اما در اجرای واقعی هرگز فراخوانی نمیشه.
تعامل با مسیر فایلهای رسانهای واتساپ: تابع دیگه ای در این بدافزار، یک تصویر ۱×۱ پیکسلی با فرمت PNG رو که بصورت Base64 کد شده (بصورت iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJ…JRU5ErkJggg==) دیکد میکنه و بعدش در فولدر رسانهای واتساپ روی حافظهی خارجی، دنبال مسیر فایلی میگرده که با شناسهی عامل مطابقت داشته باشه. در این فرآیند، در ابتدا، خط تیره های UUID مربوطه پاک میشن. این بدافزار یک pipeline جستجو در مسیرهای پیش فرض (ID 0) و چندکاربره (ID 95) می سازه و اجرا میکنه:
|
1 |
find /storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp\ Images/ /storage/emulated/95/Android/media/com.whatsapp/WhatsApp/Media/WhatsApp\ Images/ -type f -atime -720m -maxdepth 1 -exec grep -lo '.*<agentIdNoHyphens>.*' {} \; -quit 2>/dev/null |
اگه مسیری مطابق با شناسهی عامل یافت شد، تصویر PNG دیکد شده، دقیقا در همان مسیر قرار میگیره. به نظر میرسه این عمل برای ایجاد یک علامت مخفی یا فایل پوششی در میان تصاویر واتساپ طراحی شده باشه، یعنی نوعی علامت مخفی که در تصاویر واتساپ مخفی میشه.
یک تابع کمکی دیگه، یک دایرکتوری پایه و یک رشته رو بعنوان ورودی میگیره و با اجرای دستور زیر، مسیر اولین فایل JPEG مطابق رو بر میگیردونه:
|
1 |
find <base> -name '*.jpg' -exec grep -le '.*<pattern>.*' {} \; |
این تابع بعد از اجرای دستور، کاراکترهای انتهای خط (newline) رو حذف میکنه و قبل از برگردوندن نتیجه، بررسی میکنه که مسیر واقعا وجود داره یا نه.
بررسی اجتناب از Zygote : یک تابع کمکی، یک بافر برای cmdline خودش اختصاص میده و تنها زمانی موفق بر میگردونه که نام اون با zygote یا zygote64 مطابقت نداشته باشه. هدف از این کار اینِ که بدافزار از اجرای خودش در داخل پروسس های خاص سیستم اندروید (مانند Zygote) خودداری کنه، چون این پروسس ها میزبان اصلی برنامههای اندروید هستن و اجرای بدافزار در اونا میتونه باعث کرش یا تشخیص بشه.
Zygote در واقع یک والد برای تمام پروسس های اپ ها در اندروید هستش و وظیفه اصلیش، اجرای سریع و کارآمد اپ هاست. وقتی سیستم عامل اندروید بوت میشه، پروسس Zygote به عنوان اولین پروسس کاربری اجرا میشه. Zygote در ابتدا تمام کلاسهای اصلی جاوا و منابع مورد نیاز فریمورک اندروید رو از قبل، لوود و آماده میکنه. وقتی شما یک برنامه رو باز میکنید، Zygote بجای اینکه یک پروسس جدید رو از ابتدا ایجاد کنه، از طریق تکنیکی بنام Forking، خودش رو کپی میکنه. نتیجه این کار اینِ که، پروسس جدید برنامه بلافاصله آماده اجراست، چون تمام منابع مورد نیاز از قبل در حافظه لوود شدن. این کار باعث سرعت بسیار بیشتر در باز شدن و اجرای برنامهها میشه.
تفکیک و پاکسازی سیمبولهای SELinux : دو روال کوچک برای مدیریت داینامیک SELinux وجود داره:
یکی از اونا فایل کتابخانهی زیر رو بصورت داینامیک لوود میکنه:
|
1 |
/system/lib64/libselinux.so |
بعدش دو تابع getfilecon و setfilecon رو پیدا و در متغیرهای سراسری از نوع اشارهگر به تابع ذخیره میکنه.
تابع دیگه، این تنظیمات رو برمیداره و اشارهگرها رو پاک میکنه.
هدف از وجود این دو تابع، پشتیبانی از عملیات مربوط به سیاستها و context فایلها در SELinux است. با این حال در مسیرهای مشاهده شده از اجرای بدافزار، این توابع مستقیما استفاده نشدن.
SELinux (Security-Enhanced Linux) یکی از مکانیزمهای امنیتی لینوکس هستش که در اندروید هم استفاده میشه و هدفش این هستش که کنترل کنه، کدام پروسس به کدام فایل دسترسی داشته باشه و چه نوع عملیاتی (خواندن، نوشتن، اجرا) مجاز است. در SELinux، هر فایل و هر پروسسی یک context امنیتی داره، مثلا:
|
1 2 |
u:object_r:system_file:s0 u:object_r:app_data_file:s0:c512,c768 |
به هر سطر اصطلاحا برچسب امنیتی میگن. این file context تعیین میکنه چه چیزی میتونه به اون فایل دسترسی پیدا کنه. تابع getfilecon برای گرفتن context امنیتی یک فایل و تابع setfilecon برای تغییر context امنیتی فایل استفاده میشه.
یک روال بزرگتر لیستی از مسیرهای سیستم فایل رو میگیره. برای هر مسیر، ابتدا برچسب امنیتی فعلی فایل رو با getfilecon ذخیره میکنه، بعدش یک برچسب زن داخلی روی اون مسیر اجرا میکنه، مالکیت فایل رو با chown اعمال میکنه و در نهایت برچسب ذخیره شده رو با setfilecon بازیابی میکنه. اگه chown یا setfilecon شکست بخورن، این روال کدهای منفی متمایزی رو برمیگردونه تا علت خطا مشخص باشه.
یک جستجوگر فایل تلاش میکنه تا مسیری رو باز کنه و نتیجه اون رو با کدهای وضعیت داخلی (موفقیت، رد شدن دسترسی، یافت نشدن، خطای عمومی) مشخص میکنه. همچنین وضعیت داخلی کتابخانه (از جمله هندلرهای SELinux که قبلا باز شدن) رو بازنشانی میکنه.
نگاشت نتیجه ی اجرای پروسس به وضعیت پیام: یک مبدل کوچک، نتیجه ی تابع کمکیِ اجرای دستور داخلی رو به کدهایی نگاشت میکنه. مثلا مقدار بازگشتی خاص (۱) به کد CMD_STAT_* مقدار 0x0C و ۲–۳ به 0x51 نگاشت میکنه. این کار گزارش دهی رو برای توابع کمکی استاندارد میکنه، اما در مسیر اجرای مشاهده شده، فراخوانی نمیشه.
ساخت آرایه ی JSON گزارش دستگاه: یک روال غیرفعال دیگه، آرایه ی cJSON میسازه که هر ورودی شامل device_path، یک فیلد باینری Base64 شده، یک مقدار بولین last_updated و یک رشته ی متنی که از جدول داخلی CMD_STAT_* گرفته شده، هستش. این روال یک لیست ورودی رو پیمایش میکنه، فایل مرجع رو در حافظه میخونه، اون رو Base64 میکنه و به آرایه اضافه میکنه.
یک تابع کمکی قالب بندی رشته، توکن –working_dir– رو داخل مقادیر JSON پیدا کرده و اون رو با مسیر زمان اجرای دنبال شده توسط b.so جایگزین میکنه.
اضافه کردن TracerPid به تلهمتری: یک تابع کمکی، فایل /proc/self/status رو تجزیه کرده، خط TracerPid رو میگیره، به عدد صحیح تبدیل میکنه و اگه بزرگتر از صفر بود، یک کلید/مقدار قالب بندی شده رو از طریق سازنده ی رشته ی b.so به بدنه ی درخواست اضافه میکنه.
یک تابع کمکی با اضافه کردن یک بافر موجود و یک بلوک شبه-تصادفی گرفته شده از یک رشته ی ورودی کار میکنه:
- یک بایت رو با rand مقداردهی اولیه میکنه (این بایت بعنوان تجمع کننده ی اولیه یا seed استفاده میشه).
- هر بایت ورودی رو بصورت مرحلهای با این تجمع کننده، XOR میکنه و مقدار تجمع کننده رو بروزرسانی میکنه.
- بایتهای نهایی تجمعکننده رو بعنوان پسوند به بافر اضافه میکنه.
- بعدش بافر ترکیب شده (داده اصلی + پسوند) رو از طریق b.so در یک مسیر فایل مشخص مینویسه.
یک جفت نصب کننده/حذف کننده ی دو مرحلهای از سه کلید پیکربندی استفاده میکنن: persistency_origin، persistency_payload و persistency_backup. روال اصلی چک میکنه که هر سه مقدار تنظیم شده باشن، در صورت نیاز فایل پشتیبان رو به مبدا برمیگردونه و سپس فایل پیلود رو حذف میکنه. این روال کدهای وضعیت متمایزی (0x4B/0x4C/0x4D) برمیگردونه که به ورودیهای جدول پیام برای “پیکربندی وجود نداره”، “جابجایی ناموفق” و “حذف ناموفق” نگاشت میشن. یک روال مشابه، هنگامیکه فلگ سراسری پرسیست فعال باشه، بطور شرطی فایل پشتیبان رو ایجاد یا خالی میکنه (با fopen با حالت “w”).
دریافت درصد باتری از طریق sysfs: یک ابزار مقدار ظرفیت باتری رو از sysfs منبع تأمین برق میخونه و دو مکان رایج رو بررسی میکنه:
|
1 2 |
/sys/class/power_supply/battery/capacity /sys/class/power_supply/Battery/capacity |
دو روال، مسیر کاری رو در حافظه خصوصی برنامه تنظیم و آماده میکنن:
- اولی یسری دایرکتوری می سازه، 0771 (0x1F9) رو اعمال میکنه، بصورت موقت حق اجرا (execute) رو به والد اضافه میکنه و مسیرش رو در تنظیمات ذخیره میکنه. اگه با دسترسی root اجرا بشه، تلاش میکنه یک tmpfs در اون مکان مانت کنه تا موارد ساخته شده در حافظه نگهداری بشن.
- دومی (پاکسازی/نهایی سازی) میتونه، وقتی root هستش و دایرکتوری وجود داره، دستور زیر رو اجرا و نتیجه رو ارسال کنه. بعدش حالت اصلی دایرکتوری والد رو بازیابی و بافر مسیر رو آزاد میکنه.
|
1 |
lsof | grep <working_dir> |
کشف پروسس بر اساس برچسب امنیتی SELinux و بر اساس cmdline: دو تابع کمکی /proc رو پیمایش میکنن و فایلهای مربوط به هر PID رو میخونن:
- یکی مقدار /proc/%d/attr/current رو با یک context هدف مقایسه میکنه و بعدش تأیید میکنه که PPID پروسس برابر ۱ هستش. (شناسه پروسس والد ۱)
- دومی، /proc/%d/cmdline رو با cmdline هدف مقایسه میکنه. در صورت تطابق، PID رو در پارامتر خروجی نوشته و موفق رو برمیگردونه.
چاپ یک آرایه ی متغیر با هدف دیباگ: یک روال که ویژه فرایند توسعه هستش، یک ساختار آرایه ای رو چاپ میکنه. این روال نامهای نوع رو از یک جدول، قالب بندی میکنه، آرایههای بایت کوتاه رو در داخل [] نمایش میده و یک کاراکتر واحد رو برای یک نوع خاص، به ازای هر عنصر در یک خط، چاپ میکنه. این مورد شبیه به کدهای دیباگ باقی مانده هستش و توسط کد فراخوانی نمیشه.
هیچ یک از این توابع کمکی در حلقه ی اصلی اجرای این مولفه فراخوانی نمیشن. حضور اونا با یک معماری مرحلهای سازگارِ که در اون Shared Objectهای لوود شده بعدی، که چارچوب کامل LANDFALL رو تشکیل میدن، جمع آوری داده و پرسیست رو با استفاده از قابلیتهای از پیش کامپایل شده در این لودر، گسترش خواهند داد.