
CVE-2026-42897 - angle mort du Vérificateur de santé Exchange : les règles de réécriture d'URL IIS sortantes sont ignorées silencieusement, rendant les atténuations EOMT invisibles dans les rapports de diagnostic.
Sévérité : Moyenne (CVSS 5.3)
Composant : Microsoft CSS-Exchange – outil de diagnostic HealthChecker
Fichiers concernés :
Diagnostics/HealthChecker/Analyzer/Get-URLRewriteRule.ps1 (L49, L72, L97)Diagnostics/HealthChecker/Analyzer/Invoke-AnalyzerIISInformation.ps1 (L442–459)Get-URLRewriteRule.ps1, Invoke-AnalyzerIISInformation.ps1Security/src/EOMT/Mitigations/CVE-2026-42897.ps1 (L147–254)Exchange Health Checker (HealthChecker.ps1) signale les règles de réécriture d’URL IIS dans le cadre de son audit de configuration du serveur. Cependant, la fonction d’énumération des règles Get-URLRewriteRule.ps1 ne lit que les règles entrantes (system.webServer/rewrite/rules) et ignore silencieusement les règles sortantes (system.webServer/rewrite/outboundRules).
La mitigation EOMT (Exchange On-premises Mitigation Tool) pour CVE-2026-42897 déploie une règle d’injection d’en-tête Content-Security-Policy nommée EOMT OWA CSP - outbound en tant que règle de réécriture d’URL IIS sortante. Comme Health Checker ne lit jamais outboundRules, cette règle de mitigation est totalement invisible dans les rapports de Health Checker.
Un administrateur Exchange qui s’appuie sur Health Checker pour confirmer que les mitigations EOMT sont en place recevra un rapport ne montrant aucune règle CSP sortante – donnant un faux négatif pour l’état de la mitigation et créant une fausse impression d’exposition ou, à l’inverse, une fausse confiance qu’aucune mitigation n’a été appliquée alors que c’est le cas.
Trois chemins de code distincts dans Get-URLRewriteRule.ps1 lisent tous uniquement .rewrite.rules :
Chemin 1 – analyse de web.config (L49) :
$rules = $content.configuration.'system.webServer'.rewrite.rules
Chemin 2 – applicationHost.config par emplacement (L72) :
$rules = $location.'system.webServer'.rewrite.rules
Chemin 3 – applicationHost.config global (L97) :
$rules = $ApplicationHostConfig.configuration.'system.webServer'.rewrite.rules
Aucun de ces chemins n’accède à .rewrite.outboundRules. L’objet $rules retourné est ensuite parcouru dans Invoke-AnalyzerIISInformation.ps1 (L442–459) :
$displayRewriteRules = ($currentRewriteRules.rule | Where-Object { $_.enabled -ne "false" }).name |
Where-Object { $_ -notcontains $excludeRules }
Le membre .rule n’existe que sur la collection entrante <rules>. Même si outboundRules était lu, la logique d’affichage devrait être mise à jour pour itérer .rule depuis les deux collections.
IIS stocke la configuration de réécriture d’URL avec deux enfants distincts sous <rewrite> :
<system.webServer>
<rewrite>
<!-- inbound – ce que Health Checker lit -->
<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 pour 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>
| Scénario | Effet |
|---|---|
| L’administrateur exécute Health Checker après avoir appliqué EOMT | Le rapport n’affiche aucune règle CSP sortante → l’administrateur pense que la mitigation est manquante |
Voir poc_cve_2026_42897.ps1 dans ce répertoire.
Le script :
web.config fictif en mémoire avec à la fois une règle entrante et la règle sortante EOMT EOMT OWA CSP - outbound..\poc_cve_2026_42897.ps1
Sortie attendue sur un Health Checker vulnérable (non corrigé) :
[*] Chemin vulnérable (entrant uniquement) :
Règles trouvées : Redirect to HTTPS
MANQUANTE : EOMT OWA CSP - outbound
[*] Chemin corrigé (entrant + sortant) :
Règles trouvées : Redirect to HTTPS, EOMT OWA CSP - outbound
Règle sortante visible : VRAI
Correctif dans Get-URLRewriteRule.ps1 – lire les deux collections à chaque chemin :
# web.config (L49)
$inbound = $content.configuration.'system.webServer'.rewrite.rules
$outbound = $content.configuration.'system.webServer'.rewrite.outboundRules
$rules = @{ inbound = $inbound; outbound = $outbound }
# applicationHost.config par emplacement (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 }
Correctif dans Invoke-AnalyzerIISInformation.ps1 – itérer les deux collections :
$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 }
| Date | Événement |
|---|---|
| 2026-05-15 | Problème identifié lors d’une recherche de vérification de déploiement EOMT |
| 2026-05-15 | Preuve de concept écrite et testée contre une configuration IIS fictive |
RÉSERVÉ À LA RECHERCHE DE SÉCURITÉ AUTORISÉE. Testez exclusivement dans des environnements de laboratoire contrôlés.
| L’administrateur utilise Health Checker comme seul outil d’audit | Impossible de vérifier les règles sortantes EOMT sans inspecter manuellement la configuration IIS |
| Réponse aux incidents / contrôles de conformité | La preuve de mitigation est absente de la sortie de Health Checker |
| Surveillance automatisée analysant le JSON de Health Checker | La présence/absence de règle sortante n’est jamais remontée |