
CVE-2026-42897 - слепая зона Exchange Health Checker: правила исходящей перезаписи URL в IIS молча игнорируются, что делает меры смягчения EOMT невидимыми в диагностических отчетах.
Серьёзность: Средняя (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
Ссылки:Get-URLRewriteRule.ps1, Invoke-AnalyzerIISInformation.ps1Security/src/EOMT/Mitigations/CVE-2026-42897.ps1 (L147–254)Exchange Health Checker (HealthChecker.ps1) сообщает о правилах перезаписи URL IIS в рамках аудита конфигурации сервера. Однако функция перечисления правил Get-URLRewriteRule.ps1 считывает только входящие правила (system.webServer/rewrite/rules) и молча игнорирует исходящие правила (system.webServer/rewrite/outboundRules).
Смягчение CVE-2026-42897 с помощью EOMT (Exchange On-premises Mitigation Tool) развёртывает правило инжекции заголовка Content-Security-Policy под названием EOMT OWA CSP - outbound как исходящее правило перезаписи URL IIS. Поскольку Health Checker никогда не считывает outboundRules, это правило смягчения полностью невидимо в отчётах Health Checker.
Администратор Exchange, полагающийся на Health Checker для подтверждения применения смягчений EOMT, получит отчёт, не показывающий исходящее правило 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 существует только в коллекции входящих <rules>. Даже если бы outboundRules были считаны, логика отображения потребовала бы обновления для итерации .rule из обеих коллекций.
IIS хранит конфигурацию перезаписи URL с двумя отдельными дочерними элементами внутри <rewrite>:
<system.webServer>
<rewrite>
<!-- inbound - что читает Health Checker -->
<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 - НЕВИДИМЫЙ для 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>
| Сценарий | Эффект |
|---|---|
| Администратор запускает Health Checker после применения EOMT | Отчёт не показывает исходящее правило CSP → администратор считает, что смягчение отсутствует |
| Администратор использует Health Checker как единственный инструмент аудита |
Смотрите poc_cve_2026_42897.ps1 в этом каталоге.
Скрипт:
web.config с входящим правилом и исходящим правилом EOMT EOMT OWA CSP - outbound..\poc_cve_2026_42897.ps1
Ожидаемый вывод на уязвимой (неисправленной) версии Health Checker:
[*] Уязвимый путь (только входящие):
Найдены правила: Redirect to HTTPS
ОТСУТСТВУЕТ: EOMT OWA CSP - outbound
[*] Исправленный путь (входящие + исходящие):
Найдены правила: Redirect to HTTPS, EOMT OWA CSP - outbound
Исходящее правило видимо: ДА
Исправление в 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 global (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 |
ТОЛЬКО ДЛЯ АВТОРИЗОВАННЫХ ИССЛЕДОВАНИЙ БЕЗОПАСНОСТИ. Тестируйте исключительно в контролируемых лабораторных средах.
| Невозможно проверить исходящие правила EOMT без ручного просмотра конфигурации IIS |
| Реагирование на инциденты / проверки соответствия | Доказательства смягчения отсутствуют в выводе Health Checker |
| Автоматизированный мониторинг, разбирающий JSON Health Checker | Наличие/отсутствие исходящих правил никогда не отображается |