
Verificador seguro de estado de patch não autenticado para Check Point CPM RCE CVE-2026-93616; sonda o login SOAP do UpgradeSvcRemote na porta TCP 19009 sem explorar.
Uma verificação não autenticada de estado de patch para CVE-2026-93616, a travessia de
diretório não autenticada no servidor Check Point Security Management (CPM) que alcança
Runtime.exec(), corrigida em
sk1000171 em 2026-09-22. CWE-22,
CVSS 9.8 Crítico (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H), explorada em
ambiente real. A Check Point é a CNA; o problema foi identificado a partir de exploração
em ambiente real, e não de um relatório externo.
O servidor CPM expõe serviços web SOAP na porta TCP 19009. O método de login
loginAsApplicationReadOnlyPublicSession do UpgradeSvcRemote encaminha seu parâmetro
targetVersion para um caminho de sistema de arquivos passado a Runtime.exec sem
validação, de modo que um chamador não autenticado pode redirecionar a execução para um
script escolhido pelo atacante. A correção adiciona um padrão de Bean Validation a
targetVersion que rejeita um separador de caminho.
O script informa se essa correção está presente em cada alvo. Ele envia um único caractere
ilegal em targetVersion, nunca uma sequência de travessia, e não autentica, não faz
upload de arquivo nem executa nada no alvo. Um resultado diferente de VULNERABLE não
indica, por si só, que um alvo está corrigido; consulte
Interpretando resultados não vulneráveis.
Builds em fim de suporte são tratadas explicitamente. Em trilhas anteriores à R81.10, o
método de login recebe menos parâmetros, então a sonda primária é rejeitada pela
deserialização XML antes que o estado de patch possa ser lido. Quando um servidor Check
Point rejeita a sonda dessa forma, o script envia uma chamada de acompanhamento no formato
de parâmetros mais antigo. Se o método de login então despachar, o alvo é uma build
afetada para a qual a Check Point nunca publicou correção, e o veredito é VULNERABLE com
o motivo affected-eos-no-fix. A chamada de acompanhamento não carrega mode nem
targetVersion, portanto também não envia nada para validar nem nada para atravessar.
Isso fecha uma lacuna na qual um servidor legado seria, de outra forma, lido como não
identificável.
# single target (port defaults to 19009)
./cve_2026_93616_check.py mgmt.example.com
# explicit port
./cve_2026_93616_check.py mgmt.example.com:19009
# several targets
./cve_2026_93616_check.py mds-a.example.com mds-b.example.com
# scan a list, one target per line ('#' comments allowed), compact output
./cve_2026_93616_check.py -f targets.txt --brief
# machine-readable output for pipelines
./cve_2026_93616_check.py -f targets.txt --json > results.json
Python 3.8+, apenas biblioteca padrão — sem pacotes de terceiros.
Execute a ferramenta contra os servidores de gerenciamento (Security Management, Multi-Domain Management, Log, Multi-Domain Log e SmartEvent), não contra os gateways. A verificação tem como alvo o listener SOAP do CPM na porta TCP 19009, que os gateways não executam.
| Flag | Descrição |
|---|---|
TARGET | Um ou mais alvos HOST[:PORT]; a porta padrão é 19009 |
-f, --targets-file FILE | Lê alvos de um arquivo (um por linha; comentários com #) |
-p, --port PORT | Porta padrão quando um alvo não especifica uma (padrão: 19009) |
--timeout SECS | Timeout por sonda (padrão: 15) |
--workers N | Alvos simultâneos (padrão: 16); a saída permanece na ordem de entrada |
-b, --brief | Uma linha alinhada por alvo, para escanear muitos hosts |
--json | Emite JSON estruturado, incluindo os marcadores de sonda por alvo |
--no-color | Desativa saída colorida (também respeita NO_COLOR e não-TTY) |
Servidor vulnerável (saída padrão; o marcador [!] e VULNERABLE são exibidos em
vermelho em um TTY):
$ ./cve_2026_93616_check.py mgmt.example.com
[!] mgmt.example.com:19009: VULNERABLE [dispatched-without-validation]
loginAsApplicationReadOnlyPublicSession accepted an illegal targetVersion and dispatched it; the fix's input validation is absent
Servidor corrigido:
$ ./cve_2026_93616_check.py mgmt-dr.example.com
[+] mgmt-dr.example.com:19009: PATCHED [validation-constraint-present]
the server rejected an illegal targetVersion with the input-validation constraint added by the fix (Jumbo Hotfix R82.10 Take 45 or equivalent)
Um servidor de gerenciamento Check Point que respondeu mas não despachou o método de login, de modo que o estado de patch não pôde ser lido:
$ ./cve_2026_93616_check.py log.example.com
[?] log.example.com:19009: INCONCLUSIVE [cpm-no-dispatch]
a Check Point management fault came back, but the UpgradeSvcRemote login method did not dispatch, so patch state could not be read
Múltiplos alvos com --brief:
$ ./cve_2026_93616_check.py -f targets.txt --brief; echo "exit: $?"
VULNERABLE mgmt.example.com:19009 dispatched-without-validation
PATCHED mgmt-dr.example.com:19009 validation-constraint-present
INCONCLUSIVE log.example.com:19009 cpm-no-dispatch
UNAFFECTED web.example.com:19009 not-cpm
ERROR offline.example.com:19009 unreachable
exit: 1
Saída JSON com --json. Os marcadores de sonda são incluídos para que o veredito possa
ser conferido com o que a resposta realmente continha:
$ ./cve_2026_93616_check.py mgmt.example.com mgmt-dr.example.com --json
[
{
"target": "mgmt.example.com:19009",
"verdict": "VULNERABLE",
"reason": "dispatched-without-validation",
"detail": "loginAsApplicationReadOnlyPublicSession accepted an illegal targetVersion and dispatched it; the fix's input validation is absent",
"http_status": 500,
"probe": {
"http_status": 500,
"saw_validation": false,
"saw_dispatch": true,
"saw_cpm": true,
"note": ""
}
},
{
"target": "mgmt-dr.example.com:19009",
"verdict": "PATCHED",
"reason": "validation-constraint-present",
"detail": "the server rejected an illegal targetVersion with the input-validation constraint added by the fix (Jumbo Hotfix R82.10 Take 45 or equivalent)",
"http_status": 500,
"probe": {
"http_status": 500,
"saw_validation": true,
"saw_dispatch": true,
"saw_cpm": true,
"note": ""
}
}
]
A verificação destina-se ao uso contra sistemas de produção:
!) em targetVersion; esse único caractere é suficiente para acionar a
validação da build corrigida, e não pode escapar de um diretório como um separador de
caminho faria. A sonda de acompanhamento legada não carrega targetVersion algum.domainId, então em um servidor
não corrigido o método lança uma NullPointerException ao construir seus parâmetros,
antes que ReflectionUtils alcance Runtime.exec. Mesmo sem isso, o valor da sonda
resolve para um diretório que não existe, portanto não há script a executar. A sonda
legada envia apenas um nome de aplicação e timeout, então não tem nada a partir do qual
construir um caminho.