
استكشاف تعليمي معمّق في الحماية المدمجة من البرمجيات الخبيثة في أنظمة Apple: قواعد بيانات التوقيعات، قواعد YARA، تكامل Gatekeeper، ثنائيات المعالجة (الإصلاح)، وسير عمل الكشف في macOS.
استكمالًا لسلسلة مقالات مدونتي حول مقدمة إلى macOS، قررت تخصيص مقالة قصيرة لـ XProtect.
XProtect هو نظام مكافحة الفيروسات وتوقيعات البرامج الضارة المدمج في macOS من Apple.
يعمل كجزء من XProtectService، الذي يفحص التطبيقات والمحتوى القابل للتنفيذ الآخر بحثًا عن توقيعات برامج ضارة معروفة.
يعمل XProtect في الخلفية ويتم تحديثه بصمت بواسطة Apple عبر آلية XProtectRemediator (المزيد حول ذلك لاحقًا).
لديه 3 وظائف رئيسية:
الدليل /Library/Apple/System/Library/CoreServices/XProtect.bundle هو الحزمة الرئيسية التي تحتوي على تكوين XProtect وتعريفات التوقيعات.
هذا دليل نظام للقراءة فقط ويتم تحديثه بصمت بواسطة Apple عبر تحديثات XProtect.
تحت هذا الدليل، يمكننا العثور على بعض الملفات ذات الأهمية، وكلها تُحدَّث دوريًا بواسطة Apple ومحمية بواسطة حماية سلامة النظام (SIP).
الملف /Library/Apple/System/Library/CoreServices/XProtect.bundle/Contents/Resources/XProtect.plist يخزن توقيعات البرامج الضارة التي يستخدمها XProtect للكشف عن التهديدات المعروفة.
يحتوي على إدخالات تربط عائلات البرامج الضارة بقواعد كشف محددة، بما في ذلك التجزئات (hashes) وأنماط أسماء الملفات.
إليك مثال على عائلة برامج ضارة واحدة - Bundalore:
<dict>
<key>Description</key>
<string>OSX.Bundlore.D</string>
<key>LaunchServices</key>
<dict>
<key>LSItemContentType</key>
<string>com.apple.application-bundle</string>
</dict>
<key>Matches</key>
<array>
<dict>
<key>MatchFile</key>
<dict>
<key>NSURLTypeIdentifierKey</key>
<string>com.apple.applescript.script</string>
</dict>
<key>MatchType</key>
<string>Match</string>
<key>Pattern</key>
<string>46617364654153</string>
</dict>
<dict>
<key>MatchFile</key>
<dict>
<key>NSURLTypeIdentifierKey</key>
<string>com.apple.applescript.script</string>
</dict>
<key>MatchType</key>
<string>Match</string>
<key>Pattern</key>
<string>20006500630068006F002000</string>
</dict>
<dict>
<key>MatchFile</key>
<dict>
<key>NSURLTypeIdentifierKey</key>
<string>com.apple.applescript.script</string>
</dict>
<key>MatchType</key>
<string>Match</string>
<key>Pattern</key>
<string>20007C0020006F00700065006E00730073006C00200065006E00630020002D006100650073002D003200350036002D0063006600620020002D007000610073007300200070006100730073003A</string>
</dict>
<dict>
<key>MatchFile</key>
<dict>
<key>NSURLTypeIdentifierKey</key>
<string>com.apple.applescript.script</string>
</dict>
<key>MatchType</key>
<string>Match</string>
<key>Pattern</key>
<string>002D00730061006C00740020002D00410020002D00610020002D00640020007C002000620061007300680020002D0073</string>
</dict>
</array>
</dict>
هذا النص قابل للقراءة إلى حد كبير، والجزء الجدير بالملاحظة الوحيد هو أن وسيط string في كل تطابق هو تمثيل سداسي عشري، على سبيل المثال 002D00730061006C00740020002D00410020002D00610020002D00640020007C002000620061007300680020002D0073 يقابل -salt -A -a -d | bash -s.
هذا، بالطبع، منجم ذهب لمؤلفي البرامج الضارة، الذين يعرفون بالضبط الأنماط التي يجب تجنبها.
الملف /Library/Apple/System/Library/CoreServices/XProtect.bundle/XProtect.meta.plist هو ملف بيانات وصفية يحدد قواعد إضافية لـ XProtect، بما في ذلك سياسات الإنفاذ ومعلومات الإصدارات.
يحدد إصدارات macOS التي تفرض قواعد XProtect معينة والإجراءات المتخذة عند الكشف، بالإضافة إلى قوائم الحظر للإضافات (plugins).
إليك مثال:
<key>JavaWebComponentVersionMinimum</key>
<string>1.6.0_45-b06-451</string>
<key>PlugInBlacklist</key>
<dict>
<key>10</key>
<dict>
<key>com.apple.java.JavaAppletPlugin</key>
<dict>
<key>MinimumPlugInBundleVersion</key>
<string>14.8.0</string>
<key>PlugInUpdateAvailable</key>
<true/>
</dict>
<key>com.apple.java.JavaPlugin2_NPAPI</key>
<dict>
<key>MinimumPlugInBundleVersion</key>
<string>14.8.0</string>
<key>PlugInUpdateAvailable</key>
<true/>
</dict>
<key>com.macromedia.Flash Player ESR.plugin</key>
<dict>
<key>MinimumPlugInBundleVersion</key>
<string>18.0.0.382</string>
<key>PlugInUpdateAvailable</key>
<true/>
</dict>
<key>com.macromedia.Flash Player.plugin</key>
<dict>
<key>MinimumPlugInBundleVersion</key>
<string>32.0.0.101</string>
<key>PlugInUpdateAvailable</key>
<true/>
</dict>
<key>com.microsoft.SilverlightPlugin</key>
<dict>
<key>MinimumPlugInBundleVersion</key>
<string>5.1.41212.0</string>
<key>PlugInUpdateAvailable</key>
<true/>
</dict>
<key>com.oracle.java.JavaAppletPlugin</key>
<dict>
<key>MinimumPlugInBundleVersion</key>
<string>1.8.51.16</string>
<key>PlugInUpdateAvailable</key>
<true/>
</dict>
</dict>
</dict>
كما ترى، تحتوي هذه على معلومات إصدار للإضافات "المحظورة"، على سبيل المثال.
في الإصدارات الحديثة، يبدو أن XProtect بدأ في دعم YARA.
الملف /Library/Apple/System/Library/CoreServices/XProtect.bundle/Contents/Resources/XProtect.yara يحتوي على عدة قواعد YARA بصيغة نصية، إليك مثال قصير منه:
rule XProtect_MACOS_SLEEPYSTEGOSAURUS_SYM {
meta:
description = "MACOS.SLEEPYSTEGOSAURUS.SYM"
uuid = "BB4F7D16-C939-4047-A9AF-E74E7B51FAC1"
strings:
$a1 = { 45 78 65 63 43 6D 64 }
$a2 = { 47 65 74 48 6F 73 74 49 6E 66 6F }
$a3 = { 52 75 6E 53 63 72 69 70 74 }
$a4 = { 52 75 6E 53 63 72 69 70 74 55 72 6C }
$a5 = { 4C 61 75 6E 63 68 50 6C 69 73 74 }
$a6 = { 43 68 65 63 6B 50 72 6F 63 65 73 73 }
$a7 = { 43 68 65 63 6B 49 6E }
$a8 = { 52 75 6E 43 6D 64 46 69 6C 65 }
$a9 = { 53 68 6F 77 48 74 6D 6C }
$a10 = { 50 6C 69 73 74 48 65 6C 70 65 72 }
$a11 = { 4C 61 75 6E 63 68 64 48 65 6C 70 65 72 }
$a12 = { 43 6F 6D 6D 61 6E 64 46 69 6C 65 }
$a13 = { 57 72 69 74 65 50 6C 69 73 74 }
$a14 = { 4A 53 4F 4E 46 69 6C 65 50 72 6F 63 65 73 73 6F 72 }
$a15 = { 43 68 72 6F 6D 65 48 65 6C 70 65 72 }
$a16 = { 53 61 6E 64 62 6F 78 65 72 }
condition:
Macho and filesize < 2MB and all of them
}
هذه ليست مقالة حول قواعد YARA، ولكن كما في السابق - هذا منجم ذهب لمؤلفي البرامج الضارة (على سبيل المثال 43 68 65 63 6B 50 72 6F 63 65 73 73 هي CheckProcess).
هنا يمكنك رؤية كيف صممت Apple دمج XProtect مع Gatekeeper - على الرغم من أن هذا الملف يُستخدم غالبًا بواسطة syspolicyd.
الملف /Library/Apple/System/Library/CoreServices/XProtect.bundle/Contents/Resources/gk.db هو قاعدة بيانات SQLite تحتوي على "قائمة حظر" لتجزئات الملفات ومعرفات الفرق (team IDs) التي يجب حظرها.
يمكنك عرضه باستخدام أداة sqlite3:
jbo@McJbo ~ $ sqlite3 "/Library/Apple/System/Library/CoreServices/XProtect.bundle/Contents/Resources/gk.db" .schema
CREATE TABLE settings (name TEXT, value TEXT, PRIMARY KEY (name));
CREATE TABLE blocked_hashes (hash BLOB, hash_type INTEGER, flags INTEGER, PRIMARY KEY (hash, hash_type));
CREATE TABLE blocked_teams (team_id TEXT, flags INTEGER, PRIMARY KEY (team_id));
jbo@McJbo ~ $ sqlite3 "/Library/Apple/System/Library/CoreServices/XProtect.bundle/Contents/Resources/gk.db" "SELECT * FROM blocked_teams LIMIT 5;"
F9X83Q5222|1
Q6XAB4776L|0
DK5C9Y86C8|0
8VK2WEPW22|0
5LWMEF3EX3|0
jbo@McJbo ~ $
هذه مرة أخرى معلومات مثيرة للاهتمام لمؤلفي البرامج الضارة، على سبيل المثال - لمعرفة متى يكون معرف الفريق (Team ID) الذي استخدموه لتوقيع برامجهم الضارة على رادار Apple.
بينما يعيش الملف الثنائي XProtect تحت /Library/Apple/System/Library/CoreServices/XProtect.app/Contents/MacOS/، ستجد ملفات ثنائية إضافية هناك.
تلك هي ملفات معالجة لعائلات محددة:
jbo@McJbo ~ $ ls -l /Library/Apple/System/Library/CoreServices/XProtect.app/Contents/MacOS/
total 47256
-rwxr-xr-x 1 root wheel 513696 Feb 27 16:54 XProtect
-rwxr-xr-x 1 root wheel 2498784 Feb 27 16:54 XProtectRemediatorAdload
-rwxr-xr-x 1 root wheel 2367952 Feb 27 16:54 XProtectRemediatorBadGacha
-rwxr-xr-x 1 root wheel 2053968 Feb 27 16:54 XProtectRemediatorBlueTop
-rwxr-xr-x 1 root wheel 2332752 Feb 27 16:54 XProtectRemediatorBundlore
-rwxr-xr-x 1 root wheel 2299648 Feb 27 16:54 XProtectRemediatorCardboardCutout
-rwxr-xr-x 1 root wheel 2333248 Feb 27 16:54 XProtectRemediatorColdSnap
-rwxr-xr-x 1 root wheel 2052736 Feb 27 16:54 XProtectRemediatorCrapyrator
-rwxr-xr-x 1 root wheel 2859040 Feb 27 16:54 XProtectRemediatorDolittle
-rwxr-xr-x 1 root wheel 2205520 Feb 27 16:54 XProtectRemediatorDubRobber
-rwxr-xr-x 1 root wheel 2334752 Feb 27 16:54 XProtectRemediatorEicar
-rwxr-xr-x 1 root wheel 2053120 Feb 27 16:54 XProtectRemediatorFloppyFlipper
-rwxr-xr-x 1 root wheel 2053616 Feb 27 16:54 XProtectRemediatorGenieo
-rwxr-xr-x 1 root wheel 2053504 Feb 27 16:54 XProtectRemediatorGreenAcre
-rwxr-xr-x 1 root wheel 2332800 Feb 27 16:54 XProtectRemediatorKeySteal
-rwxr-xr-x 1 root wheel 4659088 Feb 27 16:54 XProtectRemediatorMRTv3
-rwxr-xr-x 1 root wheel 2382448 Feb 27 16:54 XProtectRemediatorPirrit
-rwxr-xr-x 1 root wheel 2333024 Feb 27 16:54 XProtectRemediatorRankStank
-rwxr-xr-x 1 root wheel 2299728 Feb 27 16:54 XProtectRemediatorRoachFlight
-rwxr-xr-x 1 root wheel 2384416 Feb 27 16:54 XProtectRemediatorSheepSwap
-rwxr-xr-x 1 root wheel 2053232 Feb 27 16:54 XProtectRemediatorSnowBeagle
-rwxr-xr-x 1 root wheel 2350624 Feb 27 16:54 XProtectRemediatorSnowDrift
-rwxr-xr-x 1 root wheel 2019712 Feb 27 16:54 XProtectRemediatorToyDrop
-rwxr-xr-x 1 root wheel 2105696 Feb 27 16:54 XProtectRemediatorTrovi
-rwxr-xr-x 1 root wheel 2332768 Feb 27 16:54 XProtectRemediatorWaterNet
jbo@McJbo ~ $
تطبيق نظام XProtect جديد مخزن في /Library/Apple/System/Library/CoreServices/XProtect.app تم تقديمه في macOS Monterey، وهو مسؤول عن تشغيل XProtect Remediator.
على عكس XProtect التقليدي (الذي استخدم في المقام الأول الكشف القائم على التوقيعات)، يقوم XProtect Remediator بفحص وإزالة البرامج الضارة من الأنظمة المصابة بشكل نشط.
يعمل كعملية خلفية ويمكنه إزالة التهديدات المكتشفة تلقائيًا دون تدخل المستخدم.
الدليل /Library/Apple/System/Library/CoreServices/XProtect.app/Contents/Resources يحتوي على نصوص المعالجة (remediation scripts) ومنطق كشف إضافي للفحص النشط.
الملف /Library/Apple/System/Library/CoreServices/XProtect.app/Contents/Resources/com.apple.XProtect.agent.scan.plist يحتوي على إعدادات حول موعد إجراء عمليات الفحص الدورية.
على سبيل المثال:
<key>com.apple.XProtect.PluginService.agent.slow.scan</key>
<dict>
<key>Repeating</key>
<true/>
<key>PowerNap</key>
<true/>
<key>CPUIntensive</key>
<true/>
<key>DiskIntensive</key>
<true/>
<key>AllowBattery</key>
<false/>
<key>Priority</key>
<string>Utility</string>
<key>Interval</key>
<integer>604800</integer>
</dict>
يوضح هذا شروط أداء معينة وحتى فترة الفحص (604800 ثانية = مرة كل 7 أيام).
ربما سمع بعضكم عن MRT (Malware Removal Tool).
المخزن في /Library/Apple/System/Library/CoreServices/MRT.app، MRT هو مكوّن أمان آخر في macOS يعمل جنبًا إلى جنب مع XProtect.
وهو مسؤول عن إزالة البرامج الضارة التي اكتشفها XProtect ويعمل بصمت في الخلفية.
MRT أكثر حزمًا من XProtect في استئصال التهديدات المكتشفة ويمكنه إزالة الملفات الضارة حتى إذا كانت قيد التشغيل حاليًا.
لاحظ أنه على عكس XProtect، لا يحتفظ MRT بملفات تكوين - كل شيء مدمج في الملف الثنائي.
حتى النظر إلى السلاسل النصية للملف الثنائي الرئيسي (/Library/Apple/System/Library/CoreServices/MRT.app/Contents/MacOS/MRT) يكشف عن سلاسل مثيرة للاهتمام، على سبيل المثال:
import sys,base64;exec(base64.b64decode('
import sys,base64,warnings;warnings.filterwarnings('ignore');exec(base64.b64decode('
import sys;import re, subprocess;cmd = "ps -ef | grep Little\ Snitch | grep -v grep"
عند تنزيل ملف عبر متصفح أو تطبيق (مثل Safari أو Mail أو Messages)، يتم تمييزه بعلامة حجر صحي (com.apple.quarantine) - لقد ذكرت هذه العلامة بالفعل في مقالة مدونتي السابقة حول Gatekeeper.
يتحقق Gatekeeper مما إذا كان الملف موقّعًا وموثّقًا (notarized). إذا لم يكن كذلك، يتلقى المستخدم تحذيرًا قبل التنفيذ.
إذا كان التنفيذ مسموحًا، يفحص XProtect الملف مقابل توقيعات البرامج الضارة المعروفة لديه (من XProtect.plist وXProtect.yara وما إلى ذلك).
إذا تم اكتشاف برامج ضارة، يمنع النظام التنفيذ. إذا كانت البرامج الضارة معروفة ويمكن معالجتها، فقد يقوم XProtect Remediator أو MRT بحذفها أو تحييدها.
تقوم Apple بتحديث XProtect وMRT وXProtect Remediator بصمت في الخلفية عبر عملية XProtectService.
في وقت سابق من هذا العام، نشرت CheckPoint مقالة حول عينة برامج ضارة أطلق عليها اسم Banshee.
حظيت باهتمام كبير لأنها استخدمت نفس خوارزمية التشفير التي تستخدمها ملفات XProtect Remediator الثنائية "لإخفاء قواعد YARA الخاصة بها".
الخوارزمية نفسها بسيطة:
def macos_xprotect_string_decryption(encrypted: bytes, encr_key: int) -> str:
"""
Author: @Check Point Research
Decrypts MacOS Xprotect binaries & Banshee Stealer encrypted strings.
"""
decrypted = "".join(
chr(
(encr_key >> ((i * 8) & 0x38) & 0xFF) ^ encrypted[i]
)
for i in range(len(encrypted))
)
return decrypted.partition("\\x00")[0]
من الواضح أن مؤلفي البرامج الضارة اعتقدوا أنه لا يمكن اكتشاف هذه الخوارزمية عبر توقيع ثابت (لأنها مضمونة لتوليد نتائج إيجابية خاطئة).
وجدت كودًا مشابهًا في معظم ملفات المعالجة الثنائية، على سبيل المثال:
10000592a if (data_1000ffe7e != 0)
10000592c void* rax_1 = &data_1000fb0a0
100005933 int64_t i = 0
100005951 do
100005940 *rax_1 = *rax_1 ^ (0x363a34363a303900 u>> (i.b & 0x38)).b
100005943 i = i + 8
100005947 rax_1 = rax_1 + 1
100005951 while (i != 0x26ef0)
100005953 data_1000ffe7e = 0
باحث الأمن الذي اكتشف ذلك في البداية (ald3ns) أصدر أداة تسمى XPR-dump يبدو أنها ما تزال تعمل على أحدث إصدار من XProtect. يجب عليك بالتأكيد إلقاء نظرة عليها!
أهم خلاصة من هذه المقالة هي أن XProtect يلعب لعبة القط والفأر مع المهاجمين (تمامًا مثل أي برنامج مكافحة فيروسات) - القوائم السوداء، وتشغيل YARA أو التوقيعات الثابتة البسيطة كلها ضمن النطاق.
حقيقة أن هذه الملفات تُنشر على جميع نقاط النهاية وسهلة التحليل تجعل من السهل جدًا لمؤلفي البرامج الضارة إيجاد طرق تجاوز سهلة للكثير من هذه الفحوصات.
ترقبوا المزيد!
Jonathan Bar Or (https://jonathanbaror.com)