
Nicht-destruktiver Scanner für CVE-2026-35616, einen Pre-Authentication-API-Bypass in FortiClient EMS. Erkennt die Schwachstelle durch Vergleich von HTTP-Antworten mit und ohne gespoofte SSL-Header, unter Verwendung ausschließlich der Python-Standardbibliothek.
Ermitteln Sie gefahrlos, ob ein FortiClient EMS-Server anfällig für CVE-2026-35616 ist, ohne Störungen zu verursachen. Den vollständigen Bericht finden Sie im Bishop-Fox-Blog.
CVE-2026-35616 ist ein Pre-Authentication-API-Bypass in FortiClient EMS 7.4.5 und 7.4.6, der es entfernten, nicht authentifizierten Angreifern ermöglicht, die zertifikatsbasierte Authentifizierung durch HTTP-Header-Spoofing zu umgehen. Die Django-Anwendung behandelt benutzerkontrollierbare HTTP-Header (X-SSL-CLIENT-VERIFY, X-SSL-CLIENT-CERT) als gleichwertig zu den WSGI-Umgebungsvariablen von Apache mod_ssl, und die Apache-Konfiguration entfernt diese Header niemals. In Kombination mit einer Validierung der Zertifikatskette, die lediglich einen Abgleich von Distinguished-Name-Zeichenketten durchführt (keine kryptografische Signaturprüfung), kann ein Angreifer Zertifikate fälschen und authentifizierten API-Zugriff erlangen. Fortinet hat die Ausnutzung dieser Schwachstelle in freier Wildbahn bestätigt.
Dieses Tool führt nicht-destruktive Schwachstellentests durch, indem es:
/api/v1/fabric_device_auth/fortigate/init ohne manipulierte Header sendetX-SSL-CLIENT-VERIFY: SUCCESS, aber ohne Zertifikatsdaten sendetDas Senden des Verify-Headers ohne PEM-Zertifikatsdaten löst zwar den Erkennungspfad aus, kann aber keine Authentifizierung durchführen, da keine Zertifikatskette bereitgestellt wird. Der Server bleibt stabil und kann weiterhin Verbindungen verarbeiten.
contains_certificate() die Hürde passiert, validate_cert_chain() jedoch bei fehlenden PEM-Daten abstürzt.RequestHeader unset-Direktiven hinzufügt, die den manipulierten Header entfernen, bevor er Django erreicht.INCONCLUSIVE-Ergebnis.git clone https://github.com/BishopFox/CVE-2026-35616-check
cd CVE-2026-35616-check
Keine externen Abhängigkeiten. Der Scanner verwendet ausschließlich Module aus der Python-Standardbibliothek.
Testen Sie einen FortiClient-EMS-Server unter <TARGET>:<PORT>. Der Standardport ist 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
======================================================================
Das Tool kann die Schwachstelle nur erkennen, wenn die folgenden Bedingungen erfüllt sind:
/api/v1/fabric_device_auth/fortigate/init existiert und die Authentifizierung cert_chain_approved verwendetWenn eine Bedingung nicht erfüllt ist, meldet das Tool ein INCONCLUSIVE-Ergebnis.
Dieser Code wird unter einer MIT-Lizenz verteilt.
Die Verwendung dieses Tools zum Angriff auf Ziele ohne vorherige gegenseitige Zustimmung ist illegal. Es liegt in der Verantwortung des Endbenutzers, alle geltenden lokalen, Landes- und Bundesgesetze einzuhalten. Die Entwickler übernehmen keine Haftung und sind nicht für Missbrauch oder Schäden verantwortlich, die durch dieses Programm verursacht werden.