Site Isolation Web Inspector: deterministic Network IDs, event routing
Web Inspector's getResponseBody now crosses Site Isolation process boundaries — routed by a frontend-controlled requestId string.
Source/WebCore/inspector/InspectorIdentifierRegistry.h
Source/WebInspectorUI/UserInterface/Controllers/NetworkManager.js
Web Inspector의 Network 도메인은 페이지 단위의 "octopus" 도메인입니다. Frontend의 NetworkManager는 통합된 resource 목록과 frame tree를 단일하게 관리하므로, 모든 WebContent process에서 발생하는 이벤트를 전역적으로 충돌하지 않는 ID로 하나의 스트림에 합쳐야 합니다. 기존에는 서로 다른 process의 두 resource가 동일한 숫자 형태의 ResourceLoaderIdentifier를 생성할 수 있었고, Network 패널에서 조용히 aliasing이 발생했습니다.
이 commit에서는 "PID.OID" 형식으로 인코딩된 일관된 frame/request/loader ID를 도입했습니다. ResourceLoaderIdentifier는 process 범위가 지정된 ScopedResourceLoaderIdentifier로 전환됩니다. Cross-origin iframe의 모든 Network 이벤트는 ProxyingNetworkAgent를 통해 라우팅되는데, NetworkManager에는 stub frame 지연 생성 및 null loaderIdentifier 처리 로직도 추가되었습니다. SI 환경에서는 main frame 이벤트 중복을 막기 위해 PageNetworkAgent가 WebContent process에서 비활성화됩니다.
Significance
이 commit은 Site Isolation 인프라를 크게 확장하는 변경입니다. 신뢰할 수 없는 WebContent process와 UIProcess 내 inspector 인프라 사이에 새로운 IPC 경로가 열리며, process 범위가 지정된 식별자가 권한 경계를 넘게 됩니다.
Audit directions
-
Process-qualified ID bit-packing. 인자가 하나인
protocolFrameId(FrameIdentifier)오버로드는 상위 비트에frameID.toRawValue() >> 32, 하위 비트에static_cast<uint32_t>(frameID.toRawValue())를 사용합니다. 이 추출 과정에서 zero, 최댓값, wrap-around에 대한 edge case가 존재한다면, 논리적으로 서로 다른 두 식별자가 동일한 문자열을 생성하여 frontend에서 아무런 경고 없이 resource aliasing이 발생할 수 있습니다. -
IPC trust boundary.
ScopedResourceLoaderIdentifier는 WebContent process로부터 IPC를 통해 전달됩니다.ProcessQualified.serialization.in의 역직렬화 단계에서ProcessIdentifier와 실제 송신 process의 일치 여부를 검증하지 않는다면, 침해된 WebContent process가 다른 process의 PID를 위장할 수 있습니다. 결과적으로 충돌하거나 위조된 resource ID가 inspector frontend에 주입될 가능성이 있습니다. -
protocolLoaderIdfallback path (FIXME rdar://170087346). document가 아직 준비되지 않은 경우IdentifiersFactory로 fallback합니다. race condition 상황에서는loaderId값이 매번 달라질 수 있어, frontend 상태가 손상될 가능성이 있습니다. -
Lazy
WI.Framestub creation. 침해된 WebContent process가 조작된frameIdentifier값을 전송하면,_frameIdentifierMap이 phantom frame으로 가득 찰 수 있습니다. 또한 기존 frame을 대체하는 방식으로 악용될 가능성도 있습니다. -
SI gating on
siteIsolationFirstEnabled(). 세션 도중 SI가 전환되는 경우,PageNetworkAgent::enable()의 early return이 잘못된 시점에 실행될 수 있습니다. 이때ProxyingNetworkAgent가 아직 수신 대기 중이 아님에도 agent가 반쯤 활성화된 일관성 없는 상태에 머물 수 있습니다.