keraattin/CVE-2026-35616

GitHub: keraattin/CVE-2026-35616

针对 FortiClient EMS 身份验证绕过漏洞的检测与评估工具,解决在无认证情况下绕过身份验证并获取管理 API 访问权限的风险。

Stars: 0 | Forks: 0

# CVE-2026-35616 - FortiClient EMS 身份验证绕过到 RCE

CVE-2026-35616 CVSS 9.1 CISA KEV CWE-284

## TL;DR Fortinet FortiClient EMS 7.4.5 和 7.4.6 中存在严重的身份验证绕过漏洞,允许完全未经过身份验证的远程攻击者通过伪造单个 HTTP 头部(`X-SSL-CLIENT-VERIFY`)来绕过 API 身份验证。该漏洞的成因是 Django 中间件信任来自用户可控头部的客户端证书元数据,而不仅仅来自受信任的反向代理。这使得攻击者获得完整的管理 API 访问权限,并由此在企业范围内对受管端点执行任意代码。 **自 2026 年 3 月 31 日起被积极利用。2026 年 4 月 6 日被加入 CISA KEV。** ## 目录 - [快速要点](#quick-facts) - [什么是 FortiClient EMS?](#what-is-forticlient-ems) - [漏洞深度分析](#vulnerability-deep-dive) - [架构](#the-architecture) - [问题所在](#where-it-breaks) - [攻击流程](#the-attack-flow) - [影响分析](#impact-analysis) - [受影响版本](#affected-versions) - [利用时间线](#exploitation-timeline) - [检测](#detection) - [Python 扫描器](#python-scanner) - [Nmap NSE 脚本](#nmap-nse-script) - [手动验证](#manual-verification) - [妥协指标](#indicators-of-compromise) - [修复](#remediation) - [参考资料](#references) - [作者](#author) ## 快速要点 | 字段 | 说明 | |-------|--------| | **CVE ID** | CVE-2026-35616 | | **厂商** | Fortinet | | **产品** | FortiClient 企业管理服务器 (EMS) | | **受影响版本** | 7.4.5、7.4.6 | | **不受影响版本** | 7.2.x 系列、7.4.4 及更早版本 | | **CVSS v3.1** | 9.1(严重) | | **CWE** | CWE-284 - 不当访问控制 | | **攻击向量** | 网络 | | **身份验证要求** | 无需身份验证 | | **用户交互** | 无需交互 | | **漏洞成熟度** | 已在野外被利用 | | **CISA KEV** | 2026 年 4 月 6 日加入(截止日期:2026 年 4 月 9 日) | | **补丁** | 紧急热修复程序可用;完整修复在 7.4.7 版本中 | | **致谢** | Simo Kohonen (Defused Cyber)、Nguyen Duc Anh | ## 什么是 FortiClient EMS? FortiClient Enterprise Management Server (EMS) 是 Fortinet 的集中式端点管理平台。它作为命令与控制层,用于在组织内部署、配置和监控 FortiClient 代理。可以将其视为管理每个端点的“大脑”: - 向端点推送安全策略和 VPN 配置文件 - 管理端点合规性与状态检查 - 分发软件更新和补丁 - 与 FortiGate 防火墙集成,实现零信任网络访问 (ZTNA) - 存储和管理端点遥测数据、证书和凭据 当攻击者获得 EMS 的管理访问权限时,他们实质上就掌握了组织内所有受管端点的“钥匙”。 ## 漏洞深度分析 ### 架构 FortiClient EMS 在后台使用相当标准的 Web 应用架构: ``` +----------------+ +----------------+ +----------------+ | Browser / | HTTPS | Apache | WSGI | Django | | API Client | -------> | (mod_ssl) | -------> | Backend | +----------------+ +----------------+ +----------------+ ``` 当启用双向 TLS (mTLS) 时,Apache 的 `mod_ssl` 负责处理客户端证书验证。验证完成后,Apache 通过**受信任的 WSGI 环境变量**将验证结果传递给 Django: - `SSL_CLIENT_VERIFY` — 验证状态(`SUCCESS`、`NONE`、`FAILED`) - `SSL_CLIENT_S_DN` — 证书中的主题可分辨名称 - `SSL_CLIENT_SERIAL` — 证书序列号 这是标准且安全的模式。问题出在 Django 中间件读取这些数据的方式上。 ### 问题所在 在 FortiClient EMS 7.4.5 和 7.4.6 中,Django 身份验证中间件被修改为也接受来自 **HTTP 请求头部** 的相同信息: - `X-SSL-CLIENT-VERIFY` - `X-SSL-CLIENT-S-DN` - `X-SSL-CLIENT-SERIAL` 这可能是为了支持 Apache 不是 TLS 终止点的反向代理部署。然而,中间件并未区分这两种来源。它先检查 WSGI 变量,但如果这些变量不存在(未配置 mTLS 或直接连接),则会回退到 HTTP 头部——而这些头部可以被任意客户端设置。 以下是概念性分解: ``` SECURE PATH (intended): Apache mod_ssl validates cert --> sets WSGI env vars --> Django reads env vars [OK] INSECURE PATH (the vulnerability): Attacker sets HTTP headers directly --> Django reads headers --> Trusts them [FAIL] ``` 中间件实际上让客户端自我声明其证书验证状态。这就像保安问一个人:“之前的保安已经查过你的身份证了吗?”当对方回答“是”时,就允许其进入。 ### 攻击流程 ``` Step 1: Attacker sends a POST request to an EMS API endpoint with these headers: X-SSL-CLIENT-VERIFY: SUCCESS X-SSL-CLIENT-S-DN: CN=admin X-SSL-CLIENT-SERIAL: 0000000000000001 Step 2: Django middleware checks for WSGI env vars → not present Falls back to HTTP headers → finds X-SSL-CLIENT-VERIFY: SUCCESS Step 3: Middleware treats request as authenticated with admin identity Step 4: Attacker has full administrative API access Step 5: From the admin API, attacker can: - Push malicious policies to all managed endpoints - Extract stored credentials and certificates - Deploy payloads via software distribution - Modify ZTNA configurations - Pivot into the broader network ``` 整个攻击仅需一次 HTTP 请求。不需要暴力破解、凭证填充或社会工程学。只需伪造一个头部即可。 ## 影响分析 这里的严重性不仅限于服务器本身。FortiClient EMS 是一个“力量倍增器”——一旦被攻破,攻击者就能对**所有受管端点**施加影响: **直接影响:** - 对 EMS 控制台拥有完全的管理员控制权 - 访问所有存储的端点配置、凭据和证书 - 读取/修改/删除端点策略 - 访问 VPN 配置和 ZTNA 设置 **通过受管端点的下游影响:** - 通过软件分发向所有受管设备部署恶意软件 - 从端点遥测中收集凭证 - 禁用或削弱所有受管端点的安全控制 - 通过 VPN/ZTNA 配置操纵进行横向移动 - 通过基于策略的有效负载交付实现持久后门访问 **企业级风险:** - 在典型企业部署中,EMS 管理数百到数千个端点 - 单个 EMS 实例被攻破可能导致整个组织被完全控制 - FortiClient EMS 通常部署在具有广泛访问权限的可信网络区域 ## 受影响版本 | 版本 | 状态 | |---------|--------| | FortiClient EMS 7.4.6 | **易受攻击** | | FortiClient EMS 7.4.5 | **易受攻击** | | FortiClient EMS 7.4.4 及更早版本 | 未受影响 | | FortiClient EMS 7.2.x | 未受影响 | ## 利用时间线 | 日期 | 事件 | |------|-------| | ~2026 年 3 月下旬 | 漏洞由 Simo Kohonen 和 Nguyen Duc Anh 发现并报告 | | 2026 年 3 月 31 日 | 首次在蜜罐中记录利用尝试 (Defused Cyber) | | 2026 年 4 月 4 日 | Fortinet 为 7.4.5 和 7.4.6 发布紧急热修复程序 | | 2026 年 4 月 6 日 | CISA 将 CVE-2026-35616 加入 KEV 列表(截止日期:2026 年 4 月 9 日) | | 2026 年 4 月 13 日 | 本检测工具包发布 | ## 检测 ### Python 扫描器 该 Python 脚本使用差异响应技术测试多个 API 端点。 **工作原理:** 1. **指纹识别** — 通过 HTTP 响应体和头部识别 FortiClient EMS 2. **基线请求** — 向每个 API 端点发送不带伪造头部的 POST 请求(预期返回 `HTTP 401 未授权`) 3. **伪造请求** — 向同一请求注入 `-SSL-CLIENT-VERIFY: SUCCESS` 4. **对比** — 如果状态码从 `401` 变为其他值(通常是 `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 ``` ### Nmap NSE 脚本 ``` # 安装 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` 头的异常 API 请求**,来自非代理源 - **未预期的策略变更**,在无管理员会话活动的情况下推送到端点 - **新的管理员账户或修改的凭据**,在 EMS 中无对应操作日志 - **受管端点上异常的 FortiClient 代理行为**(如新的软件安装、策略变更) - **Apache 访问日志** 显示无对应 mTLS 握手的 API 调用 - **蜜罐/IDS 告警**,涉及证书相关头部注入 **要查看的日志来源:** - FortiClient EMS 应用程序日志 - Apache 访问和错误日志 - 受管端点上的 FortiClient 代理日志 - 显示连接至 EMS API 端口的网络流量数据 ## 修复 **立即操作(现在就做):** 1. **应用热修复程序** — Fortinet 于 2026 年 4 月 4 日为 FortiClient EMS 7.4.5 和 7.4.6 发布了紧急热修复 2. **限制网络访问** — 仅允许受信任的管理网络访问 EMS 管理界面(使用防火墙规则、ACL) 3. **监控 API 活动** — 启用详细日志记录并监控异常 API 访问模式 **短期(本周内):** 4. **升级到 FortiClient EMS 7.4.7**(可用时)获取完整修复 5. **审核端点配置** — 检查所有受管端点是否存在未经授权的策略变更 6. **轮换凭据** — 更改所有管理员密码并重新生成 EMS 管理的证书 7. **审查受管端点** — 扫描是否存在恶意软件部署或未授权的配置变更迹象 **长期:** 8. **网络分段** — 确保 EMS 处于隔离的管理 VLAN 中,并实施严格的访问控制 9. **WAF/反向代理规则** — 在网络边缘部署规则,以剥离传入请求中的 `X-SSL-CLIENT-VERIFY`、`X-SSL-CLIENT-S-DN` 和 `X-SSL-CLIENT-SERIAL` 头部 10. **监控** — 实施对无有效 mTLS 会话的 API 访问的告警机制 ## 参考资料 - [CISA KEV 目录 - CVE-2026-35616](https://www.cisa.gov/news-events/alerts/2026/04/06/cisa-adds-one-known-exploited-vulnerability-catalog) - [Tenable 博客 - CVE-2026-35616 分析](https://www.tenable.com/blog/cve-2026-35616-fortinet-forticlientems-improper-access-control-vulnerability-exploited-in-the) - [Bishop Fox - FortiClient EMS 中的 API 身份验证绕过](https://bishopfox.com/blog/api-authentication-bypass-in-forticlient-ems-7-4-5-7-4-6-cve-2026-35616) - [SOCRadar - CVE-2026-35616 FortiClient EMS 身份验证绕过](https://socradar.io/blog/cve-2026-35616-forticlient-ems-auth-bypass/) - [Horizon3.ai - CVE-2026-35616 分析](https://horizon3.ai/attack-research/vulnerabilities/cve-2026-35616/) - [BleepingComputer - FortiClient EMS 漏洞在攻击中被利用](https://www.bleepingcomputer.com/news/security/new-fortinet-forticlient-ems-flaw-cve-2026-35616-exploited-in-attacks/) - [The Hacker News - Fortinet 修复被积极利用的 CVE-2026-35616](https://thehackernews.com/2026/04/fortinet-patches-actively-exploited-cve.html) ## 作者 **Kerem Oruç** — 网络安全工程师 - GitHub:[@keraattin](https://github.com/keraattin) - Twitter:[@keraattin](https://twitter.com/keraattin)
标签:API安全, BurpSuite集成, CISA KEV, CVE, CVE-2026-35616, CVSS 9.1, CWE-284, Django中间件, FortiClient, FortiClient EMS, HTTP头伪造, JSON输出, Nmap NSE, Python扫描器, RCE, URL发现, X-SSL-CLIENT-VERIFY, 中间人攻击, 主动利用, 企业安全, 协议分析, 安全检测, 完全未认证, 客户端证书, 数字签名, 权限提升, 检测脚本, 漏洞分析, 漏洞披露, 端点安全, 编程工具, 网络安全, 网络资产管理, 补丁管理, 认证绕过, 路径探测, 身份验证绕过, 远程代码执行, 逆向工具, 隐私保护