
Неразрушающий сканер для CVE-2026-35616 — обхода API без аутентификации в FortiClient EMS. Обнаруживает уязвимость, сравнивая HTTP-ответы с подделанными SSL-заголовками и без них, используя только стандартную библиотеку Python.
Безопасно определяет, уязвим ли сервер FortiClient EMS к CVE-2026-35616, не вызывая сбоев в работе. См. полный технический разбор в блоге Bishop Fox.
CVE-2026-35616 — это обход API без предварительной аутентификации в FortiClient EMS 7.4.5 и 7.4.6, который позволяет удалённым неаутентифицированным злоумышленникам обходить аутентификацию на основе сертификатов с помощью подделки HTTP-заголовков. Приложение Django доверяет управляемым пользователем HTTP-заголовкам (X-SSL-CLIENT-VERIFY, X-SSL-CLIENT-CERT) как переменным окружения WSGI от Apache mod_ssl, а конфигурация Apache никогда их не удаляет. В сочетании с проверкой цепочки сертификатов, которая выполняет только сопоставление строк Distinguished Name (без криптографической проверки подписи), злоумышленник может подделать сертификаты и получить аутентифицированный доступ к API. Fortinet подтвердила эксплуатацию данной уязвимости в реальных условиях.
Этот инструмент выполняет неразрушающее тестирование уязвимости следующим образом:
/api/v1/fabric_device_auth/fortigate/init без подделанных заголовковX-SSL-CLIENT-VERIFY: SUCCESS, но без данных сертификатаПри отправке заголовка verify без данных сертификата PEM активируется путь обнаружения, но аутентификация не может быть выполнена, поскольку цепочка сертификатов не предоставляется. Сервер остаётся стабильным и может продолжать обрабатывать соединения.
contains_certificate() проходит проверку, но validate_cert_chain() завершается ошибкой из-за отсутствия данных PEM.RequestHeader unset, которые отбрасывают подделанный заголовок до того, как он достигнет Django.INCONCLUSIVE.git clone https://github.com/BishopFox/CVE-2026-35616-check
cd CVE-2026-35616-check
Внешних зависимостей нет. Сканер использует только модули стандартной библиотеки Python.
Проверьте сервер FortiClient EMS по адресу <TARGET>:<PORT>. Порт по умолчанию — 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.
Использование этого инструмента для атак на цели без предварительного взаимного согласия незаконно. Соблюдение всех применимых местных, государственных и федеральных законов является обязанностью конечного пользователя. Разработчики не несут ответственности и не отвечают за любое неправомерное использование или ущерб, причинённый этой программой.