← All issues

Deferred process swapping for HTTP redirects with Enhanced Security

127f09e

Enhanced Security(ES)는 평문 HTTP 응답처럼 잠재적으로 위험하다고 판단되는 navigation 대상을 더 격리된 WebContent 프로세스에서 실행합니다. 프로세스 교체는 세 프로세스에 걸쳐 조율됩니다. UIProcess(정책 결정), NetworkProcess(HTTP 로드), WebContent(렌더링)가 이에 해당합니다. 기존에는 ES 교체 결정이 요청 전에 이루어졌지만, 이번 commit으로 응답 수신 시점으로 변경되었습니다.

Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp

+void NetworkConnectionToWebProcess::adoptNetworkResourceLoader(
+ WebCore::ResourceLoaderIdentifier resourceLoadIdentifier,
+ Ref<NetworkResourceLoader>&& loader)
+{
+ m_networkResourceLoaders.add(resourceLoadIdentifier, WTF::move(loader));
+}

흔히 발생하는 HTTP→HTTPS redirect의 경우 페이지는 원래 프로세스에 그대로 머무릅니다. 실제 HTTP 응답인 경우에는 NetworkProcess가 진행 중인 NetworkResourceLoader를 보류 상태로 두고, UIProcess가 새로운 ES 프로세스를 생성합니다. 이후 adoptNetworkResourceLoader를 통해 loader를 재연결하여 서버에 요청을 재발행하지 않고도 lifecycle 중간에서 재개합니다. 아키텍처 측면에서는 COOP가 browsing-context-group 전환을 유발하는 방식과 유사합니다.

이 지연 교체 메커니즘은 NetworkResourceLoader가 lifecycle 중간에 프로세스 연결 경계를 넘는 loader 재연결 프로토콜을 도입합니다. 프로세스 격리 경계에서 의미 있는 새로운 IPC attack surface가 생깁니다.

adoptNetworkResourceLoader는 보류된 loader를 새 연결의 m_networkResourceLoaders map에 삽입합니다. 이때 식별자가 이미 존재하면(새 프로세스에서 동시에 로드가 발생하는 경우) add()가 조용히 실패하고, loader는 연결 대상 없이 방치되거나 resume이 no-op로 처리될 수 있습니다. 한편 원래 연결은 이미 reference를 해제한 상태일 수 있습니다. loader가 보류된 시점과 재연결 완료 사이에는 소유 연결이 없는 구간이 존재하므로, 이 window에서 해당 식별자를 참조하는 IPC는 loader를 찾지 못합니다. 이 구간의 오류 처리 경로를 추적해볼 필요가 있습니다. shouldConsiderEnhancedSecurityForInsecureResponse 플래그는 UIProcess→WebProcess→NetworkProcess 방향으로 흐르기 때문에, 탈취된 renderer가 HTTPS 리소스에 대해 강제로 ES 교체를 유발하여 park/re-attach 사이클을 반복하거나 프로세스 전환을 이용한 DoS를 시도할 가능성이 있습니다. COOP와 ES 교체가 이제 continueNavigationInNewProcess를 공유하므로, provisional-page-state 전달 과정의 버그는 두 메커니즘 모두에 영향을 미칩니다. 또한 ES heuristic은 site isolation 하에서 후속 조치를 기다리며 명시적으로 비활성화되어 있는데, 이 구간이 공백으로 남아 있습니다.