
FortiClient EMS의 사전 인증 API 우회인 CVE-2026-35616용 비파괴 스캐너입니다. 스푸핑된 SSL 헤더 유무에 따른 HTTP 응답을 비교하여 취약점을 탐지하며 Python 표준 라이브러리만 사용합니다.
FortiClient EMS 서버가 CVE-2026-35616에 취약한지 중단 없이 안전하게 탐지합니다. Bishop Fox 블로그의 전체 분석 문서를 참조하세요.
CVE-2026-35616은 FortiClient EMS 7.4.5 및 7.4.6의 사전 인증(pre-authentication) API 우회 취약점으로, 원격의 인증되지 않은 공격자가 HTTP 헤더 스푸핑을 통해 인증서 기반 인증을 우회할 수 있게 합니다. Django 애플리케이션은 사용자가 제어할 수 있는 HTTP 헤더(X-SSL-CLIENT-VERIFY, X-SSL-CLIENT-CERT)를 Apache mod_ssl WSGI 환경 변수와 동등한 것으로 신뢰하며, Apache 구성은 이를 결코 제거하지 않습니다. Distinguished Name 문자열 일치만 수행하는(암호화 서명 검증이 없는) 인증서 체인 검증과 결합하면, 공격자는 인증서를 위조하고 인증된 API 액세스 권한을 얻을 수 있습니다. Fortinet은 실제 환경에서의 악용을 확인했습니다.
이 도구는 비파괴적 취약점 테스트를 다음과 같이 수행합니다:
/api/v1/fabric_device_auth/fortigate/init에 기준(baseline) POST 전송X-SSL-CLIENT-VERIFY: SUCCESS 헤더를 포함한 동일한 POST 전송인증서 PEM 데이터 없이 verify 헤더를 전송하면 탐지 경로가 트리거되지만 인증서 체인이 제공되지 않으므로 인증은 불가능합니다. 서버는 안정적인 상태를 유지하며 연결 처리를 계속할 수 있습니다.
contains_certificate()validate_cert_chain()RequestHeader unset 지시문을 추가하여 스푸핑된 헤더가 Django에 도달하기 전에 제거하기 때문입니다.INCONCLUSIVE 결과를 보고합니다.git clone https://github.com/BishopFox/CVE-2026-35616-check
cd CVE-2026-35616-check
외부 종속성이 없습니다. 스캐너는 Python 표준 라이브러리 모듈만 사용합니다.
<TARGET>:<PORT>에 있는 FortiClient EMS 서버를 테스트합니다. 기본 포트는 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
======================================================================
이 도구는 다음 조건이 충족되는 경우에만 취약점을 탐지할 수 있습니다:
/api/v1/fabric_device_auth/fortigate/init 엔드포인트가 존재하고 cert_chain_approved 인증을 사용조건이 충족되지 않으면 도구는 INCONCLUSIVE 결과를 보고합니다.
이 코드는 MIT 라이선스에 따라 배포됩니다.
사전 상호 동의 없이 대상을 공격하기 위해 이 도구를 사용하는 것은 불법입니다. 모든 관련 지방, 주, 연방 법률을 준수할 책임은 최종 사용자에게 있습니다. 개발자는 이 프로그램으로 인해 발생하는 오용이나 손해에 대해 책임을 지지 않으며 책임이 없습니다.