
Sicherer, nicht authentifizierter Patch-Status-Prüfer für Check Point CPM RCE CVE-2026-93616; prüft den UpgradeSvcRemote SOAP-Login auf TCP 19009, ohne ihn auszunutzen.
Eine unauthentifizierte Prüfung des Patch-Status für CVE-2026-93616, den unauthentifizierten Directory
Traversal im Check Point Security Management (CPM)-Server, der Runtime.exec() erreicht,
behoben in
sk1000171 am 2026-09-22. CWE-22,
CVSS 9.8 Kritisch (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H), in freier Wildbahn ausgenutzt.
Check Point ist die CNA; das Problem wurde durch In-the-Wild-Ausnutzung identifiziert
und nicht durch einen externen Bericht.
Der CPM-Server stellt SOAP-Webdienste auf TCP 19009 bereit. Die UpgradeSvcRemote-Login-
Methode loginAsApplicationReadOnlyPublicSession leitet ihren targetVersion-Parameter
in einen Dateisystempfad weiter, der an Runtime.exec übergeben wird, ohne Validierung, sodass ein
unauthentifizierter Aufrufer die Ausführung auf ein vom Angreifer gewähltes Skript umleiten kann. Der Fix fügt ein Bean-
Validation-Muster zu targetVersion hinzu, das ein Pfadtrennzeichen ablehnt.
Das Skript meldet, ob dieser Fix auf jedem Ziel vorhanden ist. Es sendet ein illegales
Zeichen in targetVersion, niemals eine Traversal-Sequenz, und authentifiziert sich nicht,
lädt keine Datei hoch und führt nichts auf dem Ziel aus. Ein anderes Ergebnis als VULNERABLE
bedeutet nicht für sich genommen, dass ein Ziel gepatcht ist; siehe
Interpretation nicht-verwundbarer Ergebnisse.
End-of-Support-Builds werden explizit behandelt. Bei Zügen älter als R81.10 nimmt die Login-Methode
weniger Parameter entgegen, sodass die primäre Sonde durch XML-Unmarshalling abgelehnt wird, bevor der Patch-
Status gelesen werden kann. Wenn ein Check Point-Server die Sonde auf diese Weise ablehnt, sendet das Skript
einen Folgeaufruf in der älteren Parameterform. Wenn die Login-Methode dann dispatcht, ist das
Ziel ein betroffener Build, für den Check Point nie einen Fix veröffentlicht hat, und das Urteil lautet
VULNERABLE mit dem Grund affected-eos-no-fix. Der Folgeaufruf enthält kein mode
und kein targetVersion, sodass auch er nichts zu validieren und nichts zu traversieren sendet. Dies
schließt eine Lücke, in der ein Legacy-Server andernfalls als nicht identifizierbar gelesen würde.
# 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+, nur Standardbibliothek — keine Drittanbieter-Pakete.
Führen Sie das Tool gegen die Management-Server aus (Security Management, Multi-Domain Management, Log, Multi-Domain Log und SmartEvent), nicht gegen die Gateways. Die Prüfung zielt auf den CPM-SOAP-Listener auf TCP 19009, den die Gateways nicht betreiben.
| Flag | Beschreibung |
|---|---|
TARGET | Ein oder mehrere HOST[:PORT]-Ziele; der Port ist standardmäßig 19009 |
-f, --targets-file FILE | Ziele aus einer Datei lesen (eine pro Zeile; #-Kommentare) |
-p, --port PORT | Standardport, wenn ein Ziel keinen angibt (Standard: 19009) |
--timeout SECS | Timeout pro Sonde (Standard: 15) |
--workers N | Gleichzeitige Ziele (Standard: 16); die Ausgabe bleibt in Eingabereihenfolge |
-b, --brief | Eine ausgerichtete Zeile pro Ziel, zum Scannen vieler Hosts |
--json | Strukturiertes JSON ausgeben, einschließlich der Sondenmarker pro Ziel |
--no-color | Farbige Ausgabe deaktivieren (berücksichtigt auch NO_COLOR und Nicht-TTY) |
Verwundbarer Server (Standardausgabe; der [!]-Marker und VULNERABLE werden auf
einem TTY rot angezeigt):
$ ./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
Gepatchter Server:
$ ./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)
Ein Check Point-Management-Server, der geantwortet, aber die Login-Methode nicht dispatcht hat, sodass der Patch-Status nicht gelesen werden konnte:
$ ./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
Mehrere Ziele mit --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
JSON-Ausgabe mit --json. Die Sondenmarker sind enthalten, damit das Urteil gegen
das, was die Antwort tatsächlich enthielt, überprüft werden kann:
$ ./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": ""
}
}
]
Die Prüfung ist für die Verwendung gegen Produktionssysteme gedacht:
!) in targetVersion; dieses eine Zeichen reicht aus, um die Validierung des gepatchten Builds auszulösen,
und es kann nicht wie ein Pfadtrennzeichen aus einem Verzeichnis entkommen. Die Legacy-
Folgesonde enthält überhaupt kein targetVersion.domainId-Element weg, sodass auf einem ungepatchten
Server die Methode eine NullPointerException beim Aufbau ihrer Parameter auslöst, bevor
ReflectionUtils Runtime.exec erreicht. Selbst ohne das löst der Sondenwert
sich in ein Verzeichnis auf, das nicht existiert, sodass kein Skript ausgeführt werden kann. Die Legacy-Sonde sendet
nur einen Anwendungsnamen und ein Timeout, sodass sie nichts hat, woraus sie einen Pfad bilden könnte.