
Erkennungsskript für CVE-2026-11374
Ein Erkennungsskript für die Exploit-Voraussetzung von CVE-2026-11374, eine Schwachstelle mit vorhersagbarem SSO-Ticket, die zu einer nicht authentifizierten Kontoübernahme in der gesamten ManageEngine-AD360-Suite führt. Die vier betroffenen Produkte teilen sich das ManageEngineADSFramework:
| Produkt | Betroffener Build | Fix-Build |
|---|---|---|
| ADSelfService Plus | ≤ 6528 | 6529 |
| RecoveryManager Plus | ≤ 6320 | 6321 |
| M365 Manager Plus | ≤ 4816 | 4817 |
| ADAudit Plus | ≤ 8702 | 8703 |
In betroffenen Builds ist das SSO-Ticket lediglich System.currentTimeMillis() (ein vorhersagbarer Zeitstempel), der beim Login des Opfers abgetastet wird, sodass es über das Cookie CUSTOM_SSO_TICKET replaybar ist, um diese Sitzung zu übernehmen. Der Fix ersetzt das Ticket durch UUID.randomUUID() (eine ausreichend zufällige Kennung). Der Replay-Pfad ist nur erreichbar, wenn das Produkt in AD360 integriert ist: ADSFilter macht ihn von isProductIntegrated() abhängig. Diese Hürde ist die Voraussetzung, die dieses Werkzeug prüft.
HINWEIS: Dieser Detektor bestätigt die Voraussetzung, nicht die Schwachstelle selbst. Ein
POTENTIALLY_AFFECTED-Ergebnis ist kein bestätigtes „verwundbar“-Urteil – siehe unten für weitere Informationen.
Ja. Das Werkzeug ist für den Produktions- und Bewertungseinsatz konzipiert.
1700000000000, ein Millisekundenwert, der so weit in der Vergangenheit liegt, dass er nie im Cache liegen kann), sodass niemals eine Sitzung erlangt wird. Der Server teilt uns lediglich mit, die gesendeten Cookies zu löschen.GET, und die einzigen betroffenen Cookies sind die Wegwerf-Cookies, die das Werkzeug sendet.Der Patch für CVE-2026-11374 änderte nur, wie das Ticket erzeugt wird (von Millisekunden zu UUID); er änderte nicht den Cookie-Replay-Pfad, den diese Sonde testet. Daher antwortet eine gepatchte Installation Byte für Byte identisch zu einer anfälligen auf jede nicht authentifizierte Anfrage.
Was das Werkzeug ohne Authentifizierung und nicht destruktiv tun kann:
Was es nicht kann:
POTENTIALLY_AFFECTED-Ergebnis bedeutet, dass die Voraussetzung erfüllt ist und Sie den Patch-Stand überprüfen sollten, nicht dass der Host als verwundbar bestätigt ist.conf/product.conf oder das aktive Auflösen eines Live-Tickets (echte Exploitation, die hier bewusst nicht implementiert ist).?build= ist manchmal der echte Build und manchmal ein eingefrorener Platzhalter, der unterhalb des Fix-Builds liegt. Ein Wert unterhalb des Fix-Builds ist daher mehrdeutig, und das Werkzeug markiert ihn als nicht schlüssig. Ein Wert auf oder über dem Fix-Build ist weiterhin ein vertrauenswürdiges „gepatcht“-Signal, da der Platzhalter immer zu niedrig ist, um ihn zu erreichen.requests. Installation mit
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
Die Standard-Ports unterscheiden sich je nach Produkt (ADSelfService Plus 8888, ADAudit Plus 8081, M365 Manager Plus 8365, RecoveryManager Plus 8090); übergeben Sie daher eine URL oder host:port. Ein bloßer Host verwendet standardmäßig 8888.
| Flag | Beschreibung |
|---|---|
targets | Ein oder mehrere host, host:port oder https://host:port |
-f, --targets-file FILE | Ziele aus einer Datei lesen (eine pro Zeile; #-Kommentare) |
--brief | Eine einzelne ausgerichtete Zeile pro Ziel, gut zum Scannen vieler Hosts |
--json | Strukturierte JSON-Ergebnisse ausgeben |
--timeout SECS | Timeout pro Anfrage (Standard: 15) |
--no-build | Die zusätzliche Build-Nummer-Anfrage bei einem positiven Befund überspringen |
--no-color | Farbige Ausgabe deaktivieren (respektiert auch NO_COLOR und Nicht-TTY) |
Eine in AD360 integrierte Konsole (ausführlich, Standard). Die zweite Zeile stellt klar, dass es sich um die Voraussetzung und nicht um ein „verwundbar“-Urteil handelt; die dritte ist der Best-Effort-Build-Hinweis:
$ ./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)
Eine eigenständige Installation desselben Produkts, bei der der Replay-Pfad nicht aktiv ist:
$ ./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.
Scannen einer Liste mit einer ausgerichteten Zeile pro Host (--brief). Der Exit-Status ist 1, wenn ein Host POTENTIALLY_AFFECTED ist, andernfalls 0, was in Skripten praktisch ist. Die abschließende Notiz zeigt das identifizierte Produkt sowie bei einem Befund die Build-Nummer:
$ ./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
Maschinenlesbare Ausgabe (--json). Jedes Ergebnis enthält das verdict, den zugrunde liegenden state und detail, das identifizierte product sowie – bei einem Befund – ein build-Objekt: build ist die gefundene Nummer, fixed_build der Schwellenwert für dieses Produkt, patch_hint die richtungsweisende Einschätzung (likely_patched bei oder über dem Fix-Build, andernfalls inconclusive) und note eine kurze Erklärung: