← All reports

WebContent-to-UI origin parameters move to real validators

Component: WebKit IPC | 8e14834

Source/WebKit/Platform/IPC/Untrusted.h

+#define EXTRACT_WITH_MESSAGE_CHECK_BASE(connection, name, untrusted, completion, ...) \
+ auto name##Validated = WTF::move(untrusted).validate(__VA_ARGS__); \
+ MESSAGE_CHECK_COMPLETION_BASE(IPC::valueMayBeLegitimate(name##Validated), connection, completion); \
+ if (!name##Validated) { \
+ { completion; } \
+ return; \
+ } \
+ auto name = WTF::move(*name##Validated)

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을 기록하도록 변경되었습니다.

Site isolation 환경에서 compromised WebContent process는 이제 32개 IPC origin parameter에 다른 site의 origin을 내세울 수 없습니다. 결과적으로 origin spoofing 공격면의 상당 부분이 차단되었습니다. 아울러 이 commit에는 아직 우회되는 parameter가 무엇인지도 문서화되어 있습니다.