WebContent-to-UI origin parameters move to real validators
Component: WebKit IPC | 8e14834
Source/WebKit/Platform/IPC/Untrusted.h
Site isolation 환경에서는 site마다 별도의 WebContent process가 할당됩니다. 따라서 UI process는 WebContent process가 보내는 모든 값을 attacker-controlled로 간주해야 합니다. IPC::Untrusted<T>는 이를 위해 모든 origin이 validator를 통과하도록 요구합니다. 대표적인 validator로는 ProcessSpeaksForDomain과 ProcessCommittedClientOrigin이 있습니다. 앞의 것은 송신 process가 해당 domain을 대변할 자격이 있는지 확인합니다. validator를 거치지 않으려면 명시적인 UnvalidatedReason과 함께 값을 꺼내야 합니다. 이전 commit들에서는 이 검사가 no-op 형태로 먼저 추가되었고, 이번 commit에서 실제로 강제되도록 변경되었습니다.
이제 37개 origin parameter 중 32개가 실제 validator를 거칩니다. 적용 범위는 capture/DRM permission prompt, Web Locks, app badge, WebAuthn입니다. prewarm/autofill/user-gesture 관련 상태 기록, XR, speech recognition도 포함됩니다. inspector frameNavigated와 CSP upgrade origin 역시 대상입니다. 한편 validate → MESSAGE_CHECK → early return으로 이어지는 패턴은 EXTRACT_WITH_MESSAGE_CHECK_BASE로 일원화되었습니다. WebAuthn signal* handler에는 rpId를 origin의 registrable domain과 대조하는 검사도 추가되었습니다. 또한 WebFrameProxy는 web-archive 및 opaque-origin commit 시 web process가 보고한 origin을 기록하도록 변경되었습니다.
Significance
Site isolation 환경에서 compromised WebContent process는 이제 32개 IPC origin parameter에 다른 site의 origin을 내세울 수 없습니다. 결과적으로 origin spoofing 공격면의 상당 부분이 차단되었습니다. 아울러 이 commit에는 아직 우회되는 parameter가 무엇인지도 문서화되어 있습니다.
Audit directions
- 문서화된 우회 5건의 근거가 실제로 타당한지 확인할 필요가 있습니다. 대상은
PostMessageToRemote의targetOrigin/sourceOrigin,GetAssertion의parentOrigin, GeolocationStartUpdating의 domain, AutomationScriptRealmCreated의 origin입니다. 특히getAssertion의 ancestor chain 순회는 ancestor가 HTTP 계열인 경우에만 적용됩니다. 이 순회와 token에 묶인 geolocation domain 검사가 정말 모든 경로를 커버하는지 점검해야 합니다. - web-archive 및 opaque-origin commit에서는 commit 시점에 web process가 보고한 값이 곧 기대 origin이 됩니다. compromised process가 이 값을 임의로 고를 수 있는 경로가 있는지 살펴볼 필요가 있습니다. 또한 UI process가 요청한 load(
LoadedWebArchive)와 실제로 기록되는 값 사이에 불일치가 생기는 지점도 찾아봐야 합니다. - Capture 메시지는 top-level origin을 송신 process가 아니라 main frame의 process 기준으로 검증합니다. 이 전제가 process swap, provisional page, remote frame 상황에서도 유지되는지 확인해야 합니다.
- 대부분의 검사는 site isolation이 켜져 있을 때만 적용됩니다. 예외는 app badge(
ShouldCheckWithoutSiteIsolation::Yes)와 WebAuthnrpId비교입니다. site isolation이 꺼진 상태에서 어떤 handler가 여전히 기존의 신뢰 모델에 의존하는지 정리해 둘 필요가 있습니다. - 판단이 불확실한 경로에서는 WebAuthn completion(
handler(false),handler({ }),SecurityError)이 정확히 한 번만 호출되는지 확인해야 합니다. 상태가 절반만 갱신된 채로 남지 않는지도 함께 점검해야 합니다. ProvisionalPageProxy::didCommitLoadForFrame은 validation을 거치지 않고 CSP upgrade origin을 그대로 전달합니다.WebPageProxy의 검사를 건너뛰는 다른 경로가 있는지 찾아볼 필요가 있습니다. 또한 geolocationstopUpdating/setEnableHighAccuracyhandler가 token에 묶인 domain 검사와 일관되게 동작하는지도 확인해야 합니다.