
CVE-2026-42897 - ponto cego do Exchange Health Checker: regras de URL Rewrite de saída do IIS silenciosamente ignoradas, tornando as mitigações do EOMT invisíveis nos relatórios de diagnóstico.
Gravidade: Média (CVSS 5.3)
Componente: Microsoft CSS-Exchange - ferramenta de diagnóstico HealthChecker
Arquivos Afetados:
Diagnostics/HealthChecker/Analyzer/Get-URLRewriteRule.ps1 (L49, L72, L97)Diagnostics/HealthChecker/Analyzer/Invoke-AnalyzerIISInformation.ps1 (L442–459)
Relatado: 2026-05-15
Crédito: Descoberta original pelo pesquisador que relatou a issue #2539 do CSS-Exchange
Referências:Get-URLRewriteRule.ps1, Invoke-AnalyzerIISInformation.ps1Security/src/EOMT/Mitigations/CVE-2026-42897.ps1 (L147–254)O Exchange Health Checker (HealthChecker.ps1) relata as regras de Reescrita de URL do IIS como parte de sua auditoria de configuração do servidor. No entanto, a função de enumeração de regras Get-URLRewriteRule.ps1 lê apenas as regras de entrada (system.webServer/rewrite/rules) e ignora silenciosamente as regras de saída (system.webServer/rewrite/outboundRules).
A mitigação do EOMT (Exchange On-premises Mitigation Tool - Ferramenta de Mitigação do Exchange On-premises) para CVE-2026-42897 implanta uma regra de injeção de cabeçalho Content-Security-Policy chamada EOMT OWA CSP - outbound como uma regra de Reescrita de URL de saída do IIS. Como o Health Checker nunca lê outboundRules, essa regra de mitigação é completamente invisível nos relatórios do Health Checker.
Um administrador do Exchange que depende do Health Checker para confirmar se as mitigações do EOMT estão aplicadas receberá um relatório que não mostra nenhuma regra de CSP de saída - gerando um falso negativo para o status da mitigação e criando uma falsa sensação de exposição ou, inversamente, uma falsa confiança de que nenhuma mitigação foi aplicada quando, na verdade, foi.
Três caminhos de código distintos em Get-URLRewriteRule.ps1 leem apenas de .rewrite.rules:
Caminho 1 - análise do web.config (L49):
$rules = $content.configuration.'system.webServer'.rewrite.rules
Caminho 2 - applicationHost.config por local (L72):
$rules = $location.'system.webServer'.rewrite.rules
Caminho 3 - applicationHost.config global (L97):
$rules = $ApplicationHostConfig.configuration.'system.webServer'.rewrite.rules
Nenhum desses caminhos acessa .rewrite.outboundRules. O objeto $rules retornado é então iterado em Invoke-AnalyzerIISInformation.ps1 (L442–459):
$displayRewriteRules = ($currentRewriteRules.rule | Where-Object { $_.enabled -ne "false" }).name |
Where-Object { $_ -notcontains $excludeRules }
O membro .rule existe apenas na coleção <rules> de entrada. Mesmo que outboundRules fosse lido, a lógica de exibição precisaria ser atualizada para iterar .rule de ambas as coleções.
O IIS armazena a configuração de Reescrita de URL com dois filhos separados sob <rewrite>:
<system.webServer>
<rewrite>
<!-- inbound - what Health Checker reads -->
<rules>
<rule name="Redirect to HTTPS" enabled="true">
<match url=".*" />
<conditions><add input="{HTTPS}" pattern="^OFF$" /></conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:0}" />
</rule>
</rules>
<!-- outbound - INVISIBLE to Health Checker -->
<outboundRules>
<rule name="EOMT OWA CSP - outbound" enabled="true">
<match serverVariable="RESPONSE_Content-Security-Policy" pattern=".*" />
<action type="Rewrite"
value="default-src 'self'; script-src 'self' 'unsafe-inline';
style-src 'self' 'unsafe-inline';" />
</rule>
</outboundRules>
</rewrite>
</system.webServer>
| Cenário | Efeito |
|---|---|
| Administrador executa o Health Checker após aplicar o EOMT | O relatório não mostra nenhuma regra de CSP de saída → o administrador acredita que a mitigação está ausente |
Consulte poc_cve_2026_42897.ps1 neste diretório.
O script:
web.config simulado em memória com uma regra de entrada e a regra de saída EOMT OWA CSP - outbound do EOMT..\poc_cve_2026_42897.ps1
Saída esperada em um Health Checker vulnerável (sem correção):
[*] 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
Correção em Get-URLRewriteRule.ps1 - leia ambas as coleções em cada caminho:
# 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 global (L97)
$inbound = $ApplicationHostConfig.configuration.'system.webServer'.rewrite.rules
$outbound = $ApplicationHostConfig.configuration.'system.webServer'.rewrite.outboundRules
$rules = @{ inbound = $inbound; outbound = $outbound }
Correção em Invoke-AnalyzerIISInformation.ps1 - itere ambas as coleções:
$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 }
| Data | Evento |
|---|---|
| 2026-05-15 | Problema identificado durante pesquisa de verificação de implantação do EOMT |
| 2026-05-15 | PoC escrita e testada contra configuração simulada do IIS |
SOMENTE PARA PESQUISA DE SEGURANÇA AUTORIZADA. Teste exclusivamente em ambientes de laboratório controlados.
| Administrador usa o Health Checker como única ferramenta de auditoria | Não é possível verificar as regras de saída do EOMT sem inspecionar manualmente a configuração do IIS |
| Resposta a incidentes / verificações de conformidade | As evidências de mitigação estão ausentes da saída do Health Checker |
| Monitoramento automatizado que analisa o JSON do Health Checker | A presença/ausência de regra de saída nunca é exibida |