
Detecte com segurança se um servidor FortiClient EMS é vulnerável à CVE-2026-35616 sem causar qualquer interrupção. Consulte o artigo completo no blog da Bishop Fox.
A CVE-2026-35616 é uma bypass de API de pré-autenticação no FortiClient EMS 7.4.5 e 7.4.6 que permite que atacantes remotos não autenticados contornem a autenticação baseada em certificado por meio de falsificação de cabeçalhos HTTP. O aplicativo Django confia em cabeçalhos HTTP controláveis pelo usuário (X-SSL-CLIENT-VERIFY, X-SSL-CLIENT-CERT) como equivalentes às variáveis de ambiente WSGI do Apache mod_ssl, e a configuração do Apache nunca os remove. Combinado com uma validação de cadeia de certificados que realiza apenas a correspondência de strings de Distinguished Name (sem verificação de assinatura criptográfica), um atacante pode forjar certificados e obter acesso autenticado à API. A Fortinet confirmou exploração ativa no ambiente real.
Esta ferramenta realiza testes de vulnerabilidade não destrutivos por meio de:
/api/v1/fabric_device_auth/fortigate/init sem cabeçalhos falsificadosX-SSL-CLIENT-VERIFY: SUCCESS, mas sem dados de certificadoO envio do cabeçalho de verificação sem dados PEM de certificado dispara o caminho de detecção, mas não consegue autenticar porque nenhuma cadeia de certificados é fornecida. O servidor permanece estável e pode continuar lidando com conexões.
contains_certificate() passa pelo teste, mas validate_cert_chain() falha na ausência de dados PEM.RequestHeader unset no Apache que removem o cabeçalho falsificado antes que ele chegue ao Django.INCONCLUSIVE.git clone https://github.com/BishopFox/CVE-2026-35616-check
cd CVE-2026-35616-check
Sem dependências externas. O scanner usa apenas módulos da biblioteca padrão do Python.
Teste um servidor FortiClient EMS em <TARGET>:<PORT>. A porta padrão é 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
======================================================================
A ferramenta só consegue detectar a vulnerabilidade se as seguintes condições forem atendidas:
/api/v1/fabric_device_auth/fortigate/init existe e usa autenticação cert_chain_approvedSe qualquer condição não for atendida, a ferramenta reportará um resultado INCONCLUSIVE.
Este código é distribuído sob uma licença MIT.
O uso desta ferramenta para atacar alvos sem consentimento mútuo prévio é ilegal. É responsabilidade do usuário final obedecer a todas as leis locais, estaduais e federais aplicáveis. Os desenvolvedores não assumem qualquer responsabilidade e não são responsáveis por qualquer uso indevido ou dano causado por este programa.