
CVE-2026-11374 के लिए पता लगाने की स्क्रिप्ट
CVE-2026-11374 के शोषण पूर्व-शर्त का पता लगाने के लिए एक डिटेक्शन स्क्रिप्ट, जो एक अनुमानित SSO-टिकट दोष है जो ManageEngine AD360 सूट में अप्रमाणित खाता अधिग्रहण की ओर ले जाता है। दायरे में आने वाले चार उत्पाद ManageEngineADSFramework साझा करते हैं:
| उत्पाद | प्रभावित बिल्ड | फिक्स्ड बिल्ड |
|---|---|---|
| ADSelfService Plus | ≤ 6528 | 6529 |
| RecoveryManager Plus | ≤ 6320 | 6321 |
| M365 Manager Plus | ≤ 4816 | 4817 |
| ADAudit Plus | ≤ 8702 | 8703 |
प्रभावित बिल्ड में SSO टिकट केवल System.currentTimeMillis() (एक अनुमानित टाइमस्टैम्प) होता है जिसे पीड़ित के लॉगिन के समय नमूना लिया जाता है, इसलिए इसे CUSTOM_SSO_TICKET कुकी के माध्यम से रीप्ले करके उस सत्र का अपहरण किया जा सकता है। फिक्स टिकट को UUID.randomUUID() (एक पर्याप्त रूप से यादृच्छिक पहचानकर्ता) से बदल देता है। रीप्ले पथ केवल तभी पहुंच योग्य है जब उत्पाद AD360-एकीकृत हो: ADSFilter इसे isProductIntegrated() पर गेट करता है। यह गेट ही वह पूर्व-शर्त है जिसकी यह उपकरण जाँच करता है।
नोट: यह डिटेक्टर पूर्व-शर्त की पुष्टि करता है, स्वयं भेद्यता की नहीं।
POTENTIALLY_AFFECTEDपरिणाम पुष्टिकृत-संवेदनशील निर्णय नहीं है — अधिक जानकारी के लिए नीचे देखें।
हाँ। यह प्रोडक्शन और आकलन उपयोग के लिए बनाया गया है।
1700000000000, एक मिलीसेकंड मान जो अतीत में इतना दूर है कि वह कभी कैश-निवासी नहीं हो सकता) भेजता है, इसलिए कोई सत्र कभी पुनर्प्राप्त नहीं होता। सर्वर केवल हमें बताता है कि हमने जो कुकीज़ भेजी थीं उन्हें साफ़ कर दे।GET है, और प्रभावित होने वाली एकमात्र कुकीज़ वे डिस्पोज़ेबल कुकीज़ हैं जिन्हें उपकरण भेजता है।CVE-2026-11374 के पैच ने केवल टिकट उत्पन्न करने के तरीके को बदला (मिलीसेकंड से UUID); इसने उस कुकी-रीप्ले पथ को नहीं बदला जिसे यह प्रोब उपयोग करता है। परिणामस्वरूप, एक पैच किया गया इंस्टॉल किसी भी अप्रमाणित अनुरोध के लिए एक संवेदनशील इंस्टॉल के समान बाइट-दर-बाइट प्रतिक्रिया करता है।
उपकरण अप्रमाणित और गैर-विनाशकारी रूप से यह कर सकता है:
यह क्या नहीं कर सकता:
POTENTIALLY_AFFECTED परिणाम का अर्थ है कि पूर्व-शर्त पूरी होती है और आपको पैच स्तर सत्यापित करना चाहिए, यह नहीं कि होस्ट पुष्टिकृत रूप से संवेदनशील है।conf/product.conf पढ़ना, या सक्रिय रूप से एक लाइव टिकट का समाधान करना (वास्तविक शोषण, जानबूझकर यहाँ लागू नहीं किया गया)।?build= कभी-कभी वास्तविक बिल्ड होता है और कभी-कभी एक स्थिर प्लेसहोल्डर होता है जो फिक्स्ड बिल्ड से नीचे पढ़ता है, इसलिए फिक्स्ड बिल्ड से नीचे का मान अस्पष्ट है और उपकरण उसे अनिर्णायक चिह्नित करता है। फिक्स्ड बिल्ड के बराबर या उससे ऊपर का मान अभी भी एक विश्वसनीय पैच किया हुआ संकेत है, क्योंकि प्लेसहोल्डर हमेशा उस तक पहुँचने के लिए बहुत कम होता है।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 पर जाता है।
एक 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)। यदि कोई होस्ट POTENTIALLY_AFFECTED है तो निकास स्थिति 1 है, अन्यथा 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"
}
]
| कोड | अर्थ |
|---|---|
0 | किसी भी लक्ष्य ने POTENTIALLY_AFFECTED नहीं लौटाया |
1 | कम से कम एक लक्ष्य POTENTIALLY_AFFECTED है |
किसी भी CustomSSO URL (*.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 "पुष्टिकृत संवेदनशील" नहीं है। यह शोषण पूर्व-शर्त है। क्योंकि पैच ने इस कोड पथ को नहीं छुआ, एक पैच किया गया बिल्ड समान रूप से प्रतिक्रिया करता है, इसलिए आपको पैच स्तर को बैंड-बाहर पुष्टि करनी होगी (अगले चरण देखें)। एक अप्रमाणित पर्यवेक्षक यही अधिकतम जान सकता है।HTTP 400 वास्तविक उत्तर के बजाय दर-सीमा लॉक हो सकता है। Zoho IAM एक URL रोलिंग थ्रॉटल लागू करता है जो स्रोत IP को लगभग 40 अनुरोध प्रति 60 सेकंड पर सीमित करता है, फिर उस पथ को ~60 सेकंड के लिए लॉक कर देता है। लॉक के दौरान, अनुरोध HTTP 400 लौटाते हैं और एकीकरण संकेत छिप जाता है। उपकरण इन्हें INCONCLUSIVE के रूप में रिपोर्ट करता है; लगभग एक मिनट बाद उस IP से पुनः प्रयास करें।UNAFFECTED के रूप में रिपोर्ट किया जा सकता है। यदि आप वहाँ ManageEngine उत्पाद की अपेक्षा करते हैं तो सीधे पुष्टि करें।?v=) और M365 (?bN=) हमेशा वास्तविक बिल्ड उजागर करते हैं; ADSSP का ?build= कभी-कभी वास्तविक होता है और कभी-कभी एक स्थिर प्लेसहोल्डर होता है जो फिक्स्ड बिल्ड से नीचे पढ़ता है, इसलिए फिक्स्ड बिल्ड से नीचे का 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>
एकल स्रोत IP से SSO/लॉगिन डिस्पैच पथों पर URL_ROLLING_THROTTLES_LIMIT_EXCEEDED की वृद्धि टिकट ब्रूट-फोर्सिंग का एक मजबूत संकेत है। हाल ही के सफल लॉगिन और सत्र गतिविधि की समीक्षा भी करें ताकि अधिग्रहण के संकेत मिल सकें।
प्रभावित उत्पाद को कम से कम फिक्स्ड बिल्ड (ADSelfService Plus 6529, RecoveryManager Plus 6321, M365 Manager Plus 4817, ADAudit Plus 8703) या बाद के संस्करण में अपडेट करें। फिक्स अनुमानित System.currentTimeMillis() SSO टिकट को UUID.randomUUID() से बदल देता है।
यह कोड MIT लाइसेंस के अंतर्गत वितरित किया गया है।
पूर्व पारस्परिक सहमति के बिना लक्ष्यों पर हमला करने के लिए इस उपकरण का उपयोग अवैध है। अंतिम उपयोगकर्ता की जिम्मेदारी है कि वह सभी लागू स्थानीय, राज्य और संघीय कानूनों का पालन करे। डेवलपर्स कोई दायित्व नहीं मानते हैं और इस प्रोग्राम के कारण होने वाले किसी भी दुरुपयोग या क्षति के लिए जिम्मेदार नहीं हैं।
| फ़्लैग | विवरण |
|---|
targets | एक या अधिक host, host:port, या https://host:port |
-f, --targets-file FILE | फ़ाइल से लक्ष्य पढ़ें (प्रति पंक्ति एक; # टिप्पणियाँ) |
--brief | प्रति लक्ष्य एक संरेखित पंक्ति, कई होस्ट स्कैन करने के लिए अच्छा |
--json | संरचित JSON परिणाम उत्सर्जित करें |
--timeout SECS | प्रति-अनुरोध टाइमआउट (डिफ़ॉल्ट: 15) |
--no-build | सकारात्मक निष्कर्ष पर अतिरिक्त बिल्ड-नंबर अनुरोध छोड़ें |
--no-color | रंगीन आउटपुट अक्षम करें (NO_COLOR और गैर-TTY का भी सम्मान करता है) |
| निर्णय | अर्थ |
|---|
POTENTIALLY_AFFECTED | AD360-एकीकृत दायरे-में उत्पाद; CustomSSO कुकी-रीप्ले पथ सक्रिय है, इसलिए CVE-2026-11374 की शोषण पूर्व-शर्त पूरी होती है। यह पुष्टिकृत-संवेदनशील निर्णय नहीं है; पैच स्तर सत्यापित करें (अगले चरण देखें)। |
UNAFFECTED | रीप्ले पथ पहुंच योग्य नहीं है। इनमें से कोई भी: एक स्टैंडअलोन दायरे-में उत्पाद (AD360-एकीकृत नहीं — हालाँकि बाद में एकीकृत होने पर यह पहुंच योग्य हो जाएगा, इसलिए बिल्ड की जाँच करें); एक ManageEngine ADS-फ्रेमवर्क उत्पाद जो दायरे के चार उत्पादों में से नहीं है; या प्रतिक्रिया पर कोई दायरे-में उत्पाद ही नहीं (चार CVE-2026-11374 उत्पादों में से एक नहीं, या एक प्रॉक्सी जो सत्र कुकी हटा देता है)। |
INCONCLUSIVE | एक HTTP 400 — संभवतः IAM दर-सीमा लॉक संकेत को छिपा रहा है; ~60 सेकंड बाद पुनः प्रयास करें। |
ERROR | कनेक्शन/टाइमआउट/TLS विफलता। |
2 | उपयोग त्रुटि (गलत तर्क / अपठनीय लक्ष्य फ़ाइल) |
| प्रोब प्रतिक्रिया | निर्णय |
|---|
| क्लीनअप हेडर और एक ज्ञात दायरे-में उत्पाद कुकी | POTENTIALLY_AFFECTED |
| उत्पाद कुकी, कोई क्लीनअप नहीं, स्थिति ≠ 400 | UNAFFECTED (स्टैंडअलोन / एकीकृत नहीं) |
| कोई दायरे-में उत्पाद कुकी नहीं, स्थिति ≠ 400 | UNAFFECTED (चार उत्पादों में से एक नहीं) |
| क्लीनअप हेडर लेकिन अपरिचित उत्पाद कुकी | UNAFFECTED (ManageEngine, दायरे में नहीं) |
HTTP 400 | INCONCLUSIVE (संभवतः IAM दर-सीमा लॉक; सीमाएँ देखें) |
इस बीच जोखिम कम करें। AD360 सूट तक नेटवर्क पहुँच प्रतिबंधित करें (यह इंटरनेट-सामना करने वाला नहीं होना चाहिए), और यदि रीप्ले पथ की आवश्यकता नहीं है, तो CustomSSO एकीकरण को अक्षम करना पूर्व-शर्त को पूरी तरह से हटा देता है।