
Инструментарий обнаружения для CVE-2026-35616 — обхода API без аутентификации в FortiClient EMS. Включает сканер на Python и Nmap NSE-скрипт для выявления уязвимых версий и предоставления рекомендаций по устранению.
Критический обход аутентификации в Fortinet FortiClient EMS 7.4.5 и 7.4.6 позволяет полностью неаутентифицированному удалённому злоумышленнику обойти аутентификацию API, подделав один HTTP-заголовок (X-SSL-CLIENT-VERIFY). Уязвимость существует из-за того, что промежуточное ПО Django доверяет метаданным клиентского сертификата из управляемых пользователем заголовков, а не только доверенному обратному прокси. Это даёт злоумышленникам полный административный доступ к API — а оттуда и возможность выполнения произвольного кода на управляемых конечных точках по всему предприятию.
Активно эксплуатируется с 31 марта 2026 года. Добавлена в каталог CISA KEV 6 апреля 2026 года.
| Поле | Детали |
|---|---|
| ID CVE | CVE-2026-35616 |
| Производитель | Fortinet |
| Продукт | FortiClient Enterprise Management Server (EMS) |
| Затронутые версии | 7.4.5, 7.4.6 |
| Не затронуты | ветка 7.2.x, 7.4.4 и более ранние |
| CVSS v3.1 | 9.1 (Критический) |
| CWE | CWE-284 - Некорректный контроль доступа |
| Вектор атаки | Сеть |
| Аутентификация | Не требуется |
| Взаимодействие с пользователем | Нет |
| Зрелость эксплойта | Эксплуатируется в дикой природе |
| CISA KEV | Добавлена 6 апреля 2026 года (крайний срок: 9 апреля 2026 года) |
| Патч | Горячий фикс доступен; полное исправление в 7.4.7 |
| Авторы обнаружения | Симо Кохонен (Defused Cyber), Нгуен Дык Ань |
FortiClient Enterprise Management Server (EMS) — это централизованная платформа управления конечными точками от Fortinet. Она служит уровнем управления и контроля (C2) для развёртывания, настройки и мониторинга агентов FortiClient в организации. Представьте её как мозг, который управляет каждой конечной точкой в среде под управлением Fortinet:
Когда злоумышленник получает административный доступ к EMS, он фактически получает ключи от каждой управляемой конечной точки в организации.
FortiClient EMS использует довольно стандартный стек веб-приложений за кулисами:
+----------------+ +----------------+ +----------------+
| Браузер / | HTTPS | Apache | WSGI | Django |
| API-клиент | -------> | (mod_ssl) | -------> | Бэкенд |
+----------------+ +----------------+ +----------------+
Когда настроен взаимный TLS (mTLS), модуль mod_ssl Apache обрабатывает проверку клиентского сертификата. После проверки сертификата Apache передаёт результат проверки в Django через доверенные переменные окружения WSGI:
SSL_CLIENT_VERIFY — статус проверки (SUCCESS, NONE, FAILED)SSL_CLIENT_S_DN — Subject Distinguished Name из сертификатаSSL_CLIENT_SERIAL — серийный номер сертификатаЭто стандартный и безопасный подход. Проблема в том, как промежуточное ПО Django считывает эти данные.
В FortiClient EMS 7.4.5 и 7.4.6 промежуточное ПО аутентификации Django было изменено, чтобы также принимать эту же информацию из HTTP-заголовков запроса:
X-SSL-CLIENT-VERIFYX-SSL-CLIENT-S-DNX-SSL-CLIENT-SERIALВероятно, это было добавлено для поддержки развёртываний с обратным прокси, где Apache не является точкой завершения TLS. Однако промежуточное ПО не различает эти два источника. Оно сначала проверяет переменные WSGI, но если они отсутствуют (mTLS не настроен или прямое соединение), оно переключается на HTTP-заголовки — которые может установить любой клиент.
Вот концептуальная схема:
БЕЗОПАСНЫЙ ПУТЬ (предполагаемый):
Apache mod_ssl проверяет сертификат --> устанавливает переменные окружения WSGI --> Django считывает переменные окружения [ОК]
НЕБЕЗОПАСНЫЙ ПУТЬ (уязвимость):
Злоумышленник напрямую устанавливает HTTP-заголовки --> Django считывает заголовки --> Доверяет им [СБОЙ]
Промежуточное ПО фактически доверяет клиенту самостоятельно подтверждать статус проверки собственного сертификата. Это как если бы вышибала спросил кого-то: «Эй, тебя уже проверил другой вышибала?» — и впустил его, когда тот ответил «да».
Шаг 1: Злоумышленник отправляет POST-запрос к конечной точке API EMS
со следующими заголовками:
X-SSL-CLIENT-VERIFY: SUCCESS
X-SSL-CLIENT-S-DN: CN=admin
X-SSL-CLIENT-SERIAL: 0000000000000001
Шаг 2: Промежуточное ПО Django проверяет переменные окружения WSGI → отсутствуют
Переключается на HTTP-заголовки → находит X-SSL-CLIENT-VERIFY: SUCCESS
Шаг 3: Промежуточное ПО обрабатывает запрос как аутентифицированный с правами администратора
Шаг 4: Злоумышленник получает полный административный доступ к API
Шаг 5: Через административный API злоумышленник может:
- Распространять вредоносные политики на все управляемые конечные точки
- Извлекать сохранённые учётные данные и сертификаты
- Развёртывать полезные нагрузки через систему распространения ПО
- Изменять конфигурации ZTNA
- Перемещаться в более широкую сеть
Вся атака требует одного HTTP-запроса. Никакого перебора, подбора учётных данных или социальной инженерии. Просто один подделанный заголовок.
Серьёзность здесь выходит за рамки самого сервера. FortiClient EMS — это мультипликатор силы: его компрометация даёт злоумышленнику рычаги воздействия на каждую управляемую конечную точку:
Непосредственное воздействие:
Каскадное воздействие (через управляемые конечные точки):
Риск для предприятия:
| Версия | Статус |
|---|---|
| FortiClient EMS 7.4.6 | Уязвима |
| FortiClient EMS 7.4.5 | Уязвима |
| FortiClient EMS 7.4.4 и более ранние | Не затронуты |
| FortiClient EMS 7.2.x | Не затронуты |
| Дата | Событие |
|---|---|
| ~Конец марта 2026 | Уязвимость обнаружена и сообщена Симо Кохоненом и Нгуен Дык Анем |
| 31 марта 2026 | Зафиксированы первые попытки эксплуатации против honeypot-систем (Defused Cyber) |
| 4 апреля 2026 | Fortinet выпускает экстренные горячие фиксы для 7.4.5 и 7.4.6 |
| 6 апреля 2026 | CISA добавляет CVE-2026-35616 в каталог KEV (крайний срок: 9 апреля 2026 года) |
| 13 апреля 2026 | Публикация этого набора инструментов для обнаружения |
Python-скрипт проверяет несколько конечных точек API, используя технику дифференциального ответа.
Как это работает:
HTTP 401 Unauthorized)X-SSL-CLIENT-VERIFY: SUCCESS401 на что-либо другое (обычно 500 или 200), обход аутентификации подтверждёнЭксплуатационная полезная нагрузка никогда не отправляется. Тест безопасен для производственной среды.
Использование:
# Установка зависимостей (для этого скрипта нужна только стандартная библиотека)
pip install -r requirements.txt
# Одиночная цель
python CVE-2026-35616_FortiClientEMS_detector.py -t 192.168.1.100
# Нестандартный порт
python CVE-2026-35616_FortiClientEMS_detector.py -t ems.corp.local -p 8443
# Массовое сканирование из файла
python CVE-2026-35616_FortiClientEMS_detector.py -f targets.txt
# Вывод JSON, сохранённый в файл
python CVE-2026-35616_FortiClientEMS_detector.py -t 192.168.1.100 --json -o results.json
# С включённой проверкой SSL-сертификата
python CVE-2026-35616_FortiClientEMS_detector.py -t 192.168.1.100 --verify-ssl
# Увеличенный таймаут для медленных сетей
python CVE-2026-35616_FortiClientEMS_detector.py -t 192.168.1.100 --timeout 20
Параметры:
| Флаг | Описание | По умолчанию |
|---|---|---|
-t, --target | IP-адрес или имя хоста цели | - |
-f, --file | Файл с целями, по одной на строку (строки, начинающиеся с #, пропускаются) | - |
-p, --port | Порт цели | 443 |
--timeout | Таймаут соединения в секундах | 10 |
--verify-ssl | Включить проверку SSL-сертификата | Отключено |
--json | Вывод результатов в формате JSON | Выкл |
-o, --output | Сохранить результаты в файл | - |
Пример вывода:
╔══════════════════════════════════════════════════════════════╗
║ CVE-2026-35616 - FortiClient EMS Auth Bypass Detector ║
║ Pre-Authentication API Access Bypass → Privilege Escalation║
║ CVSS: 9.1 (Critical) | CISA KEV: Active Exploitation ║
╚══════════════════════════════════════════════════════════════╝
[*] Scanning 192.168.1.100:443...
Target: 192.168.1.100:443
============================================================
[*] FortiClient EMS detected (Version: Unknown)
Vulnerability Test Results:
[VULNERABLE] /api/v1/auth/signin Baseline: 401 → Spoofed: 500
[VULNERABLE] /api/v1/system/status Baseline: 401 → Spoofed: 500
[NOT VULN] /api/v1/endpoints Baseline: 401 → Spoofed: 401
[!] TARGET IS LIKELY VULNERABLE TO CVE-2026-35616
Pre-authentication API bypass confirmed. Apply hotfix immediately!
Remediation: Upgrade to FortiClient EMS 7.4.7 or apply the hotfix
# Установка NSE-скрипта
sudo cp CVE-2026-35616_FortiClientEMS.nse /usr/share/nmap/scripts/
sudo nmap --script-updatedb
# Базовое сканирование
nmap -p 443 --script CVE-2026-35616_FortiClientEMS <цель>
# Сканирование подсети
nmap -p 443 --script CVE-2026-35616_FortiClientEMS 10.0.0.0/24
# Сканирование нескольких целей из файла
nmap -p 443 --script CVE-2026-35616_FortiClientEMS -iL targets.txt
# С определением версии службы
nmap -sV -p 443 --script CVE-2026-35616_FortiClientEMS <цель>
Пример вывода Nmap:
PORT STATE SERVICE
443/tcp open https
| CVE-2026-35616_FortiClientEMS:
| VULNERABLE:
| FortiClient EMS Pre-Authentication API Bypass
| State: VULNERABLE
| IDs: CVE:CVE-2026-35616
| Risk factor: Critical (CVSS: 9.1)
| Disclosure date: 2026-04-04
| Extra information:
| Affected endpoints: 2
| Remediation: Apply hotfix for FortiClient EMS 7.4.5/7.4.6 or upgrade to 7.4.7
| CISA KEV deadline: April 9, 2026
| References:
| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2026-35616
|_ https://www.cisa.gov/known-exploited-vulnerabilities-catalog
Если вы хотите подтвердить вручную с помощью curl:
# Шаг 1: Базовый запрос — должен вернуть 401
curl -sk -X POST https://<ЦЕЛЬ>:443/api/v1/auth/signin \
-H "Content-Type: application/json" \
-d '{}' \
-o /dev/null -w "%{http_code}\n"
# Шаг 2: Поддельный запрос — если возвращает что-либо кроме 401, вероятно, уязвим
curl -sk -X POST https://<ЦЕЛЬ>:443/api/v1/auth/signin \
-H "Content-Type: application/json" \
-H "X-SSL-CLIENT-VERIFY: SUCCESS" \
-H "X-SSL-CLIENT-S-DN: CN=admin" \
-H "X-SSL-CLIENT-SERIAL: 0000000000000001" \
-d '{}' \
-o /dev/null -w "%{http_code}\n"
Если первый возвращает 401, а второй — 500 или 200, экземпляр уязвим.
Обратите внимание на эти признаки в вашей среде:
X-SSL-CLIENT-VERIFY из источников, не являющихся проксиИсточники журналов для проверки:
Немедленные действия (сделайте сейчас):
Краткосрочные (на этой неделе):
Долгосрочные:
X-SSL-CLIENT-VERIFY, X-SSL-CLIENT-S-DN и X-SSL-CLIENT-SERIAL из входящих запросов на сетевом периметреКерем Оруч — Инженер по кибербезопасности