
Check Point CPM RCE CVE-2026-93616 के लिए सुरक्षित अनऑथेंटिकेटेड पैच-स्टेट चेकर; बिना एक्सप्लॉइट किए TCP 19009 पर UpgradeSvcRemote SOAP लॉगिन की जाँच करता है।
CVE-2026-93616 के लिए एक अनधिकृत पैच-स्थिति जाँच, जो Check Point Security Management (CPM) सर्वर में अनधिकृत directory traversal है जो Runtime.exec() तक पहुँचती है, और जिसे 2026-09-22 को sk1000171 में ठीक किया गया। CWE-22, CVSS 9.8 Critical (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H), जंगल में शोषित। Check Point CNA है; यह समस्या किसी बाहरी रिपोर्ट के बजाय जंगल में शोषण से पहचानी गई थी।
CPM सर्वर TCP 19009 पर SOAP वेब सेवाएँ उजागर करता है। UpgradeSvcRemote लॉगिन विधि loginAsApplicationReadOnlyPublicSession अपने targetVersion पैरामीटर को बिना सत्यापन के Runtime.exec को दिए गए फ़ाइलसिस्टम पथ में अग्रेषित कर देती है, इसलिए एक अनधिकृत कॉलर निष्पादन को हमलावर-चयनित स्क्रिप्ट की ओर मोड़ सकता है। यह फिक्स targetVersion में एक Bean Validation पैटर्न जोड़ता है जो पथ विभाजक को अस्वीकार करता है।
यह स्क्रिप्ट बताती है कि प्रत्येक लक्ष्य पर वह फिक्स मौजूद है या नहीं। यह targetVersion में एक अवैध वर्ण भेजती है, कभी traversal अनुक्रम नहीं, और लक्ष्य पर प्रमाणीकरण, फ़ाइल अपलोड, या कुछ भी निष्पादित नहीं करती। VULNERABLE के अलावा कोई परिणाम अपने आप में यह नहीं दर्शाता कि लक्ष्य पैच किया गया है; देखें गैर-भेद्य परिणामों की व्याख्या।
End-of-support बिल्ड को स्पष्ट रूप से संभाला जाता है। R81.10 से पुराने ट्रेनों पर लॉगिन विधि कम पैरामीटर लेती है, इसलिए पैच स्थिति पढ़े जाने से पहले प्राथमिक प्रोब को XML unmarshalling द्वारा अस्वीकार कर दिया जाता है। जब कोई Check Point सर्वर प्रोब को इस तरह अस्वीकार करता है, तो स्क्रिप्ट पुराने पैरामीटर आकार में एक अनुवर्ती कॉल भेजती है। यदि लॉगिन विधि तब dispatch करती है, तो लक्ष्य एक प्रभावित बिल्ड है जिसके लिए Check Point ने कभी फिक्स प्रकाशित नहीं किया, और निर्णय VULNERABLE होता है जिसका कारण affected-eos-no-fix है। अनुवर्ती कॉल में कोई mode और कोई targetVersion नहीं होता, इसलिए यह भी सत्यापित करने के लिए कुछ नहीं और traverse करने के लिए कुछ नहीं भेजती। यह उस अंतराल को बंद करती है जिसमें एक लेगेसी सर्वर अन्यथा अज्ञात-पहचान के रूप में पढ़ा जाता।
# 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+, केवल मानक लाइब्रेरी — कोई तृतीय-पक्ष पैकेज नहीं।
उपकरण को प्रबंधन सर्वरों (Security Management, Multi-Domain Management, Log, Multi-Domain Log, और SmartEvent) के विरुद्ध चलाएँ, गेटवे के विरुद्ध नहीं। यह जाँच TCP 19009 पर CPM SOAP लिसनर को लक्षित करती है, जिसे गेटवे नहीं चलाते।
| Flag | Description |
|---|---|
TARGET | एक या अधिक HOST[:PORT] लक्ष्य; पोर्ट डिफ़ॉल्ट रूप से 19009 होता है |
-f, --targets-file FILE | किसी फ़ाइल से लक्ष्य पढ़ें (प्रति पंक्ति एक; # टिप्पणियाँ) |
-p, --port PORT | जब किसी लक्ष्य में पोर्ट न हो तो डिफ़ॉल्ट पोर्ट (डिफ़ॉल्ट: 19009) |
--timeout SECS | प्रति-प्रोब टाइमआउट (डिफ़ॉल्ट: 15) |
--workers N | समवर्ती लक्ष्य (डिफ़ॉल्ट: 16); आउटपुट इनपुट क्रम में रहता है |
-b, --brief | प्रति लक्ष्य एक संरेखित पंक्ति, कई होस्ट स्कैन करने के लिए |
--json | संरचित JSON उत्सर्जित करें, जिसमें प्रति लक्ष्य प्रोब मार्कर शामिल हों |
--no-color | रंगीन आउटपुट अक्षम करें (NO_COLOR और non-TTY का भी सम्मान करता है) |
भेद्य सर्वर (डिफ़ॉल्ट आउटपुट; TTY पर [!] मार्कर और VULNERABLE लाल रंग में दिखाए जाते हैं):
$ ./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
पैच किया गया सर्वर:
$ ./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)
एक Check Point प्रबंधन सर्वर जिसने उत्तर दिया लेकिन लॉगिन विधि dispatch नहीं की, इसलिए पैच स्थिति पढ़ी नहीं जा सकी:
$ ./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
--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 के साथ JSON आउटपुट। प्रोब मार्कर शामिल हैं ताकि निर्णय को इस बात से जाँचा जा सके कि प्रतिक्रिया में वास्तव में क्या था:
$ ./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": ""
}
}
]
यह जाँच उत्पादन प्रणालियों के विरुद्ध उपयोग के लिए है:
targetVersion में एक अवैध वर्ण (!) डालती है; वह एक वर्ण पैच किए गए बिल्ड के सत्यापन को ट्रिगर करने के लिए पर्याप्त है, और यह पथ विभाजक की तरह किसी निर्देशिका से बाहर नहीं निकल सकता। लेगेसी अनुवर्ती प्रोब में कोई targetVersion बिल्कुल नहीं होता।domainId तत्व को छोड़ देती है, इसलिए अनपैच किए गए सर्वर पर विधि अपने पैरामीटर बनाते समय NullPointerException उठाती है, इससे पहले कि ReflectionUtils Runtime.exec तक पहुँचे। वह भी न होने पर, प्रोब मान एक ऐसी निर्देशिका में हल होता है जो मौजूद नहीं है, इसलिए चलाने के लिए कोई स्क्रिप्ट नहीं है। लेगेसी प्रोब केवल एक एप्लिकेशन नाम और टाइमआउट भेजती है, इसलिए इसके पास पथ बनाने के लिए कुछ नहीं है।| # | Call | When | Purpose |
|---|---|---|---|
| 1 | UpgradeSvcRemote.loginAsApplicationReadOnlyPublicSession (current shape) | always | पैच-स्थिति प्रोब |
| 2 | UpgradeSvcRemote.loginAsApplicationReadOnlyPublicSession (legacy shape) | केवल तब जब कॉल 1 को किसी Check Point सर्वर द्वारा unmarshalling पर अस्वीकार किया जाए | एक end-of-support बिल्ड की पुष्टि करता है |