atiilla/CVE-2026-42897
GitHub: atiilla/CVE-2026-42897
该项目揭示了 Exchange HealthChecker 诊断工具因未检测 IIS 出站重写规则,从而导致 EOMT 安全缓解状态被错误报告的盲点漏洞及其修复方案。
Stars: 0 | Forks: 0
# CVE-2026-42897 - Exchange Health Checker 出站重写规则盲区
**严重程度:** 中等 (CVSS 5.3)
**组件:** Microsoft CSS-Exchange - `HealthChecker` 诊断工具
**受影响的文件:**
- `Diagnostics/HealthChecker/Analyzer/Get-URLRewriteRule.ps1` (L49, L72, L97)
- `Diagnostics/HealthChecker/Analyzer/Invoke-AnalyzerIISInformation.ps1` (L442–459)
**报告日期:** 2026-05-15
**致谢:** 由报告 [CSS-Exchange issue #2539](https://github.com/microsoft/CSS-Exchange/issues/2539) 的研究人员首次发现
**参考:**
- CSS-Exchange GitHub: `Get-URLRewriteRule.ps1`, `Invoke-AnalyzerIISInformation.ps1`
- EOMT 缓解脚本: `Security/src/EOMT/Mitigations/CVE-2026-42897.ps1` (L147–254)
## 概述
Exchange Health Checker (`HealthChecker.ps1`) 作为其服务器配置审计的一部分,会报告 IIS URL Rewrite 规则。然而,规则枚举函数 `Get-URLRewriteRule.ps1` 仅读取**入站**规则 (`system.webServer/rewrite/rules`),并静默忽略了**出站**规则 (`system.webServer/rewrite/outboundRules`)。
针对 CVE-2026-42897 的 EOMT (Exchange On-premises Mitigation Tool) 缓解措施部署了一条名为 `EOMT OWA CSP - outbound` 的 Content-Security-Policy 头注入规则,作为 IIS 的**出站** URL Rewrite 规则。由于 Health Checker 从未读取 `outboundRules`,因此该缓解规则在 Health Checker 的报告中是**完全不可见**的。
依赖 Health Checker 来确认 EOMT 缓解措施已到位的 Exchange 管理员,将会收到一份未显示任何出站 CSP 规则的报告——这为缓解状态产生了一个假阴性结果,并造成一种虚假的风险暴露感,或者相反,在已经应用了缓解措施的情况下,产生一种未应用缓解措施的虚假信心。
## 漏洞详情
### 根本原因
`Get-URLRewriteRule.ps1` 中的三个不同代码路径都仅从 `.rewrite.rules` 读取数据:
**路径 1 - web.config 解析 (L49):**
```
$rules = $content.configuration.'system.webServer'.rewrite.rules
```
**路径 2 - applicationHost.config 按位置解析 (L72):**
```
$rules = $location.'system.webServer'.rewrite.rules
```
**路径 3 - applicationHost.config 全局解析 (L97):**
```
$rules = $ApplicationHostConfig.configuration.'system.webServer'.rewrite.rules
```
这些路径均未访问 `.rewrite.outboundRules`。随后,返回的 `$rules` 对象会在 `Invoke-AnalyzerIISInformation.ps1` (L442–459) 中被迭代:
```
$displayRewriteRules = ($currentRewriteRules.rule | Where-Object { $_.enabled -ne "false" }).name |
Where-Object { $_ -notcontains $excludeRules }
```
`.rule` 成员仅存在于入站的 `` 集合中。即使读取了 `outboundRules`,显示逻辑也需要进行更新,以便从这两个集合中迭代 `.rule`。
### 受影响的 IIS XML 结构
IIS 将 URL Rewrite 配置存储在 `` 节点下的两个独立子级中:
```
```
### 影响
| 场景 | 影响 |
|---|---|
| 管理员在应用 EOMT 后运行 Health Checker | 报告未显示任何出站 CSP 规则 → 管理员认为缓解措施缺失 |
| 管理员将 Health Checker 用作唯一的审计工具 | 如果不手动检查 IIS 配置,就无法验证 EOMT 出站规则 |
| 事件响应 / 合规性检查 | Health Checker 输出中缺失缓解措施的证据 |
| 解析 Health Checker JSON 的自动化监控 | 出站规则的存在与否永远不会被暴露出来 |
## 概念验证
请参阅此目录中的 `poc_cve_2026_42897.ps1`。
该脚本:
1. 在内存中构建一个模拟的 `web.config` XML,包含一条入站规则和 EOMT 的 `EOMT OWA CSP - outbound` 出站规则。
2. 运行**存在漏洞**的 Health Checker 解析逻辑(仅入站)并显示其输出。
3. 运行**已修复**的解析逻辑(入站 + 出站)并显示差异。
4. 重现所有三个配置路径(web.config、applicationHost 按位置、applicationHost 全局)。
```
.\poc_cve_2026_42897.ps1
```
在存在漏洞(未打补丁)的 Health Checker 上的预期输出:
```
[*] Vulnerable path (inbound only):
Rules found: Redirect to HTTPS
MISSING: EOMT OWA CSP - outbound
[*] Patched path (inbound + outbound):
Rules found: Redirect to HTTPS, EOMT OWA CSP - outbound
Outbound rule visible: TRUE
```
## 修复方案
**对 `Get-URLRewriteRule.ps1` 的修复** - 在每个路径读取这两个集合:
```
# web.config (L49)
$inbound = $content.configuration.'system.webServer'.rewrite.rules
$outbound = $content.configuration.'system.webServer'.rewrite.outboundRules
$rules = @{ inbound = $inbound; outbound = $outbound }
# applicationHost.config per-location (L72)
$inbound = $location.'system.webServer'.rewrite.rules
$outbound = $location.'system.webServer'.rewrite.outboundRules
$rules = @{ inbound = $inbound; outbound = $outbound }
# applicationHost.config 全局 (L97)
$inbound = $ApplicationHostConfig.configuration.'system.webServer'.rewrite.rules
$outbound = $ApplicationHostConfig.configuration.'system.webServer'.rewrite.outboundRules
$rules = @{ inbound = $inbound; outbound = $outbound }
```
**对 `Invoke-AnalyzerIISInformation.ps1` 的修复** - 迭代这两个集合:
```
$displayRewriteRules = @()
$displayRewriteRules += ($currentRewriteRules.inbound.rule |
Where-Object { $_.enabled -ne "false" }).name |
Where-Object { $_ -notcontains $excludeRules }
$displayRewriteRules += ($currentRewriteRules.outbound.rule |
Where-Object { $_.enabled -ne "false" }).name |
Where-Object { $_ -notcontains $excludeRules }
```
## 时间线
| 日期 | 事件 |
|---|---|
| 2026-05-15 | 在 EOMT 部署验证研究期间发现问题 |
| 2026-05-15 | 编写 PoC 并针对模拟的 IIS 配置进行测试 |
*仅供授权安全研究使用。请在受控的实验环境中进行测试。*
标签:AI合规, CVE-2026-42897, EOMT, Exchange Health Checker, IIS URL Rewrite, IIS配置, Libemu, Microsoft Exchange, osquery, 出站规则, 安全漏洞, 安全诊断工具, 安全防护绕过, 实时处理, 数据展示, 红队, 网络安全, 误报, 运维安全, 隐私保护