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, 出站规则, 安全漏洞, 安全诊断工具, 安全防护绕过, 实时处理, 数据展示, 红队, 网络安全, 误报, 运维安全, 隐私保护