
Script de detecção para CVE-2026-11374
Um script de detecção para a pré-condição de exploração do CVE-2026-11374, uma falha previsível de ticket SSO que leva à tomada de conta não autenticada em toda a suíte ManageEngine AD360. Os quatro produtos no escopo compartilham o ManageEngineADSFramework:
| Produto | Build afetada | Build corrigida |
|---|---|---|
| ADSelfService Plus | ≤ 6528 | 6529 |
| RecoveryManager Plus | ≤ 6320 | 6321 |
| M365 Manager Plus | ≤ 4816 | 4817 |
| ADAudit Plus | ≤ 8702 | 8703 |
Nas builds afetadas, o ticket SSO é apenas System.currentTimeMillis() (um timestamp previsível) amostrado no login da vítima, portanto pode ser repetido por meio do cookie CUSTOM_SSO_TICKET para sequestrar essa sessão. A correção substitui o ticket por UUID.randomUUID() (um identificador suficientemente aleatório). O caminho de repetição só é alcançável quando o produto é integrado ao AD360: o ADSFilter o condiciona a isProductIntegrated(). Essa condição é a pré-condição que esta ferramenta verifica.
NOTA: este detector confirma a pré-condição, não a vulnerabilidade em si. Um resultado
POTENTIALLY_AFFECTEDnão é um veredito de vulnerabilidade confirmada — veja abaixo para mais informações.
Sim. Foi desenvolvido para uso em produção e avaliação.
1700000000000, um valor em milissegundos antigo o suficiente para nunca estar residente em cache), portanto nenhuma sessão é recuperada. O servidor apenas nos diz para limpar os cookies que enviamos.GET simples, e os únicos cookies afetados são os descartáveis que a ferramenta envia.O patch do CVE-2026-11374 alterou apenas a forma como o ticket é gerado (de milissegundos para UUID); não alterou o caminho de repetição de cookie que esta sonda exercita. Como resultado, uma instalação corrigida responde byte a byte de forma idêntica a uma vulnerável para qualquer requisição não autenticada.
O que a ferramenta pode fazer, de forma não autenticada e não destrutiva:
O que não pode fazer:
POTENTIALLY_AFFECTED significa que a pré-condição é atendida e que você deve verificar o nível do patch, não que o host esteja confirmado como vulnerável.conf/product.conf localmente ou resolver ativamente um ticket ativo (exploração real, intencionalmente não implementada aqui).?build= do ADSSP às vezes é a build real e às vezes um placeholder congelado que exibe um valor abaixo da build corrigida, portanto um valor abaixo do corrigido é ambíguo e a ferramenta o marca como inconclusivo. Um valor igual ou acima da build corrigida continua sendo um sinal confiável de correção, pois o placeholder é sempre baixo demais para alcançá-lo.requests. Instale com 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
As portas padrão diferem por produto (ADSelfService Plus 8888, ADAudit Plus 8081, M365 Manager Plus 8365, RecoveryManager Plus 8090), portanto informe uma URL ou host:port. Um host sem porta usa 8888 por padrão.
| Flag | Descrição |
|---|---|
targets | Um ou mais host, host:port ou https://host:port |
-f, --targets-file FILE | Lê os alvos de um arquivo (um por linha; comentários #) |
--brief | Uma única linha alinhada por alvo, boa para escanear muitos hosts |
--json | Emite resultados JSON estruturados |
--timeout SECS | Tempo limite por requisição (padrão: 15) |
--no-build | Pula a requisição extra do número de build em um resultado positivo |
--no-color | Desativa a saída colorida (também respeita NO_COLOR e não-TTY) |
Um console integrado ao AD360 (detalhado, o padrão). A segunda linha esclarece que isto é a pré-condição e não um veredito de vulnerabilidade; a terceira é a dica de build de melhor esforço:
$ ./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)
Uma instalação independente do mesmo produto, onde o caminho de repetição não está ativo:
$ ./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.
Escaneando uma lista com uma linha alinhada por host (--brief). O status de saída é 1 se algum host for POTENTIALLY_AFFECTED, caso contrário 0, o que é prático em scripts. A nota final mostra o produto identificado, além do número de build em um resultado:
$ ./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
Saída legível por máquina (--json). Cada resultado carrega o verdict, o state e o detail por trás dele, o product identificado e — quando há um resultado — um objeto build: build é o número encontrado, fixed_build é o limite para aquele produto, patch_hint é a indicação direcional (likely_patched para igual ou acima da build corrigida, caso contrário inconclusive), e note é uma breve explicação:
$ ./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"
}
]