
CVE-2026-41089 PoC — تجاوز سعة المخزن المؤقت للمكدس في Netlogon عبر CLDAP (CVSS 9.8 حرجة)
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██╗ ██████╗ ██████╗
██╔════╝██║ ██║██╔════╝ ██║ ██║███║██╔═████╗██╔═████╗
██║ ██║ ██║█████╗ ███████║╚██║██║██╔██║██║██╔██║
██║ ╚██╗ ██╔╝██╔══╝ ██╔══██║ ██║████╔╝██║████╔╝██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ██║ ██║╚██████╔╝╚██████╔╝
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝
تنفيذ برمجيات عن بعد في Windows Netlogon عبر تجاوز سعة المخزن المؤقت للمكدس في CLDAP
حزمة UDP واحدة مصممة إلى المنفذ 389 تؤدي إلى تجاوز سعة مخزن مؤقت للمكدس بحجم 528 بايت داخل LSASS على أي Domain Controller غير مصحح. تتعطل العملية. يعاد تشغيل DC بعد حوالي 60 ثانية. لا حاجة لمصادقة.
| ناقل الهجوم | UDP 389 (CLDAP)، قبل المصادقة، بدون بيانات اعتماد |
| التأثير | تعطل LSASS، إعادة تشغيل DC، إمكانية RCE |
| CWE | CWE-121 (تجاوز سعة المخزن المؤقت للمكدس) |
| متجه CVSS | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| تاريخ النشر | 12 مايو 2026 بواسطة Microsoft |
python3 poc.py 10.0.50.21 corp.local
ثلاث مراحل: ping عادي لتأكيد أن DC حي، ping تجاوز السعة مع اسم مستخدم بطول 130 حرفًا، فحص البقاء على قيد الحياة. يستغرق حوالي 10 ثوانٍ.
كل إصدار من Windows Server يعمل كـ Domain Controller:
| إصدار الخادم | الإصدار الذي تم الإصلاح فيه |
|---|---|
| 2012 / 2012 R2 | تصحيحات ESU فقط |
| 2016 | 10.0.14393.9140 |
| 2019 | 10.0.17763.8755 |
| 2022 | 10.0.20348.5074 |
| 2022 23H2 | 10.0.25398.2330 |
| 2025 | 10.0.26100.32772 |
NlGetLocalPingResponse تخصص مخزنًا مؤقتًا للمكدس بحجم 528 بايت وتمرره إلى BuildSamLogonResponse. تستدعي تلك الدالة NetpLogonPutUnicodeString لكتابة اسم الخادم واسم المجال وGUIDs واسم المستخدم الذي يتحكم به المهاجم في المخزن المؤقت.
الخلل: NetpLogonPutUnicodeString تستقبل طولًا أقصى بالبايت ولكنها تعامله كعدد WCHAR. كل سلسلة مكتوبة عبر هذا المسار تشغل ضعف المساحة المتوقعة. حقل "User" في مرشح CLDAP (حتى 130 wchar، 260 بايت على الشبكة) يدفع الكتابة المجمعة لتتجاوز حد 528 بايت.
I_NetLogonLdapLookupEx
-> NlGetLocalPingResponse // 528-byte stack buffer
-> LogonRequestHandler
-> BuildSamLogonResponse
-> NetpLogonPutUnicodeString // byte/WCHAR size confusion
python3 poc.py <target_ip> <domain_name> [options]
| العلم | الوصف | الافتراضي |
|---|---|---|
-l | طول اسم المستخدم بالأحرف | 130 |
-t | مهلة استقبال UDP (بالثواني) | 5 |
-d | التأخير بين تجاوز السعة وفحص البقاء على قيد الحياة (بالثواني) | 3 |
# اختبار الاتصال (اسم مستخدم قصير، بدون تجاوز سعة)
python3 poc.py 10.0.50.21 corp.local
# محاولة تجاوز السعة الافتراضية
python3 poc.py 10.0.50.21 corp.local -l 130
# حمولة أكبر، مهلة أطول للشبكات البطيئة
python3 poc.py 10.0.50.21 corp.local -l 200 -t 10
يتطلب Python 3.8+. لا حزم خارجية.
يؤدي تجاوز السعة إلى رفض الخدمة (تعطل LSASS، إعادة تشغيل DC). من الناحية النظرية، إمكانية RCE عبر إفساد المكدس ممكنة. هذا الـ PoC لا يحاول تنفيذ برمجيات.
الشبكة. افحص حركة CLDAP بحثًا عن طلبات بحث حيث تتجاوز سمة التصفية "User" 20-30 حرفًا. تستخدم pings مواقع DC العادية أسماء حسابات الخدمة (سلاسل قصيرة).
المضيف. راقب حالات تعطل LSASS المرتبطة بـ netlogon.dll (معرف الحدث 1000). فعّل تسجيل تصحيح Netlogon:
nltest /dbflag:0x2080ffff
mov edx, 0x40 لتقليل الحد الأقصى لطول اسم المستخدم إلى النصف)قانوني. هذا الكود موجود لأغراض البحث الأمني المصرح به والتعليم. اختبر فقط على الأنظمة التي تملكها أو لديك إذن كتابي لاختبارها. الوصول غير المصرح به لأنظمة الحاسوب ينتهك CFAA والقوانين المماثلة في معظم الولايات القضائية.