
ماسح غير تخريبي لـ CVE-2026-35616، وهو تجاوز لواجهة برمجة التطبيقات قبل المصادقة في FortiClient EMS. يكتشف الثغرة بمقارنة استجابات HTTP مع وبدون رؤوس SSL مزيفة، باستخدام مكتبة Python القياسية فقط.
اكتشف بأمان ما إذا كان خادم FortiClient EMS عرضة لـ CVE-2026-35616 دون التسبب في أي انقطاع. اطّلع على التقرير الكامل في مدونة Bishop Fox.
CVE-2026-35616 هي ثغرة تجاوز لتوثيق واجهة API قبل التحقق في FortiClient EMS 7.4.5 و7.4.6 تسمح للمهاجمين عن بعد وغير المصادقين بتجاوز المصادقة القائمة على الشهادة من خلال تزوير رؤوس HTTP. يثق تطبيق Django في رؤوس HTTP التي يتحكم فيها المستخدم (X-SSL-CLIENT-VERIFY, X-SSL-CLIENT-CERT) كبديل لمتغيرات بيئة WSGI الخاصة بـ Apache mod_ssl، ولا يقوم تكوين Apache بتجريدها أبدًا. بالإضافة إلى التحقق من سلسلة الشهادات الذي يعتمد فقط على مطابقة اسم مميز (Distinguished Name) دون التحقق من التوقيع التشفيري، يمكن للمهاجم تزوير الشهادات والحصول على وصول مصادق إلى واجهة API. أكدت Fortinet استغلال الثغرة في البيئات الحقيقية.
تقوم هذه الأداة باختبار الثغرة بطريقة غير مدمرة من خلال:
/api/v1/fabric_device_auth/fortigate/init بدون رؤوس مزورةX-SSL-CLIENT-VERIFY: SUCCESS ولكن بدون بيانات شهادةإرسال رأس التحقق بدون بيانات PEM للشهادة يؤدي إلى تفعيل مسار الكشف لكنه لا يمكنه المصادقة لأنه لم يتم توفير سلسلة شهادات. يبقى الخادم مستقرًا ويمكنه الاستمرار في معالجة الاتصالات.
contains_certificate() تمرر الحاجز لكن validate_cert_chain() تتعطل بسبب عدم وجود بيانات PEM.RequestHeader unset التي تجرد الرأس المزور قبل وصوله إلى Django.INCONCLUSIVE.git clone https://github.com/BishopFox/CVE-2026-35616-check
cd CVE-2026-35616-check
لا توجد تبعيات خارجية. يستخدم الماسح فقط وحدات مكتبة Python القياسية.
اختبر خادم FortiClient EMS في <TARGET>:<PORT>. المنفذ الافتراضي هو 443/TCP.
python3 CVE-2026-35616-check.py <TARGET> [PORT]
$ python3 CVE-2026-35616-check.py 192.168.1.1
======================================================================
FortiClient EMS CVE-2026-35616 Vulnerability Scanner
Non-Destructive Detection
======================================================================
[*] Target: 192.168.1.1:443
[*] Testing for CVE-2026-35616 (non-destructive)
[1] Sending baseline POST (no spoof headers)... HTTP 401
[2] Sending POST with X-SSL-CLIENT-VERIFY: SUCCESS... HTTP 500
[*] Analyzing responses...
[+] Baseline: 401 — Certificate not found in request header.
[+] Spoofed: 500 — Server encountered an error, please try again later.
[!] Spoofed header changed server behavior
[!] X-SSL-CLIENT-VERIFY is reaching Django (hotfix not applied)
======================================================================
RESULT: VULNERABLE to CVE-2026-35616
Affected versions: FortiClient EMS 7.4.5 - 7.4.6
Recommendation: Apply Fortinet hotfix or upgrade to 7.4.7+
======================================================================
$ python3 CVE-2026-35616-check.py 192.168.1.1
======================================================================
FortiClient EMS CVE-2026-35616 Vulnerability Scanner
Non-Destructive Detection
======================================================================
[*] Target: 192.168.1.1:443
[*] Testing for CVE-2026-35616 (non-destructive)
[1] Sending baseline POST (no spoof headers)... HTTP 401
[2] Sending POST with X-SSL-CLIENT-VERIFY: SUCCESS... HTTP 401
[*] Analyzing responses...
[+] Baseline: 401 — Certificate not found in request header.
[+] Spoofed: 401 — Certificate not found in request header.
[-] Responses identical (header stripped by Apache)
======================================================================
RESULT: NOT VULNERABLE (hotfix applied)
Apache is stripping X-SSL-CLIENT-VERIFY before it reaches Django
======================================================================
يمكن للأداة اكتشاف الثغرة فقط إذا تم استيفاء الشروط التالية:
/api/v1/fabric_device_auth/fortigate/init موجودة وتستخدم مصادقة cert_chain_approvedإذا لم يتم استيفاء أي شرط، ستُبلغ الأداة عن نتيجة INCONCLUSIVE.
هذا الكود موزع تحت رخصة MIT.
استخدام هذه الأداة لمهاجمة أهداف دون موافقة متبادلة مسبقة هو عمل غير قانوني. تقع على عاتق المستخدم النهائي مسؤولية الامتثال لجميع القوانين المحلية والولائية والفيدرالية المعمول بها. لا يتحمل المطورون أي مسؤولية ولا يتحملون مسؤولية أي إساءة استخدام أو ضرر ناتج عن هذا البرنامج.