همونطور که در این پست اشاره کردیم، محققای کسپرسکی در یه گزارشی ، یه کمپین جاسوسی بنام Operation Triangulation رو افشاء کردن که دستگاههای iOS رو هدف قرار میداد . بعد از افشای این گزارش، آژانس امنیت و اطلاعات روسیه ، FSB ، ادعا کرد که اپل بکدور در اختیار NSA قرار میده تا باهاش آیفونهای موجود در روسیه رو هک کنن.
در ادامه ی تحقیق روی این کمپین، محققای کسپرسکی یه گزارش جدید از یکی از اجزای این کمپین بنام TriangleDB منتشر کردن و در اون به آنالیز این بدافزار پرداختن، که در این پست بهش پرداختیم.
در سالهای اخیر دستگاههای iOS به یکی از اهداف جاسوس افزارهای هدفمند مانند Pegasus و Predator و Reign و … تبدیل شدن. اغلب فرایند آلوده کردن دستگاه شامل زنجیره ای از اکسپلویتها هستش مثلا برای دور زدن سندباکس iMessage از پیوستهای مخرب استفاده شده و برای بدست آوردن امتیاز root از یه آسیب پذیری در کرنل. بنابراین کشف یه اکسپلویت منجر به کشف سایر اکسپلویتهای زنجیره و بدافزار نهایی نمیشه. مثلا در سال 2021 با بررسی بک آپ iTunes ، اکسپلویت FORCEDENTRY کشف شد اما در مراحل post exploit یه کدی از سرور دانلود و اجرا شده بود که در زمان آنالیز کشف نشد و در نتیجه محققین نتونستن دنباله اکسپلویت رو پیدا کنن.
در زمینه بررسی کمپین Operation Triangulation هم این اتفاق افتاده و محققین بعد از نیم سال تونستن به زنجیره کامل اکسپلویت دست پیدا کنن و جاسوس افزار مورد استفاده در این کمپین رو آنالیز و گزارشش رو منتشر کنن. شکل زیر زنجیره آلودگی Operation Triangulation رو نشون میده.
TriangleDB بعد از اینکه مهاجم از طریق آسیب پذیری کرنل ، امتیاز root رو بدست آورد ، در حافظه دستگاه هدف مستقر میشه. در حافظه مستقر شدن به این معنی هستش که اگه قربانی دستگاه رو ریبوت کنه، بدافزار از بین میره و مهاجم باید دوباره با ارسال یه پیام iMessage با یه پیوست مخرب ، دوباره اونو آلوده کنه ، یا بطور خلاصه، باید کل زنجیره اکسپلویت تکرار بشه.
اگه قربانی دستگاه رو ریبوت نکنه، بدافزار بعد از 30 روز خودش پاک میکنه ، مگه اینکه مهاجم زمان رو تمدید کنه.
TriangleDB با Objective-C توسعه داده شده . این زبان نام اعضاء و متدهایی که توسط توسعه دهنده انتخاب شده رو حفظ میکنه . در باینری این بدافزار، نام متدها مبهم نشده اما نام اعضای کلاس ها جوری انتخاب شده (اختصاری شده) که حدس زدن عملکردشون ، کار رو سخت میکنه :
مثال از متدهای کلاس ها |
مثال از اعضای کلاس |
-[CRConfig populateWithFieldsMacOSOnly] -[CRConfig populateWithSysInfo] -[CRConfig extendFor:] -[CRConfig getCInfoForDump] +[CRConfig sharedInstance] +[CRConfig unmungeHexString:] -[CRConfig init] -[CRConfig getBuildArchitecture] -[CRConfig cLS] -[CRConfig setVersion] -[CRConfig swapLpServerType] -[CRConfig setLpServerType:] |
NSString *pubKI; NSData *pubK; signed __int64 iDa; signed __int64 uD; NSString *deN; NSSTring *prT; NSString *seN; NSString *uDI; NSString *iME; NSString *meI; NSString *osV; CRPwrInfo *pwI; |
در برخی موارد البته میشه اختصارات رو حدس زد مثلا osV منظور نسخه iOS هستش یا iME منظور IMEI دستگاه هستش.
رشته ها با هگز انکد و با XOR رمز شدن . کد زیر کار رمزگشایی رشته ها رو برعهده داره:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
id +[CRConfig unmungeHexString:](id a1, SEL a2, id stringToDecrypt) { // code omitted while (1) { hexByte[0] = stringBytes[i]; hexByte[1] = stringBytes[i + 1]; encryptedByte = strtoul(hexByte, &__endptr, 16); if (__endptr == hexByte) break; i += 2LL; if (j) decryptedString[j] = encryptedByte ^ previousByte; else decryptedString[0] = encryptedByte; ++j; previousByte = encryptedByte; if (i >= stringLength) break; } decryptedString[j] = 0; // code omitted } |
بعد از اینکه بدافزار در حافظه مستقر و اجرا شد، با استفاده از کتابخانه Protobuf با سرور C2 ارتباط برقرار میکنه. در پیکربندی بدافزار دو نوع سرور قرار گرفته ، یکی اصلی و دیگری پشتیبان (fallback) که با فیلدهای lS و lSf در پیکربندی مشخص میشن. بطور کلی بدافزار با سرور اصلی تعامل داره، اما اگه مشکلی پیش بیاد با سوئیچ به متد [CRConfig swapLpServerType:]
از سرور پشتیبان استفاده میکنه.
پیامهای ارسالی و دریافتی با رمزنگاری متقارن 3DES و نامتقارن RSA رمز میشن. همه ارسالها هم روی HTTPS و با POST ارسال میشه. یه کوکی هم داره که توش یه کلید g با مقدار عددی از پارامتر پیکربندی pubKI داخلش هستش.
بدافزار بصورت دوره ای یسری پیام که حاوی اطلاعات سیستم هست از جمله نسخه بدافزار، شناسه های دستگاه مانند IMEI و MEID و شماره سریال و … ، یسری اطلاعات از پیکربندی بروزرسانی مثلا اینکه دانلود خودکار و نصب بروزرسانی ها فعال هست یا نه ، رو به سرور ارسال میکنه.
شکل زیر یه نمونه از این پیام رو که نسخه v1.7.0.5 بدافزار که روی iOS 15.3.1 در حال اجرا هست رو نشون میده :
دستوراتی که از سرور C2 میان بصورت پیامهای Protobuf هستش و دارای اسامی هستن که با CRX شروع میشن. Protobuf یا Protocol Buffers یه روش سریالیزه کردن اطلاعات هستش که توسط گوگل ارائه شده. یه همچین سینتکسی رو داره و میشه در زبانهای مختلف مانند سی پلاس ، گولنگ و پایتون و … ازش استفاده کرد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// polyline.proto syntax = "proto2"; message Point { required int32 x = 1; required int32 y = 2; optional string label = 3; } message Line { required Point start = 1; required Point end = 2; optional string label = 3; } message Polyline { repeated Point point = 1; optional string label = 2; } |
مفهوم دستوراتی که با CRX شروع میشن، مبهمه. مثلا برای لیست کردن دایرکتوریها از دستور CRXShowTables استفاده میشه، یا برای تغییر آدرس C2 از دستور CRXConfigureDBServer استفاده میشه. اما در مجموع 24 دستور رو پشتیبانی میکنه که برای اهداف زیر در نظر گرفته شده :
- تعامل با فایل سیستم مانند ایجاد ، دستکاری ، استخراج و حذف فایلها
- تعامل با پروسس ها مانند لیست کردن و بستن پروسس ها
- بدست آوردن داده های keychain که از اون برای سرقت اعتبارنامه های قربانی استفاده میکنه
- نظارت بر موقعیت جغرافیایی قربانی
- اجرای ماژولهای اضافی که فایلهای اجرایی Mach-O هستن. این باینری ها بصورت reflective لوود و باینری اونا در حافظه مستقر میشن.
یکی از دستورات جالب ، CRXPollRecords هستش که کارش اینه که تغییرات فولدرها رو مونیتور میکنه و دنبال فایلهای تغییر کرده ای هستش که مطابق با نام مدنظر مهاجمه، که بصورت regex بهش داده شده، هستش. برای نطارت بر تغییرات فولدرها یه Unix file descriptor از فولدر بدست میاره و یه vnode event handler بهش اختصاص میده. هر وقت بدافزار متوجه شد که تغییراتی رخ داده، event handler شروع به جستجوی فایلهای تغییر کرده مطابق با regex ای که مهاجم داده ، میکنه و اونارو به سرور C2 آپلود میکنه
پارامترهای این دستور :
نام پارامتر |
توضیحات |
p | مسیر دایرکتوری |
m | نام فایل بصورت regex |
sDC | مشخص میکنه که آیا دستور باید فایل هایی که قبل از شروع نظارت تغییر کردن رو هم استخراج کنه یا نه |
eWo | مشخص میکنه که آیا محتوای فایل باید فقط از طریق Wi-Fi استخراج بشه یا نه. |
در زیر 24 دستوری که بدافزار پشتیبانی میکنه رو مشاهده میکنید :
Command ID | نام اختصاص داده شده توسط توسعه دهنده |
توضیحات |
0xFEED | CRXBlank | بدون عملکرد |
0xF001 | N/A | حذف بدافزار از طریق خاتمه دادن به پروسسش |
0xF301 | CRXPause | ایجاد یه sleep براساس ثانیه |
0xFE01 | N/A | یه sleep بصورت شبه تصادفی رو با پارامترهای caS و caP ایجاد میکنه. زمان بین caP – caS و caP + caS انتخاب میشه. |
0xFB01 | CRXForward | مقدار caP رو برای دستور 0xFE01 تغییر میده. |
0xFB02 | CRXFastForward | مقدار caS رو برای دستور 0xFE01 تغییر میده. |
0xF201 | CRXConfigureDBServer | تغییر آدرس های اصلی و پشتیبان سرور C2 |
0xF403 | CRXUpdateConfigInfo | پارامترهای پیکربندی بدافزار رو تغییر میده. آرگومانهاش هم ،شناسه پارامتری که باید تغییر کنه و مقدار جدیدش هستش. نکته اینکه شناسه های پارمتر رشته های عددی هستن مثلا nineteen |
0xF101 | CRXExtendTimeout | طول عمر بدافزار رو براساس ثانیه افزایش میده. عمر بدافزار بطور پیش فرض 30 روز هست |
0xF601 | CRXQueryShowTables | لیستی از دایرکتوری های خاص رو با استفاده از fts API بدست میاره. |
0xF801 | CRXFetchRecordInfo | متادیتای یه فایل مانند مجوزها، سایز، زمان ایجاد و … رو بدست میاره. |
0xF501 | CRXFetchRecord | محتوای یه فایل بدست میاره. |
0xFC10 | CRXPollRecords | نظارت روی دایرکتوری هایی که داخلشون فایل هایی هستن که نامشون با regex که مهاجم مشخص کرده مطابقت داره. |
0xFC11 | CRXStopPollingRecords | توقف دستور CRXPollRecords |
0xFC01 | CRXFetchMatchingRecords | بدست آوردن فایلهایی که با Regex مهاجم مطابق دارن. |
0xF901 | CRXUpdateRecord | بسته به آرگومان iM دستور، داده ها رو در یه فایل مینویسه یا یه ماژول جدید به بدافزار اضافه میکنه. |
0xFA02 | CRXRunRecord | یه اجرایی Mach-O که بصورت reflective لوود شده رو اجرا میکنه |
0xF902 | CRXUpdateRunRecord | ماژول جدیدی رو به بدافزار اضافه و اجرا میکنه. |
0xFA01 | CRXDeleteRecord | بسته به آرگومان های دستور، یا یه ماژول بدافزار یا یه فایل با نام مشخص رو حذف می کنه. |
0xF402 | CRXGetSchemas | لیستی از پروسس های در حال اجرا رو بدست میاره. |
0xFB44 | CRXPurgeRecord | بسته به آرگومانهای فرمان، یه پروسس رو با یه PID مشخص، با SIGKILL یا SIGSTOP میبنده. |
0xFD01 | N/A | اطلاعاتی در خصوص برنامه های iOS نصب شده بدست میاره |
0xFB03 | CRXGetIndexesV2 | اطلاعات keychain رو بدست میاره. شروع به نظارت قفل صفحه میکنه و وقتی دستگاه آنلاک شد، داده های keychain از genp (پسوردهای عمومی) و inet ( پسوردهای اینترنت) و keys and cert tables ( گواهی ها ، کلیدها و شناسه های دیجیتال ) از دیتابیس /private/var/Keychains/keychain-2.db استخراج میکنه. نکته جالب اینکه بدافزار میتونه با نسخه های مختلف keychain ، از نسخه iOS 4 به بعد، کار کنه. |
0xF401 | N/A | اطلاعات مکانی قربانی از جمله مختصات، ارتفاع، جهت و سرعت حرکت بدست میاره. بطور پیش فرض این دستور زمانی کار میکنه که صفحه دستگاه خاموش باشه. البته این ویژگی با پیکربندی مجدد توسط مهاجم قابل تغییر هستش. |
محققا یسری چیزای جالب هم در حین آنالیز بدافزار مشاهده کردن از جمله اینکه :
- توسعه دهنده برای رمزگشایی رشته ها از عنوان unmunging استفاده میکنه. متدی که رشته هارو رمزگشایی میکنه
+[CRConfig unmungeHexString:]
هستش. - در خیلی از جاهای بدافزار از اصطلاحات دیتابیس استفاده شده و برای همین اسم بدافزار رو TriangleDB گذاشتن :
Entity | نام استفاده شده توسط توسعه دهنده |
Directory | Table |
File | Record |
Implant module | |
Process | Schema |
Keychain entry | Index, row |
C2 server | DB Server |
Geolocation information | DB Status |
Heartbeat | Diagnostic data |
Process of exchanging data with C2 server | Transaction |
Request to C2 server | Query |
iOS application | Operation |
- در حین آنالیز یه کلاسی بنام CRConfig رو پیدا کردن که برای ذخیره پیکربندی بدافزار مورد استفاده قرار میگیره، یه متدی داره بنام populateWithFieldsMacOSOnly ، که در هیچ جای نمونه بدافزار iOS ازش استفاده نشده اما نشون میده که دستگاه های macOS هم میتونن با یه بدافزار مشابه ، آلوده بشن.
بدافزار چندین مجوز (entitlements) از سیستم عامل درخواست میکنه. اما برخی از این مجوزها مانند دسترسی به دوربین ، میکروفون و مخاطبین و تعامل با دستگاهها از طریق بلوتوث در بدافزار استفاده نمیشه. احتمالا این گزینه ها در ماژولها مورد استفاده قرار میگیرن.
همه مواردی که بالا مطالعه کردید، فقط برای یکی از اجزای کمپین Operation Triangulation هستش و سایر اجزاء در حال آنالیز هستش.
اپل در بروزرسانی 21 ژوئن ، 31 خرداد ، 3 آسیب پذیری زیرودی اصلاح کره که دو تا از آسیب پذیری ها ، CVE-2023-32434 و CVE-2023-32435 مرتبط با این کمپین هستن.
در نهایت فایل نمونه این گزارش رو برای تحلیل و تمرین بیشتر، میتونید از صفحه گیتهابمون دریافت کنید.