
CVE-2026-42897 - Punto ciego del Exchange Health Checker: las reglas de reescritura de URL de IIS de salida se ignoran silenciosamente, lo que hace que las mitigaciones de EOMT sean invisibles en los informes de diagnóstico.
Severidad: Media (CVSS 5.3)
Componente: Microsoft CSS-Exchange - herramienta de diagnóstico HealthChecker
Archivos afectados:
Diagnostics/HealthChecker/Analyzer/Get-URLRewriteRule.ps1 (L49, L72, L97)Diagnostics/HealthChecker/Analyzer/Invoke-AnalyzerIISInformation.ps1 (L442–459)
Reportado: 2026-05-15
Crédito: Descubrimiento original por el investigador que reportó el problema #2539 de CSS-Exchange
Referencias:Get-URLRewriteRule.ps1, Invoke-AnalyzerIISInformation.ps1Security/src/EOMT/Mitigations/CVE-2026-42897.ps1 (L147–254)Exchange Health Checker (HealthChecker.ps1) informa las reglas de reescritura de URL de IIS como parte de su auditoría de configuración del servidor. Sin embargo, la función de enumeración de reglas Get-URLRewriteRule.ps1 solo lee las reglas entrantes (system.webServer/rewrite/rules) e ignora silenciosamente las reglas salientes (system.webServer/rewrite/outboundRules).
La mitigación de EOMT (Exchange On-premises Mitigation Tool) para CVE-2026-42897 implementa una regla de inyección de cabecera Content-Security-Policy denominada EOMT OWA CSP - outbound como una regla de reescritura de URL saliente de IIS. Debido a que Health Checker nunca lee outboundRules, esta regla de mitigación es completamente invisible en los informes de Health Checker.
Un administrador de Exchange que confíe en Health Checker para confirmar que las mitigaciones de EOMT están aplicadas recibirá un informe que no muestra ninguna regla CSP saliente, lo que genera un falso negativo en el estado de la mitigación y crea una falsa sensación de exposición o, por el contrario, una falsa confianza de que no se ha aplicado ninguna mitigación cuando sí se ha aplicado.
Tres rutas de código distintas en Get-URLRewriteRule.ps1 leen únicamente desde .rewrite.rules:
Ruta 1 - Análisis de web.config (L49):
$rules = $content.configuration.'system.webServer'.rewrite.rules
Ruta 2 - applicationHost.config por ubicación (L72):
$rules = $location.'system.webServer'.rewrite.rules
Ruta 3 - applicationHost.config global (L97):
$rules = $ApplicationHostConfig.configuration.'system.webServer'.rewrite.rules
Ninguna de estas rutas accede a .rewrite.outboundRules. El objeto $rules devuelto se itera a continuación en Invoke-AnalyzerIISInformation.ps1 (L442–459):
$displayRewriteRules = ($currentRewriteRules.rule | Where-Object { $_.enabled -ne "false" }).name |
Where-Object { $_ -notcontains $excludeRules }
El miembro .rule existe solo en la colección <rules> entrante. Incluso si se leyera outboundRules, la lógica de visualización necesitaría actualizarse para iterar .rule de ambas colecciones.
IIS almacena la configuración de reescritura de URL con dos elementos secundarios separados bajo <rewrite>:
<system.webServer>
<rewrite>
<!-- entrante - lo que Health Checker lee -->
<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>
<!-- saliente - INVISIBLE para 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>
| Escenario | Efecto |
|---|---|
| El administrador ejecuta Health Checker después de aplicar EOMT | El informe no muestra ninguna regla CSP saliente → el administrador cree que falta la mitigación |
Ver poc_cve_2026_42897.ps1 en este directorio.
El script:
web.config simulado en memoria con una regla entrante y la regla saliente EOMT OWA CSP - outbound de EOMT..\poc_cve_2026_42897.ps1
Salida esperada en un Health Checker vulnerable (sin parchear):
[*] 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
Corrección en Get-URLRewriteRule.ps1 - leer ambas colecciones en cada ruta:
# 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 }
Corrección en Invoke-AnalyzerIISInformation.ps1 - iterar ambas colecciones:
$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 }
| Fecha | Evento |
|---|---|
| 2026-05-15 | Problema identificado durante la investigación de verificación del despliegue de EOMT |
| 2026-05-15 | PoC escrita y probada contra la configuración IIS simulada |
SOLO PARA INVESTIGACIÓN DE SEGURIDAD AUTORIZADA. Pruebe exclusivamente en entornos de laboratorio controlados.
| El administrador usa Health Checker como única herramienta de auditoría | No puede verificar las reglas salientes de EOMT sin inspeccionar manualmente la configuración de IIS |
| Respuesta a incidentes / comprobaciones de cumplimiento | La evidencia de mitigación está ausente de la salida de Health Checker |
| Monitoreo automatizado que analiza el JSON de Health Checker | La presencia / ausencia de la regla saliente nunca se muestra |