Cherry-pick 305413.548@safari-7624-branch — Web Locks origin validation
+bool WebProcessProxy::hasCommittedClientOrigin(const WebCore::ClientOrigin& clientOrigin) const
+{
+ return m_committedClientOrigins.contains(clientOrigin);
+}
+void WebProcessProxy::didCommitLoadClientOrigin(const WebCore::ClientOrigin& clientOrigin)
+{
+ m_committedClientOrigins.add(clientOrigin);
+}
Web Locks API(navigator.locks)는 페이지에 이름 기반의 origin 범위 mutex를 제공합니다. 이 mutex들은 UI process의 레지스트리(WebLockRegistryProxy)가 관리합니다. Renderer는 IPC를 통해 레지스트리에 접근하며, 메시지에 ClientOrigin을 함께 전송합니다. 손상된 renderer에서 오는 IPC는 신뢰할 수 없으므로, UI process는 요청된 origin이 실제로 해당 process에서 정상적으로 로드된 것인지 독립적으로 검증해야 합니다.
이 commit은 IPC origin 위조 취약점을 수정합니다. WebFrameProxy::didCommitLoad가 각 ClientOrigin을 WebProcessProxy::m_committedClientOrigins에 기록하도록 변경되었습니다. 또한 WebLockRegistryProxy::requestLock은 처리 전에 해당 origin이 실제로 그 web process에서 commit된 것인지 검증합니다. releaseLock, abortLockRequest, snapshot, clientIsGoingAway도 동일한 검증을 적용합니다. 패치 이전에는 이런 검증이 전혀 없었습니다. UI process는 renderer가 선언한 origin을 그대로 수용했습니다.
Significance
이 패치 이전에는 손상된 renderer가 lock 요청에서 임의의 ClientOrigin을 위조할 수 있었습니다. 이를 통해 완전히 다른 origin에 속한 lock을 획득하거나, 차단하거나, 열람하는 것이 가능했습니다.
Audit directions
- Coverage completeness.
requestLock,releaseLock,abortLockRequest,snapshot,clientIsGoingAway— 이 다섯 핸들러가 균일하게 게이팅되는지 확인해야 합니다. 누락된 핸들러가 하나라도 있으면 우회 경로가 생깁니다. - Special-origin edge cases. Blob URL frame은 부모 origin을 상속하고, data URL frame은 opaque origin을 갖습니다. 이들이
didCommitLoad에서 정상적으로 기록되는지 확인해야 합니다. 아울러 committed-origins set이 opaque origin에 대해 올바른 동등성 비교 semantics를 사용하는지도 점검해야 합니다. - Worker contexts. Service worker와 shared worker는
WebFrameProxy::didCommitLoad를 동일한 방식으로 거치지 않습니다. 이들의 origin 등록 경로가 동일한committedOriginsset에 포함되는지, 또는 별도의 동등한 검증이 존재하는지 확인해야 합니다. - Lifetime/cleanup. Frame이 다른 페이지로 이동할 때, 이전
ClientOrigin이 committed set에서 제거되는지 확인해야 합니다. 내비게이션 이후에도 stale origin이 남아있다면, renderer가 이미 잃었어야 할 lock 접근 권한을 계속 유지하게 될 가능성이 있습니다. - TOCTOU window.
didCommitLoad가 origin을 기록하는 시점과 lock IPC가 도착하는 시점 사이에 race condition이 발생하는 경우를 이론적으로 고려할 수 있습니다. 검증이 commit 기록과 동일한 UI process 메인 스레드에서 수행되는지 확인해야 합니다.