
CVE-2026-42897 - Exchange Health Checker 블라인드 스팟: 아웃바운드 IIS URL 재작성 규칙이 자동으로 무시되어 진단 보고서에서 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 이슈 #2539를 보고한 연구자가 발견
참고자료:Get-URLRewriteRule.ps1, Invoke-AnalyzerIISInformation.ps1Security/src/EOMT/Mitigations/CVE-2026-42897.ps1 (L147–254)Exchange Health Checker(HealthChecker.ps1)는 서버 구성 감사의 일부로 IIS URL 재작성 규칙을 보고합니다. 그러나 규칙 열거 함수인 Get-URLRewriteRule.ps1은 인바운드 규칙(system.webServer/rewrite/rules)만 읽고 아웃바운드 규칙(system.webServer/rewrite/outboundRules)은 자동으로 무시합니다.
CVE-2026-42897에 대한 EOMT(Exchange On-premises Mitigation Tool) 완화 조치는 EOMT OWA CSP - outbound라는 콘텐츠 보안 정책 헤더 삽입 규칙을 IIS 아웃바운드 URL 재작성 규칙으로 배포합니다. Health Checker는 outboundRules를 절대 읽지 않기 때문에 이 완화 규칙은 Health Checker 보고서에서 완전히 보이지 않습니다.
EOMT 완화 조치가 적용되었는지 확인하기 위해 Health Checker에 의존하는 Exchange 관리자는 아웃바운드 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>
<!-- 인바운드 - 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>
<!-- 아웃바운드 - 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>
| 시나리오 | 결과 |
|---|---|
| EOMT 적용 후 Health Checker 실행 | 보고서에 아웃바운드 CSP 규칙이 없음 → 관리자가 완화 조치가 누락되었다고 판단 |
| 관리자가 유일한 감사 도구로 Health Checker 사용 | IIS 구성을 수동으로 검사하지 않고는 EOMT 아웃바운드 규칙을 확인할 수 없음 |
| 사고 대응 / 규정 준수 점검 | 완화 조치 증거가 Health Checker 출력에 없음 |
| Health Checker JSON을 구문 분석하는 자동화된 모니터링 | 아웃바운드 규칙의 존재/부재가 절대 표시되지 않음 |
이 디렉터리의 poc_cve_2026_42897.ps1을 참조하십시오.
이 스크립트는:
EOMT OWA CSP - outbound 아웃바운드 규칙이 모두 포함된 인메모리 모의 web.config XML을 생성합니다..\poc_cve_2026_42897.ps1
취약한(패치되지 않은) Health Checker에서 예상되는 출력:
[*] 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
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 구성에 대해 테스트 완료 |
승인된 보안 연구 전용입니다. 반드시 통제된 실험실 환경에서만 테스트하십시오.