
مدقق حالة التصحيح الآمن غير المصادق عليه لـ Check Point CPM RCE CVE-2026-93616؛ يستكشف تسجيل الدخول SOAP الخاص بـ UpgradeSvcRemote على TCP 19009 دون استغلال.
فحص حالة الترقيع دون مصادقة للثغرة CVE-2026-93616، وهي اجتياز المسار (directory traversal) دون مصادقة في خادم Check Point Security Management (CPM) الذي يصل إلى
Runtime.exec()، وتم إصلاحها في
sk1000171 بتاريخ 2026-09-22. CWE-22،
CVSS 9.8 حرجة (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)، ويجري استغلالها في
البيئة الفعلية. Check Point هي الجهة المنسّقة (CNA)؛ وقد تم تحديد المشكلة من الاستغلال
في البيئة الفعلية بدلاً من تقرير خارجي.
يكشف خادم CPM عن خدمات ويب SOAP على منفذ TCP 19009. تمرّر طريقة تسجيل الدخول
loginAsApplicationReadOnlyPublicSession في UpgradeSvcRemote معامل targetVersion الخاص بها
إلى مسار نظام ملفات يُمرَّر إلى Runtime.exec دون تحقق، لذا يمكن لمتصل غير مصادق عليه
إعادة توجيه التنفيذ إلى نص برمجي يختاره المهاجم. يضيف الإصلاح نمط Bean
Validation إلى targetVersion يرفض فاصل المسار.
يُبلّغ النص البرمجي عمّا إذا كان هذا الإصلاح موجوداً على كل هدف. وهو يرسل محرفاً واحداً
غير قانوني في targetVersion، وليس تسلسل اجتياز أبداً، ولا يقوم بالمصادقة،
ولا يرفع ملفاً، ولا ينفّذ أي شيء على الهدف. النتيجة غير VULNERABLE لا
تعني بحد ذاتها أن الهدف مُرقَّع؛ انظر
تفسير النتائج غير القابلة للاستغلال.
يتم التعامل مع إصدارات نهاية الدعم بشكل صريح. على المسارات الأقدم من R81.10 تأخذ طريقة
تسجيل الدخول معاملات أقل، لذا يتم رفض الفحص الأساسي بواسطة فك تسلسل XML قبل أن
يمكن قراءة حالة الترقيع. عندما يرفض خادم Check Point الفحص بهذه الطريقة، يرسل النص البرمجي
استدعاءً متابعاً واحداً بالشكل الأقدم للمعاملات. إذا تم عندئذٍ إرسال طريقة تسجيل الدخول،
فإن الهدف هو إصدار متأثر لم تنشر Check Point له إصلاحاً أبداً، ويكون الحكم
VULNERABLE مع السبب affected-eos-no-fix. لا يحمل الاستدعاء المتابع أي mode
ولا أي targetVersion، لذا فهو أيضاً لا يرسل شيئاً للتحقق منه ولا شيئاً للاجتياز. وهذا
يسدّ ثغرة كان من الممكن أن يُقرأ فيها خادم قديم على أنه غير قابل للتحديد.
# هدف واحد (المنفذ الافتراضي هو 19009)
./cve_2026_93616_check.py mgmt.example.com
# منفذ صريح
./cve_2026_93616_check.py mgmt.example.com:19009
# عدة أهداف
./cve_2026_93616_check.py mds-a.example.com mds-b.example.com
# فحص قائمة، هدف واحد في كل سطر (تعليقات '#' مسموح بها)، إخراج مختصر
./cve_2026_93616_check.py -f targets.txt --brief
# إخراج قابل للقراءة آلياً لخطوط الأنابيب
./cve_2026_93616_check.py -f targets.txt --json > results.json
Python 3.8+، المكتبة القياسية فقط — لا حزم خارجية.
شغّل الأداة ضد خوادم الإدارة (Security Management، وMulti-Domain Management، وLog، وMulti-Domain Log، وSmartEvent)، وليس ضد البوابات. يستهدف الفحص مستمع CPM SOAP على منفذ TCP 19009، وهو ما لا تشغّله البوابات.
| العلم | الوصف |
|---|---|
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 وغير TTY) |
خادم قابل للاستغلال (الإخراج الافتراضي؛ تُعرض العلامة [!] وVULNERABLE باللون الأحمر على
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
خادم مُرقَّع:
$ ./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 استجاب لكنه لم يرسل طريقة تسجيل الدخول، لذا تعذّرت قراءة حالة الترقيع:
$ ./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. وحتى بدون ذلك، تُحلّ قيمة الفحص
إلى دليل غير موجود، لذا لا يوجد نص برمجي لتشغيله. يرسل الفحص القديم
اسم تطبيق ومهلة فقط، لذا ليس لديه ما يبني منه مساراً.| # | الاستدعاء | متى | الغرض |
|---|---|---|---|
| 1 | UpgradeSvcRemote.loginAsApplicationReadOnlyPublicSession (الشكل الحالي) | دائماً | فحص حالة الترقيع |
| 2 | UpgradeSvcRemote.loginAsApplicationReadOnlyPublicSession (الشكل القديم) | فقط إذا رُفض الاستدعاء 1 عند فك التسلسل بواسطة خادم Check Point | تأكيد إصدار نهاية الدعم |
تُسجَّل الفحوصات في $MDS_FWDIR/log/cpm.elg. يسجّل الخادم المُرقَّع رفض
تحقق؛ ويسجّل الخادم غير المُرقَّع الإرسال وNullPointerException الخاص به؛ ويسجّل
خادم نهاية الدعم خطأ فك تسلسل للاستدعاء 1 وإرسالاً للاستدعاء 2.
يرسل كلا الفحصين اسم التطبيق bf-check (كما يرسل الاستدعاء 1 القيمة bf-check!)،
وهو ما يمكن التعرف عليه في السجل على أنه هذه الأداة وليس هجوماً.
يضيف الإصلاح نمط Bean Validation، ^[A-Za-z0-9._-]*$، إلى معامل targetVersion
في كل طريقة UpgradeSvcRemote تأخذه. يسمح النمط بسلسلة إصدار
لكنه لا يسمح بفاصل مسار، وهو ما يسدّ الاجتياز إلى Runtime.exec. يرسل
الفحص محرفاً واحداً غير قانوني ويقرأ الطريقة التي يستجيب بها الخادم: