[17] [WebKit] Validate Permissions Query identifier/source combination
Severity: Medium | Component: WebKit UIProcess Permissions | e118db0
WebPermissionControllerProxy::query()에 MESSAGE_CHECK_COMPLETION이 추가되었습니다. 이로써 identifier == nullopt이고 source가 SharedWorker 또는 ServiceWorker 외의 값인 IPC는 더 이상 mostReasonableWebPageProxy()의 RELEASE_ASSERT_NOT_REACHED()에 도달하지 않습니다. 패치 이전에는 손상된 renderer가 UI process를 강제 종료시킬 수 있었습니다. Medium으로 평가되었습니다.
query()는 identifier가 설정되어 있거나 source가 worker source 중 하나인지를 검증한 뒤, mostReasonableWebPageProxy로 진입합니다.
Source/WebKit/UIProcess/WebPermissionControllerProxy.cpp
Renderer에서 도달 가능한 UI process 강제 종료: IPC 인자 검증 누락으로 공격자가 조작한 입력이 unreachable-asserted code path에 도달하는 패턴.
Patch Details
MESSAGE_CHECK_COMPLETION은 묵시적으로 가정되던 불변 조건(identifier가 설정되거나 source가 worker 중 하나)을 명시적인 검사로 끌어올립니다. 이 조건을 위반하면 송신자를 종료하는 경로로 처리됩니다.
Background
WebPermissionControllerProxy::query는 navigator.permissions.query() 및 이에 대응하는 worker 측 요청을 처리합니다. mostReasonableWebPageProxy()는 특정 page identifier가 제공되지 않을 때 호출됩니다. 이 함수의 도입부는 source == SharedWorker || source == ServiceWorker를 단언하며, switch문의 default 분기는 RELEASE_ASSERT_NOT_REACHED()로 종료됩니다.
Analysis
패치 이전에는 WebProcess가 identifier == nullopt이고 source가 SharedWorker 또는 ServiceWorker 외의 값(예: Window)인 Query를 전송하면, UI process에서 RELEASE_ASSERT가 발동되었습니다.