BishopFox/CVE-2026-35616-check
GitHub: BishopFox/CVE-2026-35616-check
这是一个专门用于检测 FortiClient EMS 服务器是否存在 CVE-2026-35616 API 认证绕过漏洞的非破坏性安全评估工具。
Stars: 0 | Forks: 0
# CVE-2026-35616 漏洞评估工具
在不造成任何中断的情况下,安全检测 [FortiClient EMS](https://www.fortinet.com/products/endpoint-security/forticlient) 服务器是否受 CVE-2026-35616 影响。请参阅 Bishop Fox 博客上的[完整技术分析](https://bishopfox.com/blog/api-authentication-bypass-in-forticlient-ems-7-4-5-7-4-6-cve-2026-35616)。
## 描述
CVE-2026-35616 是 FortiClient EMS 7.4.5 和 7.4.6 中一个存在于身份认证之前的 API 绕过漏洞,允许远程未经身份验证的攻击者通过 HTTP 请求头欺骗绕过基于证书的身份认证。该 Django 应用程序将用户可控的 HTTP 请求头(`X-SSL-CLIENT-VERIFY`、`X-SSL-CLIENT-CERT`)视为等同于 Apache mod_ssl WSGI 环境变量,而 Apache 配置从未剥离这些请求头。结合仅执行可分辨名称(Distinguished Name)字符串匹配(不进行加密签名验证)的证书链验证机制,攻击者可以伪造证书并获得经过身份验证的 API 访问权限。Fortinet 已确认该漏洞在野外被利用。
该工具通过以下方式执行非破坏性漏洞测试:
1. 向 `/api/v1/fabric_device_auth/fortigate/init` 发送一个不包含任何欺骗请求头的基准 POST 请求
2. 发送相同的 POST 请求,但附带 `X-SSL-CLIENT-VERIFY: SUCCESS` 且不包含证书数据
3. 比较这两个响应以确定请求头是否到达 Django
发送不带证书 PEM 数据的验证请求头会触发检测路径,但由于未提供证书链而无法完成身份认证。服务器保持稳定状态,可以继续处理连接。
* **易受攻击的服务器** 将返回不同的响应:基准请求返回 HTTP 401("Certificate not found in request header"),而欺骗请求返回 HTTP 500(服务器错误),因为 `contains_certificate()` 通过了检查,但 `validate_cert_chain()` 因缺少 PEM 数据而崩溃。
* **已修补的服务器** 对这两个请求将返回相同的 HTTP 401 响应,因为热修复添加了 Apache `RequestHeader unset` 指令,在请求头到达 Django 之前将其剥离。
* **非 EMS 服务器** 将无法访问该端点,在这种情况下,工具将报告 `INCONCLUSIVE`(不确定)结果。
## 安装
```
git clone https://github.com/BishopFox/CVE-2026-35616-check
cd CVE-2026-35616-check
```
无外部依赖。该扫描器仅使用 Python 标准库模块。
## 用法
测试位于 `:` 的 FortiClient EMS 服务器。默认端口为 443/TCP。
```
python3 CVE-2026-35616-check.py [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
======================================================================
```
## 前置条件
只有在满足以下条件时,该工具才能检测到该漏洞:
* 目标运行的是 FortiClient EMS 7.4.5 或 7.4.6
* EMS Web 界面可访问
* `/api/v1/fabric_device_auth/fortigate/init` 端点存在并使用 `cert_chain_approved` 身份验证
如果未满足任何条件,工具将报告 `INCONCLUSIVE`(不确定)结果。
## 许可证
此代码基于 [MIT 许可证](LICENSE) 分发。
## 法律免责声明
在未事先获得相互同意的情况下,使用此工具攻击目标是非法的。最终用户有责任遵守所有适用的地方法、州法和联邦法律。开发者不承担任何责任,也不对本程序的任何误用或造成的损害负责。
## 另请参阅
* [Fortinet 公告 FG-IR-26-099](https://www.fortiguard.com/psirt/FG-IR-26-099)
* [Bishop Fox 博客:完整技术分析](https://bishopfox.com/blog/api-authentication-bypass-in-forticlient-ems-7-4-5-7-4-6-cve-2026-35616)
* [NVD — CVE-2026-35616](https://nvd.nist.gov/vuln/detail/CVE-2026-35616)
标签:Apache mod_ssl, API认证绕过, CISA项目, CVE-2026-35616, Django安全, FortiClient EMS, HTTP头部欺骗, Maven, SamuraiWTF, SSL证书伪造, 漏洞验证, 网络安全, 逆向工具, 隐私保护, 非破坏性测试, 预认证绕过