
Scanner non distruttivo per CVE-2026-35616, un bypass dell'API pre-autenticazione in FortiClient EMS. Rileva la vulnerabilità confrontando le risposte HTTP con e senza header SSL spoofati, utilizzando solo la libreria standard di Python.
Rileva in sicurezza se un server FortiClient EMS è vulnerabile a CVE-2026-35616 senza causare alcuna interruzione. Consulta l'analisi completa sul blog di Bishop Fox.
CVE-2026-35616 è un bypass API pre-autenticazione in FortiClient EMS 7.4.5 e 7.4.6 che consente ad attaccanti remoti non autenticati di aggirare l'autenticazione basata su certificati tramite spoofing delle intestazioni HTTP. L'applicazione Django considera le intestazioni HTTP controllabili dall'utente (X-SSL-CLIENT-VERIFY, X-SSL-CLIENT-CERT) come equivalenti alle variabili d'ambiente WSGI di Apache mod_ssl e la configurazione di Apache non le rimuove mai. In combinazione con una validazione della catena di certificati che esegue solo un confronto di stringhe Distinguished Name (senza verifica crittografica delle firme), un attaccante può contraffare i certificati e ottenere accesso autenticato alle API. Fortinet ha confermato lo sfruttamento in ambienti reali.
Questo strumento esegue test di vulnerabilità non distruttivi:
/api/v1/fabric_device_auth/fortigate/init senza intestazioni spoofateX-SSL-CLIENT-VERIFY: SUCCESS ma senza dati del certificatoL'invio dell'intestazione di verifica senza dati PEM del certificato attiva il percorso di rilevamento ma non può autenticare perché non viene fornita alcuna catena di certificati. Il server rimane stabile e può continuare a gestire le connessioni.
contains_certificate() supera il controllo ma validate_cert_chain() va in crash a causa dei dati PEM mancanti.RequestHeader unset che rimuovono l'intestazione spoofata prima che raggiunga Django.INCONCLUSIVE.git clone https://github.com/BishopFox/CVE-2026-35616-check
cd CVE-2026-35616-check
Nessuna dipendenza esterna. Lo scanner utilizza solo i moduli della libreria standard di Python.
Testa un server FortiClient EMS su <TARGET>:<PORT>. La porta predefinita è 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
======================================================================
Lo strumento può rilevare la vulnerabilità solo se sono soddisfatte le seguenti condizioni:
/api/v1/fabric_device_auth/fortigate/init esiste e utilizza l'autenticazione cert_chain_approvedSe una qualsiasi condizione non è soddisfatta, lo strumento riporterà un risultato INCONCLUSIVE.
Questo codice è distribuito sotto una licenza MIT.
L'utilizzo di questo strumento per attaccare target senza il preventivo consenso reciproco è illegale. È responsabilità dell'utente finale rispettare tutte le leggi locali, statali e federali applicabili. Gli sviluppatori non si assumono alcuna responsabilità e non sono responsabili di eventuali usi impropri o danni causati da questo programma.