
Scanneur non destructif pour CVE-2026-35616, un contournement d'API avant authentification dans FortiClient EMS. Détecte la vulnérabilité en comparant les réponses HTTP avec et sans en-têtes SSL falsifiés, en utilisant uniquement la bibliothèque standard Python.
Détectez en toute sécurité si un serveur FortiClient EMS est vulnérable à CVE-2026-35616 sans provoquer de perturbation. Consultez l'article complet sur le blog de Bishop Fox.
CVE-2026-35616 est un contournement d'authentification préalable dans FortiClient EMS 7.4.5 et 7.4.6 qui permet à des attaquants distants non authentifiés de contourner l'authentification par certificat via une usurpation d'en-têtes HTTP. L'application Django considère les en-têtes HTTP contrôlables par l'utilisateur (X-SSL-CLIENT-VERIFY, X-SSL-CLIENT-CERT) comme équivalents aux variables d'environnement WSGI d'Apache mod_ssl, et la configuration Apache ne les supprime jamais. Combiné à une validation de chaîne de certificats qui effectue uniquement une correspondance de chaîne de Distinguished Name (sans vérification de signature cryptographique), un attaquant peut forger des certificats et obtenir un accès API authentifié. Fortinet a confirmé une exploitation dans la nature.
Cet outil effectue des tests de vulnérabilité non destructifs en :
/api/v1/fabric_device_auth/fortigate/init sans en-têtes usurpésX-SSL-CLIENT-VERIFY: SUCCESS mais sans données de certificatL'envoi de l'en-tête de vérification sans données PEM de certificat déclenche le chemin de détection mais ne peut pas authentifier car aucune chaîne de certificats n'est fournie. Le serveur reste stable et peut continuer à gérer les connexions.
contains_certificate() passe la porte mais validate_cert_chain() plante en raison de l'absence de données PEM.RequestHeader unset qui suppriment l'en-tête usurpé avant qu'il n'atteigne Django.INCONCLUSIVE.git clone https://github.com/BishopFox/CVE-2026-35616-check
cd CVE-2026-35616-check
Aucune dépendance externe. Le scanner utilise uniquement les modules de la bibliothèque standard Python.
Testez un serveur FortiClient EMS à <TARGET>:<PORT>. Le port par défaut est 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
======================================================================
L'outil ne peut détecter la vulnérabilité que si les conditions suivantes sont remplies :
/api/v1/fabric_device_auth/fortigate/init existe et utilise l'authentification cert_chain_approvedSi une condition n'est pas remplie, l'outil signalera un résultat INCONCLUSIVE.
Ce code est distribué sous une licence MIT.
L'utilisation de cet outil pour attaquer des cibles sans consentement préalable mutuel est illégale. Il est de la responsabilité de l'utilisateur final de se conformer à toutes les lois locales, étatiques et fédérales applicables. Les développeurs n'assument aucune responsabilité et ne sont pas responsables de tout usage abusif ou dommage causé par ce programme.