
Escáner no destructivo para CVE-2026-35616, una omisión de API de preautenticación en FortiClient EMS. Detecta la vulnerabilidad comparando respuestas HTTP con y sin cabeceras SSL falsificadas, usando solo la biblioteca estándar de Python.
Detecte de forma segura si un servidor FortiClient EMS es vulnerable a CVE-2026-35616 sin causar ninguna interrupción. Consulte el análisis completo en el blog de Bishop Fox.
CVE-2026-35616 es una omisión de autenticación previa en FortiClient EMS 7.4.5 y 7.4.6 que permite a atacantes remotos no autenticados omitir la autenticación basada en certificados mediante la suplantación de cabeceras HTTP. La aplicación Django confía en las cabeceras HTTP controlables por el usuario (X-SSL-CLIENT-VERIFY, X-SSL-CLIENT-CERT) como equivalentes a las variables de entorno WSGI de Apache mod_ssl, y la configuración de Apache nunca las elimina. Combinado con una validación de la cadena de certificados que solo realiza la coincidencia de cadenas del Distinguished Name (sin verificación criptográfica de firmas), un atacante puede falsificar certificados y obtener acceso autenticado a la API. Fortinet ha confirmado la explotación activa de esta vulnerabilidad.
Esta herramienta realiza pruebas de vulnerabilidad no destructivas mediante:
/api/v1/fabric_device_auth/fortigate/init sin cabeceras suplantadasX-SSL-CLIENT-VERIFY: SUCCESS pero sin datos de certificadoEl envío de la cabecera de verificación sin datos PEM de certificado activa la ruta de detección, pero no puede autenticarse porque no se proporciona ninguna cadena de certificados. El servidor permanece estable y puede seguir gestionando conexiones.
contains_certificate() supera la comprobación, pero validate_cert_chain() falla ante la ausencia de datos PEM.RequestHeader unset de Apache que eliminan la cabecera suplantada antes de que llegue a Django.INCONCLUSIVE.git clone https://github.com/BishopFox/CVE-2026-35616-check
cd CVE-2026-35616-check
Sin dependencias externas. El escáner utiliza únicamente módulos de la biblioteca estándar de Python.
Pruebe un servidor FortiClient EMS en <TARGET>:<PORT>. El puerto predeterminado es 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
======================================================================
La herramienta solo puede detectar la vulnerabilidad si se cumplen las siguientes condiciones:
/api/v1/fabric_device_auth/fortigate/init existe y utiliza la autenticación cert_chain_approvedSi no se cumple alguna condición, la herramienta informará de un resultado INCONCLUSIVE.
Este código se distribuye bajo una licencia MIT.
El uso de esta herramienta para atacar objetivos sin consentimiento mutuo previo es ilegal. Es responsabilidad del usuario final cumplir todas las leyes locales, estatales y federales aplicables. Los desarrolladores no asumen ninguna responsabilidad y no son responsables de ningún uso indebido ni de los daños causados por este programa.