العودة إلى التحديثات
UpdatedJul 30, 2026

CVE-2026-11374-check — Updated!

نص برمجي للكشف عن CVE-2026-11374

مشاركة

CVE-2026-11374 ManageEngine AD360 نص كشف الشرط الأساسي لـ

نص كشف للشرط الأساسي لاستغلال CVE-2026-11374، وهو ثغرة في تذكرة الدخول الموحد (SSO) القابلة للتوقع تؤدي إلى الاستيلاء على الحسابات دون مصادقة عبر مجموعة ManageEngine AD360. المنتجات الأربعة ضمن النطاق تشترك في إطار ManageEngineADSFramework:

المنتجالإصدار المتأثرالإصدار المعالج
ADSelfService Plus≤ 65286529
RecoveryManager Plus≤ 63206321
M365 Manager Plus≤ 48164817
ADAudit Plus≤ 87028703

في الإصدارات المتأثرة، تكون تذكرة الدخول الموحد مجرد 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 الأربعة، أو وكيل يزيل ملف تعريف ارتباط الجلسة).
INCONCLUSIVEHTTP 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
ملف تعريف ارتباط منتج، بدون تنظيف، حالة ≠ 400UNAFFECTED (مستقل / غير مدمج)
لا يوجد ملف تعريف ارتباط لمنتج ضمن النطاق، حالة ≠ 400UNAFFECTED (ليس أحد المنتجات الأربعة)
رؤوس تنظيف ولكن ملف تعريف ارتباط منتج غير معروفUNAFFECTED (ManageEngine، خارج النطاق)
HTTP 400INCONCLUSIVE (على الأرجح قفل تحديد معدل 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، عامله كمكشوف ويستحق التأكيد، ثم:

  1. تأكيد مستوى الإصلاح مباشرة (لا تستطيع الأداة ذلك). اقرأ conf/product.conf (build_number) على المضيف وقارنه بالإصدار المعالج لذلك المنتج (ADSelfService Plus 6529, RecoveryManager Plus 6321, M365 Manager Plus 4817, ADAudit Plus 8703). فسره بشكل توجيهي: إصدار عند أو فوق الإصدار المعالج هو مؤشر قوي على أن المضيف معالج، لأن إصلاح UUID موجود في ذلك الفرع. إصدار أقل من الإصدار المعالج غير حاسم وليس دليلاً على الضعف، لأن التصحيحات السريعة والترجيعات خارج النطاق يمكنها تطبيق إصلاح UUID دون زيادة رقم الإصدار؛ في هذه الحالة، ارجع إلى فحص تنسيق التذكرة أدناه.

  2. تحقق من تنسيق التذكرة المنشأة إذا كان بإمكانك تسجيل الدخول. ملف تعريف الارتباط CUSTOM_SSO_TICKET ليس HttpOnly، لذا بعد المصادقة يمكنك قراءة قيمته: رقم مكون من 13 رقمًا يعني ضعيف، UUID يعني معالج. هذا هو أوضح فحص إيجابي.

  3. قم بالتحديث إلى الإصدار المعالج (أو أحدث) على أي مضيف ضعيف أو لا يمكنك تأكيد معالجته. الاستبدال يستبدل التذكرة القابلة للتوقع بـ UUID عشوائي.

  4. ابحث عن محاولات الاستغلال. على المضيف، يسجل serverOut_<date>.txt التقييد كدفقات من:

    IAMSecurityException ErrorCode: URL_ROLLING_THROTTLES_LIMIT_EXCEEDED,
    RequestURI: "/showLogin.cc", RemoteAddr: <source IP>
    

    زيادة مفاجئة في URL_ROLLING_THROTTLES_LIMIT_EXCEEDED على مسارات توزيع SSO/تسجيل الدخول من عنوان IP مصدر واحد هي مؤشر قوي على هجوم القوة الغاشمة للتذاكر. راجع أيضًا عمليات تسجيل الدخول الناجحة الحديثة ونشاط الجلسة للبحث عن علامات الاستيلاء.

  5. تقليل التعرض في هذه الأثناء. قيد الوصول الشبكي إلى مجموعة AD360 (لا ينبغي أن تكون مواجهة للإنترنت)، وإذا لم يكن مسار إعادة التشغيل مطلوبًا، فإن تعطيل تكامل CustomSSO يزيل الشرط الأساسي بالكامل.

المعالجة

قم بتحديث المنتج المتأثر إلى الإصدار المعالج على الأقل (ADSelfService Plus 6529, RecoveryManager Plus 6321, M365 Manager Plus 4817, ADAudit Plus 8703) أو أحدث. الاستبدال يستبدل تذكرة SSO القابلة للتوقع System.currentTimeMillis() بـ UUID.randomUUID().

الترخيص

هذا الكود موزع تحت رخصة MIT.

إخلاء مسؤولية قانوني

استخدام هذه الأداة لمهاجمة أهداف دون موافقة متبادلة مسبقة غير قانوني. إنها مسؤولية المستخدم النهائي الامتثال لجميع القوانين المحلية والولائية والاتحادية المعمول بها. المطورون لا يتحملون أي مسؤولية ولا يتحملون مسؤولية أي سوء استخدام أو ضرر ناتج عن هذا البرنامج.

انظر أيضًا

الفئات