FortiBleed 深度复盘:CVE-2026-35616 如何收割 1.1 亿凭证、瘫痪 354 个组织
事件概览
2026 年 7 月 2 日,Orca Security 发布了一份震惊安全社区的深度分析报告——FortiBleed。这不是一次普通的漏洞利用,而是一场规模空前的 Fortinet 凭证窃取行动:
- 430,000+ 台面向互联网的 FortiGate 防火墙被扫描
- 1.1 亿+ 条凭证被窃取
- 409 个目标获得管理员权限
- 354 个组织完全域沦陷
- ~12,000 台设备被部署 Golang 嗅探器
- 12+ 起勒索软件部署已确认
攻击者利用 FortiClient EMS 产品的访问控制漏洞 CVE-2026-35616(CVSS 9.1,无需认证),在 FortiGate 设备上部署名为 FortigateSniffer 的自定义 Golang 数据包嗅探器,滥用 FortiOS 原生的 diagnose sniffer packet 命令被动拦截认证流量,覆盖 RADIUS、NTLM、Kerberos 等 24 种协议,不触发传统入侵检测系统。
SOCRadar 威胁研究团队将攻击活动溯源至 INC Ransom 和 Lynx RaaS 勒索软件组织。截至 7 月 7 日攻击仍处于活跃状态。
CVE-2026-35616 漏洞技术分析
漏洞基础信息
| 属性 | 值 |
|---|---|
| CVE ID | CVE-2026-35616 |
| CVSS 3.1 | 9.1(Critical) |
| CWE | CWE-284: Improper Access Control |
| 受影响版本 | FortiClient EMS 7.4.5 – 7.4.6 |
| 不受影响版本 | 7.2 及以下、7.4.7+ |
| 利用前提 | 无需认证,远程可利用 |
| CISA KEV | 2026-04-06 列入 |
| 联邦修复截止 | 2026-04-09(3 天窗口) |
漏洞原理
FortiClient EMS 是 Fortinet 的企业端点管理平台,负责集中管理所有 FortiClient 代理。CVE-2026-35616 的核心问题在于 API 请求处理路径中的访问控制逻辑缺陷:
- EMS 的某些敏感 API 端点未正确验证用户凭证或会话令牌
- 攻击者可以构造特制的未认证 API 请求,绕过身份验证检查
- 服务器将这些请求视为有效的已认证命令进行处理
- 攻击者获得 EMS 服务器的完全管理控制权
这不是一个简单的配置错误——它是访问控制逻辑的代码级缺陷,需要厂商针对性修复。攻击者无需任何凭证、会话令牌或前置访问权限, bypass 是完全预认证的。
利用时间线
2026-03-31 watchTowr honeypot 首次捕获利用活动
2026-04-03 Defused Cyber 确认零日利用
2026-04-04 Fortinet 发布带外安全公告 FG-IR-26-099 + 热修复
2026-04-06 CISA 列入 KEV 目录,联邦 3 天修复窗口
2026-04-09 联邦机构修复截止日
2026-05-XX Arctic Wolf 发现 EKZ Stealer 信息窃取器 Campaign
2026-07-02 Orca Security 发布 FortiBleed 深度分析
2026-07-07 攻击仍在活跃,SOCRadar 溯源至 INC/Lynx从 watchTowr honeypot 首次捕获到 Fortinet 发布公告之间存在 6 天的零日窗口——在此期间攻击者已针对生产目标发起攻击,而防御者毫不知情。
攻击链完整拆解
第一阶段:初始入侵——EMS 服务器接管
攻击者通过互联网扫描暴露的 FortiClient EMS 管理接口(默认端口 8013),利用 CVE-2026-35616 绕过认证获得管理员权限:
# 检测脚本:扫描暴露的 FortiClient EMS 实例
import requests
import socket
from urllib.parse import urljoin
def check_forticlient_ems_exposure(target_url):
"""检测 FortiClient EMS 是否暴露且可能受 CVE-2026-35616 影响"""
indicators = {
"port_8013_open": False,
"ems_version": None,
"vulnerable": False,
"internet_exposed": False
}
# 检查端口 8013 是否开放
try:
parsed = socket urlparse(target_url)
host = parsed.hostname
port = parsed.port or 8013
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(5)
result = sock.connect_ex((host, port))
if result == 0:
indicators["port_8013_open"] = True
indicators["internet_exposed"] = True
sock.close()
except Exception:
pass
# 检查 EMS 版本
try:
# EMS 信息端点通常不需要认证
resp = requests.get(
urljoin(target_url, "/api/v1/system/info"),
timeout=10,
verify=False,
headers={"User-Agent": "FortiClient-EMS-Check/1.0"}
)
if resp.status_code == 200:
data = resp.json()
version_str = data.get("version", "")
indicators["ems_version"] = version_str
# 检查是否在受影响版本范围内
if version_str.startswith("7.4."):
minor = int(version_str.split(".")[2])
if 5 <= minor <= 6:
indicators["vulnerable"] = True
except Exception:
pass
return indicators
def detect_fortigate_sniffer_iocs(fortigate_config):
"""检测 FortigateSniffer 相关 IOC"""
iocs = {
"sniffer_command_found": False,
"suspicious_admin_accounts": [],
"unknown_certs": []
}
# FortigateSniffer 使用 diagnose sniffer packet 命令
sniffer_patterns = [
"diagnose sniffer packet any",
"FortigateSniffer",
"83.138.53.110", # 已知 C2 IP
]
config_str = str(fortigate_config)
for pattern in sniffer_patterns:
if pattern.lower() in config_str.lower():
iocs["sniffer_command_found"] = True
break
# 检查后门管理员账户
# FortiBleed 攻击者会创建隐藏的 admin 账户
suspicious_admin_names = ["adminin", "support_ext", "config_sync"]
for name in suspicious_admin_names:
if name in config_str:
iocs["suspicious_admin_accounts"].append(name)
return iocs第二阶段:FortigateSniffer 部署
获得 EMS 控制权后,攻击者通过 EMS 的管理通道向 FortiGate 防火墙推送 FortigateSniffer——一个用 Golang 编写的自定义数据包嗅探器。
FortigateSniffer 的关键特征:
- 语言:Golang 编译,静态链接,跨平台
- 部署方式:通过 EMS 管理通道静默推送,伪装为合法 Fortinet 更新
- 隐蔽性:滥用 FortiOS 原生
diagnose sniffer packet命令,不触发 IDS - 覆盖面:拦截 24 种协议的认证流量
覆盖的 24 种协议包括但不限于:
| 协议类别 | 具体协议 |
|---|---|
| 认证协议 | RADIUS, NTLM, NTLMv2, Kerberos, LDAP(s) |
| 远程访问 | VPN (SSL/IPSec), SSH, Telnet, RDP |
| Web 协议 | HTTP Basic, HTTP Digest, NTLM over HTTP |
| 邮件协议 | SMTP Auth, POP3, IMAP |
| 文件协议 | SMB, FTP, SFTP |
| 目录服务 | LDAP, LDAPS, Global Catalog |
| 其他 | SNMP, TACACS+, 802.1X, EAP |
第三阶段:凭证收集与横向移动
FortigateSniffer 被动收集的凭证被回传至 C2 服务器(已知 IP: 83.138.53.110,关联 Tor 出口节点)。攻击者利用这些凭证实现:
- 管理员权限获取:409 个目标获得 FortiGate 管理员登录
- 域沦陷:354 个组织通过 Kerberos/NTLM 凭证实现完整域控接管
- 横向移动:利用 RDP/SSH/VPN 凭证渗透内部网络
- 持久化:在 ~12,000 台设备上维持嗅探器驻留
第四阶段:勒索软件部署
INC Ransom 和 Lynx RaaS 勒索软件组织利用窃取的凭证发起最终攻击:
- 12+ 起勒索软件部署已确认
- 数百 端点被加密
- 受影响行业:制造业、科技、物流
- 地域分布:拉美和亚太地区
SOCRadar 发现,一个 FortiBleed 基础设施操作者同时登录了 INC Ransom 和 Lynx 的勒索谈判面板,受害者数据存在重叠。内部文件显示这是一个约 20 人的组织化团队,有明确分工,核心操作者驱动大部分高影响入侵。
EKZ Stealer:供应链维度
2026 年 5 月,Arctic Wolf 发现了另一个利用 CVE-2026-35616 的 Campaign——EKZ Stealer 信息窃取器:
- 攻击者通过 EMS 管理通道推送伪装为
FortiEndpoint_Patch.exe的恶意载荷 - 修改 EMS 管理配置,注入恶意 PowerShell 命令在所有受管端点上执行
- EKZ Stealer 针对 Chromium 内核浏览器和 Firefox 窃取:
- 保存的密码
- Cookie
- 自动填充数据
- 绕过 Chrome 加密密码存储
- 凭证通过 HTTP 外传,单个被攻陷的 EMS 服务器感染其管理的 每一个端点
这揭示了 FortiClient EMS 作为供应链瓶颈的危险性——它不是传统的端点安全工具,而是集中化的命令与控制层。控制了 EMS 就等于控制了整个端点安全态势。
为什么传统检测失效
FortiBleed 攻击之所以能大规模成功,关键在于它绕过了多层安全防御:
1. 原生命令滥用
FortigateSniffer 使用的 diagnose sniffer packet 是 FortiOS 的合法诊断命令。传统 IDS/IPS 不会标记管理员使用内置诊断工具的行为,即使该命令正在捕获所有认证流量。
2. 管理通道信任
EMS 到 FortiGate 的通信走的是可信管理通道。恶意载荷推送看起来与正常的策略更新无异,端点 EDR 不会标记来自"官方安全管理服务器"的指令。
3. 被动嗅探模式
FortigateSniffer 是被动嗅探器——不发送探测包、不发起连接、不修改网络流量。它只是监听并记录,这种低交互模式极难被网络行为分析检测到。
4. Golang 静态二进制
Golang 编译的静态二进制文件没有外部依赖,不触发 DLL 加载监控,也不匹配传统 YARA 规则。二进制大小可能被伪装为合法 Fortinet 组件。
检测与防御方案
紧急检测清单
#!/bin/bash
# FortiBleed 检测脚本 - 在 FortiGate 设备上运行
echo "=== FortiBleed 检测 ==="
# 1. 检查异常管理员账户
echo "[1] 检查管理员账户列表..."
config system admin
show | grep -E "adminin|support_ext|config_sync"
end
# 2. 检查 diagnose sniffer 残留
echo "[2] 检查 sniffer 进程..."
diagnose sniffer packet status 2>/dev/null || echo " 无活跃 sniffer"
# 3. 检查异常出站连接
echo "[3] 检查到已知 C2 的连接..."
diagnose firewall iprope lookup src 83.138.53.110 2>/dev/null
# 4. 检查 EMS 连接状态
echo "[4] 检查 EMS 连接..."
diagnose endpoint fctems status
# 5. 检查配置变更历史
echo "[5] 检查近期配置变更..."
execute log filter category system
execute log display | tail -20网络层防御
# Suricata 规则:检测 FortigateSniffer 行为
# 规则 1: 检测从 FortiGate 到已知 C2 的连接
alert ip $HOME_NET any -> [83.138.53.110/32] any (
msg:"FortiBleed C2 Communication - Known FortigateSniffer C2";
sid:2026356161;
rev:1;
reference:cve,2026-35616;
classtype:trojan-activity;
priority:1;
)
# 规则 2: 检测大量凭证协议流量从同一源发起(嗅探器特征)
alert tcp $FORTIGATE_NET any -> $INTERNAL_NET any (
msg:"Potential FortigateSniffer - Mass credential protocol capture";
flow:established;
detection_filter:track by_src, count 100, seconds 60;
sid:2026356162;
rev:1;
reference:cve,2026-35616;
classtype:trojan-activity;
)加固清单
| 优先级 | 措施 | 详情 |
|---|---|---|
| P0 | 升级 FortiClient EMS | 升级至 7.4.7+ 或应用带外热修复 |
| P0 | 凭证轮换 | 轮换所有 FortiGate 管理基础设施凭证(VPN/RADIUS/NTLM/Kerberos/管理员) |
| P0 | 审计后门账户 | 检查是否存在 adminin 等未授权管理员账户 |
| P1 | 端口限制 | 将 EMS 端口 8013 限制为仅可信 IP 白名单 |
| P1 | 启用 MFA | 在所有 FortiGate 管理接口上启用多因素认证 |
| P1 | 封锁 C2 | 封锁 IP 83.138.53.110 及关联 Tor 出口节点 |
| P2 | 网络分段 | 将 EMS 服务器隔离在受限网络段 |
| P2 | 部署 IOC 检测 | 使用 FortigateSniffer IOC 进行威胁狩猎 |
| P3 | 替代方案 | 评估将 FortiGate 管理接口从公网撤下,改用 ZTNA 方案 |
MITRE ATT&CK 映射
| 战术 | 技术 | ID |
|---|---|---|
| Initial Access | Exploit Public-Facing Application | T1190 |
| Initial Access | Valid Accounts | T1078 |
| Persistence | Create Account | T1136 |
| Persistence | Modify Authentication Process | T1556 |
| Credential Access | Network Sniffing | T1040 |
| Credential Access | OS Credential Dumping | T1003 |
| Lateral Movement | Remote Services | T1021 |
| Impact | Data Encrypted for Impact | T1486 |
与其他 Fortinet 漏洞的关联
FortiBleed 并非孤立事件。Fortinet 产品线在 2024-2026 年间频繁成为攻击目标:
- CVE-2024-55591:FortiManager 任意文件上传(2024 年末在野利用)
- CVE-2025-22271:FortiManager 缺少认证(2025 年初在野利用)
- CVE-2026-21643:FortiClient EMS 未认证 SQL 注入(2026 年初在野利用)
- CVE-2026-35616:FortiClient EMS 访问控制绕过(本次 FortiBleed)
攻击者正在系统性地将 FortiClient EMS 作为企业入口的高价值目标。EMS 的供应链特性——一个服务器控制所有端点——使其成为初始访问经纪人的理想跳板。
经验教训
1. 管理平面是新的攻击面
传统安全关注数据平面(用户流量),但 FortiBleed 证明管理平面才是真正的软肋。一个 EMS 服务器被攻陷,等于整个端点安全体系被攻陷。
2. 原生工具是最佳伪装
FortigateSniffer 之所以隐蔽,是因为它使用 FortiOS 自带的诊断命令。安全团队需要重新审视所有内置诊断/调试工具的滥用风险。
3. KEV 不等于安全
CISA 在 4 月 6 日就将 CVE-2026-35616 列入 KEV,但截至 7 月仍有大量组织未完成修补。漏洞披露 ≠ 漏洞修复——攻击者专门扫描已知但未修补的漏洞。
4. 凭证轮换是必修课
即使已经打了补丁,被窃取的 1.1 亿条凭证仍然有效。凭证轮换不是可选项,而是事件响应的标准动作。
参考资料
- Orca Security: FortiBleed 深度分析报告
- SOCRadar: FortiBleed 威胁研究
- The Hacker News: FortiBleed Credential Theft Linked to INC and Lynx
- Fortinet PSIRT Advisory FG-IR-26-099
- CISA KEV: CVE-2026-35616
- Arctic Wolf: EKZ Stealer Campaign Analysis
- Threataft: FortiClient EMS CVE-2026-35616 Technical Analysis
- Kudelski Security: Critical Vulnerability in Fortinet FortiClient EMS

