
CVE-2026-42897 - punto cieco di Exchange Health Checker: le regole di riscrittura URL IIS in uscita vengono ignorate silenziosamente, rendendo invisibili le mitigazioni EOMT nei report diagnostici.
Gravità: Media (CVSS 5.3)
Componente: Microsoft CSS-Exchange - strumento diagnostico HealthChecker
File coinvolti:
Diagnostics/HealthChecker/Analyzer/Get-URLRewriteRule.ps1 (L49, L72, L97)Diagnostics/HealthChecker/Analyzer/Invoke-AnalyzerIISInformation.ps1 (L442–459)
Segnalato: 2026-05-15
Crediti: Scoperta originale del ricercatore che ha segnalato l'issue CSS-Exchange #2539
Riferimenti:Get-URLRewriteRule.ps1, Invoke-AnalyzerIISInformation.ps1Security/src/EOMT/Mitigations/CVE-2026-42897.ps1 (L147–254)Exchange Health Checker (HealthChecker.ps1) segnala le regole di riscrittura URL di IIS come parte del suo audit di configurazione del server. Tuttavia, la funzione di enumerazione delle regole Get-URLRewriteRule.ps1 legge solo le regole inbound (system.webServer/rewrite/rules) e ignora silenziosamente le regole outbound (system.webServer/rewrite/outboundRules).
La mitigazione di EOMT (Exchange On-premises Mitigation Tool) per CVE-2026-42897 implementa una regola di iniezione dell'header Content-Security-Policy denominata EOMT OWA CSP - outbound come regola di riscrittura URL outbound di IIS. Poiché Health Checker non legge mai outboundRules, questa regola di mitigazione è completamente invisibile nei report di Health Checker.
Un amministratore Exchange che si affida a Health Checker per confermare l'applicazione delle mitigazioni EOMT riceverà un report che non mostra alcuna regola CSP outbound, dando un falso negativo per lo stato della mitigazione e creando una falsa sensazione di esposizione o, al contrario, una falsa fiducia che nessuna mitigazione sia stata applicata quando invece lo è stata.
Tre distinti percorsi di codice in Get-URLRewriteRule.ps1 leggono tutti solo da .rewrite.rules:
Percorso 1 - analisi di web.config (L49):
$rules = $content.configuration.'system.webServer'.rewrite.rules
Percorso 2 - applicationHost.config per-location (L72):
$rules = $location.'system.webServer'.rewrite.rules
Percorso 3 - applicationHost.config globale (L97):
$rules = $ApplicationHostConfig.configuration.'system.webServer'.rewrite.rules
Nessuno di questi percorsi accede a .rewrite.outboundRules. L'oggetto $rules restituito viene poi iterato in Invoke-AnalyzerIISInformation.ps1 (L442–459):
$displayRewriteRules = ($currentRewriteRules.rule | Where-Object { $_.enabled -ne "false" }).name |
Where-Object { $_ -notcontains $excludeRules }
Il membro .rule esiste solo nella raccolta <rules> inbound. Anche se outboundRules venisse letto, la logica di visualizzazione dovrebbe essere aggiornata per iterare .rule da entrambe le raccolte.
IIS memorizza la configurazione di riscrittura URL con due figli separati sotto <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>
| Scenario | Effetto |
|---|---|
| L'amministratore esegue Health Checker dopo aver applicato EOMT | Il report non mostra alcuna regola CSP outbound → l'amministratore ritiene che la mitigazione sia assente |
Vedere poc_cve_2026_42897.ps1 in questa directory.
Lo script:
web.config mock in memoria con una regola inbound e la regola outbound EOMT OWA CSP - outbound di EOMT..\poc_cve_2026_42897.ps1
Output previsto su un Health Checker vulnerabile (non corretto):
[*] 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
Correzione in Get-URLRewriteRule.ps1 - leggere entrambe le raccolte in ogni percorso:
# 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 }
Correzione in Invoke-AnalyzerIISInformation.ps1 - iterare entrambe le raccolte:
$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 identificato durante la ricerca di verifica del deployment EOMT |
| 2026-05-15 | PoC scritto e testato contro una configurazione IIS mock |
SOLO PER RICERCA DI SICUREZZA AUTORIZZATA. Test esclusivamente in ambienti di laboratorio controllati.
| L'amministratore utilizza Health Checker come unico strumento di audit | Non può verificare le regole outbound di EOMT senza ispezionare manualmente la configurazione di IIS |
| Risposta agli incidenti / controlli di conformità | La prova della mitigazione è assente dall'output di Health Checker |
| Monitoraggio automatico che analizza il JSON di Health Checker | La presenza/assenza della regola outbound non viene mai segnalata |