[17] [WebKit] Validate Permissions Query identifier/source combination
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가 발동되었습니다.
이 primitive를 활용하면 손상된 renderer에서 조작된 IPC를 통해 UI process를 denial of service 상태로 만들 수 있습니다. memory corruption은 발생하지 않으며, 공격자가 도달 가능한 assertion failure에 해당합니다.
Permissions IPC 경로에서 잘못된 형식의 요청에 대한 UI process의 가용성 보장이 약화되는 문제였습니다.
Audit directions
- 다른 UI process IPC receiver: renderer가 제공한 enum이나 optional identifier를 기반으로 분기한 뒤 switch default에서
RELEASE_ASSERT_NOT_REACHED로 이어지는 receiver를 점검합니다. mostReasonableWebPageProxy호출 지점: source에 대한 유사한 가정 패턴이 남아있는지 점검합니다.- 묵시적 불변 조건 끌어올리기: IPC 진입점에서 도달 가능한
RELEASE_ASSERT_NOT_REACHED를 검색합니다. 각각은MESSAGE_CHECK로 대체될 후보입니다.