
CVE-2026-11374-check — Updated!
نص برمجي للكشف عن CVE-2026-11374
CVE-2026-11374 ManageEngine AD360 نص كشف الشرط الأساسي لـ
نص كشف للشرط الأساسي لاستغلال CVE-2026-11374، وهو ثغرة في تذكرة الدخول الموحد (SSO) القابلة للتوقع تؤدي إلى الاستيلاء على الحسابات دون مصادقة عبر مجموعة ManageEngine AD360. المنتجات الأربعة ضمن النطاق تشترك في إطار ManageEngineADSFramework:
| المنتج | الإصدار المتأثر | الإصدار المعالج |
|---|---|---|
| ADSelfService Plus | ≤ 6528 | 6529 |
| RecoveryManager Plus | ≤ 6320 | 6321 |
| M365 Manager Plus | ≤ 4816 | 4817 |
| ADAudit Plus | ≤ 8702 | 8703 |
في الإصدارات المتأثرة، تكون تذكرة الدخول الموحد مجرد System.currentTimeMillis() (طابع زمني قابل للتوقع) يتم أخذها عند تسجيل دخول الضحية، لذا يمكن إعادة تشغيلها عبر ملف تعريف الارتباط CUSTOM_SSO_TICKET لاختطاف تلك الجلسة. يستبدل الإصلاح التذكرة بـ UUID.randomUUID() (معرف عشوائي كافٍ). مسار إعادة التشغيل يمكن الوصول إليه فقط عندما يكون المنتج مدمجًا مع AD360: ADSFilter يتحكم فيه عبر isProductIntegrated(). تلك البوابة هي الشرط الأساسي الذي يتحقق منه هذه الأداة.
ملاحظة: هذا الكاشف يؤكد الشرط الأساسي، وليس الثغرة نفسها. نتيجة
POTENTIALLY_AFFECTEDليست حكمًا مؤكدًا بالضعف — انظر أدناه لمزيد من المعلومات.
هل من الآمن تشغيلها؟
نعم. هي مصممة للاستخدام في الإنتاج والتقييم.
- لا يتم استغلال أي شيء. يرسل المسبار تذكرة دخول موحد غير صالحة (
1700000000000، قيمة ميلي ثانية قديمة بما يكفي بحيث لا يمكن أبدًا أن تكون موجودة في الذاكرة المؤقتة)، لذا لا يتم استرداد أي جلسة على الإطلاق. يخبرنا الخادم فقط بمسح ملفات تعريف الارتباط التي أرسلناها. - لا تغييرات في حالة الهدف. كل طلب هو
GETعادي، وملفات تعريف الارتباط الوحيدة المتأثرة هي تلك المؤقتة التي ترسلها الأداة. - لا هجوم بالقوة الغاشمة أو حل للجلسة. لا تحاول الأداة حل تذكرة الطابع الزمني النشط الذي من شأنه إثبات قابلية الاستغلال؛ هذا استغلال وليس كشفًا، وهو خارج النطاق هنا (انظر القيود).
ما يمكن وما لا يمكن لهذه الأداة إخبارك به
إصلاح CVE-2026-11374 غيّر فقط كيفية إنشاء التذكرة (من ميلي ثانية إلى UUID)؛ لم يغير مسار إعادة تشغيل ملف تعريف الارتباط الذي يمارسه هذا المسبار. نتيجة لذلك، يستجيب التثبيت المُعالَج بايت ببايت بشكل مطابق للتثبيت الضعيف لأي طلب غير مصادق.
ما يمكن للأداة فعله، بدون مصادقة وبدون تدمير:
- تأكيد أن منتجًا ضمن النطاق يمكن الوصول إليه لديه مسار إعادة تشغيل ملف تعريف الارتباط CustomSSO نشط (أي أنه مدمج مع AD360)، وهو الشرط الأساسي لاستغلال CVE-2026-11374.
- تحديد أي من المنتجات الأربعة هو، من خلال ملف تعريف ارتباط الجلسة الخاص بكل منتج.
- قراءة أفضل جهد لرقم إصدار الأصل كدليل. هذا متاح على ADSelfService Plus وADAudit Plus وM365 Manager Plus؛ غير متاح على RecoveryManager Plus.
ما لا يمكنه فعله:
- التفريق بين الضعيف والمعالج. لا توجد إشارة آمنة وسلبية وغير مصادقة لذلك. نتيجة
POTENTIALLY_AFFECTEDتعني أن الشرط الأساسي قد تحقق ويجب عليك التحقق من مستوى الإصلاح، وليس أن المضيف مؤكد الضعف. - تأكيد قابلية الاستغلال. إثبات أن المضيف قابل للاستغلال فعليًا يتطلب ملاحظة تنسيق تذكرة مُنشأة (رقم مكون من 13 رقمًا يعني ضعيف، UUID يعني معالج، وكلاهما يحتاج إلى رؤية مصادقة أو على المضيف)، أو قراءة
conf/product.confمحليًا، أو حل تذكرة حية بنشاط (استغلال حقيقي، لم يتم تنفيذه عمدًا هنا). - الثقة الكاملة في رقم إصدار ADSelfService Plus الأقل من الإصدار المعالج.
?build=في ADSSP هو أحيانًا الإصدار الحقيقي وأحيانًا عنصر نائب مجمد يقرأ أقل من الإصدار المعالج، لذلك القيمة الأقل من المعالج غامضة وتضعها الأداة كغير حاسمة. القيمة عند أو فوق الإصدار المعالج لا تزال إشارة موثوقة للمعالجة، لأن العنصر النائب دائمًا منخفض جدًا للوصول إليه.
المتطلبات
- بايثون 3.7+ ومكتبة
requests. قم بالتثبيت باستخدامpip install requests.
الاستخدام
# single host (prefer a URL or host:port; ports differ per product)
./cve_2026_11374_check.py https://adssp.example.com:8888
# multiple hosts (scheme optional: https is tried first, then http)
./cve_2026_11374_check.py host-a:8081 host-b:8365
# scan a list, one target per line ('#' comments allowed), compact output
./cve_2026_11374_check.py -f targets.txt --brief
# machine-readable output for pipelines
./cve_2026_11374_check.py -f targets.txt --json > results.json
المنافذ الافتراضية تختلف حسب المنتج (ADSelfService Plus 8888, ADAudit Plus 8081, M365 Manager Plus 8365, RecoveryManager Plus 8090)، لذا مرر عنوان URL أو host:port. المضيف العاري يستخدم 8888 افتراضيًا.
الخيارات
| العلم | الوصف |
|---|---|
targets | مضيف أو أكثر بصيغة host أو host:port أو https://host:port |
-f, --targets-file FILE | قراءة الأهداف من ملف (هدف واحد لكل سطر؛ يُسمح بالتعليقات #) |
--brief | سطر واحد محاذي لكل هدف، مفيد لمسح العديد من المضيفين |
--json | إخراج نتائج JSON منظمة |
--timeout SECS | مهلة لكل طلب (الافتراضي: 15) |
--no-build | تخطي طلب رقم الإصدار الإضافي عند الإيجابية |
--no-color | تعطيل الإخراج الملون (يحترم أيضًا NO_COLOR وغير TTY) |
أمثلة
وحدة تحكم مدمجة مع AD360 (مفصل، الافتراضي). يوضح السطر الثاني أن هذا هو الشرط الأساسي وليس حكم ضعف؛ الثالث هو دليل الإصدار الأفضل جهدًا:
$ ./cve_2026_11374_check.py https://adssp.example.com:8888
[!] https://adssp.example.com:8888: POTENTIALLY_AFFECTED
ADSelfService Plus: AD360-integrated, CustomSSO replay path active - precondition met. Not confirmed vulnerable; verify patch level (fixed build 6529).
build: 6519 (below fixed 6529 - inconclusive: ?build= may be a stale placeholder or a hotfix)
تثبيت مستقل لنفس المنتج، حيث مسار إعادة التشغيل غير نشط:
$ ./cve_2026_11374_check.py https://adssp.example.com:8888
[+] https://adssp.example.com:8888: UNAFFECTED
ADSelfService Plus: standalone / not AD360-integrated (no cleanup), so the replay path isn't reachable here. Verify build >= 6529 regardless.
مسح قائمة مع سطر واحد محاذي لكل مضيف (--brief). رمز الخروج هو 1 إذا كان أي مضيف POTENTIALLY_AFFECTED، وإلا 0، وهو مفيد في البرامج النصية. الملاحظة الطرفية تظهر المنتج المحدد، بالإضافة إلى رقم الإصدار عند العثور:
$ ./cve_2026_11374_check.py -f targets.txt --brief; echo "exit: $?"
POTENTIALLY_AFFECTED https://host-a:8888 ADSelfService Plus 6519
POTENTIALLY_AFFECTED http://host-b:8081 ADAudit Plus 8530
UNAFFECTED http://host-c:8365 M365 Manager Plus
UNAFFECTED https://host-d:443
INCONCLUSIVE http://host-e:8888 ADSelfService Plus
ERROR host-f:8888 timeout
exit: 1
إخراج قابل للقراءة آليًا (--json). كل نتيجة تحمل verdict و state و detail خلفها، و product المحدد، وعند العثور على شيء - كائن build: build هو الرقم الموجود، fixed_build هو الحد الأدنى لهذا المنتج، patch_hint هو التوجيه (likely_patched عند أو فوق الإصدار المعالج، وإلا inconclusive)، و note شرح قصير:
$ ./cve_2026_11374_check.py https://host-b:8081 --json
[
{
"target": "https://host-b:8081",
"state": "potentially_affected",
"detail": "ADAudit Plus: AD360-integrated, CustomSSO replay path active - precondition met ...",
"product": "ADAudit Plus",
"build": { "build": "8530", "fixed_build": "8703", "patch_hint": "inconclusive", "note": "below fixed 8703 - inconclusive: may be a hotfix" },
"verdict": "POTENTIALLY_AFFECTED"
}
]
الأحكام
| الحكم | المعنى |
|---|---|
POTENTIALLY_AFFECTED | منتج ضمن النطاق مدمج مع AD360؛ مسار إعادة تشغيل ملف تعريف الارتباط CustomSSO نشط، لذا تحقق الشرط الأساسي لاستغلال CVE-2026-11374. هذا ليس حكمًا مؤكدًا بالضعف؛ تحقق من مستوى الإصلاح (انظر الخطوات التالية). |
UNAFFECTED | مسار إعادة التشغيل غير قابل للوصول. إما: منتج مستقل ضمن النطاق (غير مدمج مع AD360 — على الرغم من أنه سيصبح قابلاً للوصول إذا تم دمجه لاحقًا، لذا تحقق من الإصدار على أي حال)؛ منتج من إطار ManageEngine ADS ليس أحد المنتجات الأربعة ضمن النطاق؛ أو لا يوجد منتج ضمن النطاق في الاستجابة على الإطلاق (ليس أحد منتجات CVE-2026-11374 الأربعة، أو وكيل يزيل ملف تعريف ارتباط الجلسة). |
INCONCLUSIVE | HTTP 400 — على الأرجح قفل تحديد معدل IAM يخفي الإشارة؛ أعد المحاولة بعد ~60 ثانية. |
ERROR | فشل الاتصال/المهلة/TLS. |
رموز الخروج
| الرمز | المعنى |
|---|---|
0 | لم يعيد أي هدف POTENTIALLY_AFFECTED |
1 | هدف واحد على الأقل هو POTENTIALLY_AFFECTED |
2 | خطأ في الاستخدام (وسائط خاطئة / ملف أهداف غير قابل للقراءة) |
كيف يعمل
أرسل تذكرة غير صالحة مع علامة تطبيق إلى أي عنوان URL لـ CustomSSO (*.do):
GET /AppsHome.do
Cookie: CUSTOM_SSO_TICKET=1700000000000; CUSTOM_SSO_APP_TAG_NAME=AD360
على تثبيت مدمج مع AD360، تعمل سلسلة ADSFilter → CustomSSOFilter → CookieSSOImpl في فرع الحل الخاص بها (العلامة تسمي منتجًا مختلفًا، لذا appName != prodName)، تفشل في حل التذكرة المزيفة، وتصدر رؤوس استجابة لتنظيف ملفات تعريف الارتباط:
Set-Cookie: CUSTOM_SSO_TICKET=removed; Max-Age=0; ...
Set-Cookie: CUSTOM_SSO_APP_NAME=removed; Max-Age=0; ...
Set-Cookie: CUSTOM_SSO_APP_TAG_NAME=removed; Max-Age=0; ...
التثبيت المستقل لا يشغل هذا المسار أبدًا ولا يصدر أي تنظيف. يتم تحديد المنتج من ملف تعريف ارتباط جلسة Tomcat الثابت الخاص بكل منتج (JSESSIONIDADSSP لـ ADSelfService Plus، وهكذا)، والذي يتم تعيينه في كل استجابة. يعتمد الفحص على الرؤوس بدلاً من رمز الحالة، حيث يُرجع ADSSP المدمج 302 بينما يُرجع ADAudit و M365 و RMP 200 لنفس المسبار.
| استجابة المسبار | الحكم |
|---|---|
| رؤوس تنظيف وملف تعريف ارتباط لمنتج معروف ضمن النطاق | POTENTIALLY_AFFECTED |
| ملف تعريف ارتباط منتج، بدون تنظيف، حالة ≠ 400 | UNAFFECTED (مستقل / غير مدمج) |
| لا يوجد ملف تعريف ارتباط لمنتج ضمن النطاق، حالة ≠ 400 | UNAFFECTED (ليس أحد المنتجات الأربعة) |
| رؤوس تنظيف ولكن ملف تعريف ارتباط منتج غير معروف | UNAFFECTED (ManageEngine، خارج النطاق) |
HTTP 400 | INCONCLUSIVE (على الأرجح قفل تحديد معدل IAM؛ انظر القيود) |
القيود
POTENTIALLY_AFFECTEDليس "مؤكد الضعف." إنه الشرط الأساسي للاستغلال. لأن الإصلاح لم يلمس مسار الكود هذا، فإن الإصدار المعالج يستجيب بشكل مماثل، لذا عليك تأكيد مستوى الإصلاح خارج النطاق (انظر الخطوات التالية). هذا هو الحد الأقصى لما يمكن للمراقب غير المصادق معرفته.- لا تأكيد نشط. الأداة لا تحاول أبدًا حل تذكرة حقيقية بالوقت الحالي. تلك التقنية يمكنها إثبات ضعف المضيف بشكل إيجابي، لكنها استغلال نشط (تختطف جلسة حية)، محدودة بالتقييد واحتمالية، وتحتاج إلى جلسة ضحية نشطة، لذا فهي مستبعدة من هذا الكاشف.
HTTP 400يمكن أن يكون قفل تحديد معدل وليس إجابة حقيقية. تطبق Zoho IAM تقييدًا متجددًا لعنوان URL يحد من عنوان IP المصدر بحوالي 40 طلبًا لكل 60 ثانية، ثم يقفل هذا المسار لمدة ~60 ثانية. أثناء القفل، ترجع الطلباتHTTP 400وتُخفي إشارة التكامل. تبلغ الأداة عن هذه كـINCONCLUSIVE؛ أعد المحاولة من عنوان IP هذا بعد حوالي دقيقة.- خلف وكيل عكسي، يمكن الإبلاغ عن وحدة تحكم تزيل أو تعيد كتابة ملف تعريف ارتباط الجلسة بشكل خاطئ كـ
UNAFFECTED. قم بالتأكيد مباشرة إذا كنت تتوقع وجود منتج ManageEngine هناك. - أرقام الإصدار هي تلميحات وليست أحكامًا. ADAudit (
?v=) و M365 (?bN=) دائمًا ما يكشفان الإصدار الحقيقي؛?build=في ADSSP هو أحيانًا حقيقي وأحيانًا عنصر نائب مجمد يقرأ أقل من الإصدار المعالج، لذا القيمة الأقل من المعالج في ADSSP غامضة؛ RMP لا يكشف أي شيء. في كل حالة، رقم إصدار عند أو فوق الإصدار المعالج يشير بقوة إلى المعالجة، وأدناه غير حاسم.
الخطوات التالية للمدافعين
إذا عاد هدف بـ POTENTIALLY_AFFECTED، عامله كمكشوف ويستحق التأكيد، ثم:
-
تأكيد مستوى الإصلاح مباشرة (لا تستطيع الأداة ذلك). اقرأ
conf/product.conf(build_number) على المضيف وقارنه بالإصدار المعالج لذلك المنتج (ADSelfService Plus 6529, RecoveryManager Plus 6321, M365 Manager Plus 4817, ADAudit Plus 8703). فسره بشكل توجيهي: إصدار عند أو فوق الإصدار المعالج هو مؤشر قوي على أن المضيف معالج، لأن إصلاح UUID موجود في ذلك الفرع. إصدار أقل من الإصدار المعالج غير حاسم وليس دليلاً على الضعف، لأن التصحيحات السريعة والترجيعات خارج النطاق يمكنها تطبيق إصلاح UUID دون زيادة رقم الإصدار؛ في هذه الحالة، ارجع إلى فحص تنسيق التذكرة أدناه. -
تحقق من تنسيق التذكرة المنشأة إذا كان بإمكانك تسجيل الدخول. ملف تعريف الارتباط
CUSTOM_SSO_TICKETليسHttpOnly، لذا بعد المصادقة يمكنك قراءة قيمته: رقم مكون من 13 رقمًا يعني ضعيف، UUID يعني معالج. هذا هو أوضح فحص إيجابي. -
قم بالتحديث إلى الإصدار المعالج (أو أحدث) على أي مضيف ضعيف أو لا يمكنك تأكيد معالجته. الاستبدال يستبدل التذكرة القابلة للتوقع بـ UUID عشوائي.
-
ابحث عن محاولات الاستغلال. على المضيف، يسجل
serverOut_<date>.txtالتقييد كدفقات من:IAMSecurityException ErrorCode: URL_ROLLING_THROTTLES_LIMIT_EXCEEDED, RequestURI: "/showLogin.cc", RemoteAddr: <source IP>زيادة مفاجئة في
URL_ROLLING_THROTTLES_LIMIT_EXCEEDEDعلى مسارات توزيع SSO/تسجيل الدخول من عنوان IP مصدر واحد هي مؤشر قوي على هجوم القوة الغاشمة للتذاكر. راجع أيضًا عمليات تسجيل الدخول الناجحة الحديثة ونشاط الجلسة للبحث عن علامات الاستيلاء. -
تقليل التعرض في هذه الأثناء. قيد الوصول الشبكي إلى مجموعة AD360 (لا ينبغي أن تكون مواجهة للإنترنت)، وإذا لم يكن مسار إعادة التشغيل مطلوبًا، فإن تعطيل تكامل CustomSSO يزيل الشرط الأساسي بالكامل.
المعالجة
قم بتحديث المنتج المتأثر إلى الإصدار المعالج على الأقل (ADSelfService Plus 6529, RecoveryManager Plus 6321, M365 Manager Plus 4817, ADAudit Plus 8703) أو أحدث. الاستبدال يستبدل تذكرة SSO القابلة للتوقع System.currentTimeMillis() بـ UUID.randomUUID().
الترخيص
هذا الكود موزع تحت رخصة MIT.
إخلاء مسؤولية قانوني
استخدام هذه الأداة لمهاجمة أهداف دون موافقة متبادلة مسبقة غير قانوني. إنها مسؤولية المستخدم النهائي الامتثال لجميع القوانين المحلية والولائية والاتحادية المعمول بها. المطورون لا يتحملون أي مسؤولية ولا يتحملون مسؤولية أي سوء استخدام أو ضرر ناتج عن هذا البرنامج.
انظر أيضًا
- NVD: CVE-2026-11374
- ManageEngine service packs: ADSelfService Plus · RecoveryManager Plus · M365 Manager Plus · ADAudit Plus
- Bishop Fox Blog: Full Technical Analysis