← All issues

[3] WebContent sandbox bypass for local file reads

Severity: High | Component: WebKit WebProcess loader / NetworkProcess resource load parameters | dfe2e0e

WebContent process가 Networking process를 경유해 임의의 로컬 파일을 읽을 수 있다는 점에서 High로 평가되었습니다. sandbox extension 생성 실패가 조용히 무시되었으며, Networking process의 광범위한 파일 접근 권한은 WebKit multi-process 모델의 잘 알려진 아키텍처 특성입니다.

WebContent process는 접근 권한이 없는 파일에 대한 로컬 파일 로드를 시작해서는 안 됩니다. 패치 이전에는 가능했습니다. Networking process가 권한 여부와 무관하게 요청을 처리했기 때문입니다.

Source/WebKit/NetworkProcess/NetworkResourceLoadParameters.cpp

- void NetworkResourceLoadParameters::createSandboxExtensionHandlesIfNecessary()
+ bool NetworkResourceLoadParameters::createSandboxExtensionHandlesIfNecessary()
{
...
if (request.url().protocolIsFile()) {
...
if (auto handle = SandboxExtension::createHandle(request.url().fileSystemPath(), SandboxExtension::Type::ReadOnly))
resourceSandboxExtension = WTF::move(*handle);
}
+ return resourceSandboxExtension.has_value();
}
+ return true;
}

Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp

- loadParameters.createSandboxExtensionHandlesIfNecessary();
+ if (!loadParameters.createSandboxExtensionHandlesIfNecessary()) {
+ RunLoop::mainSingleton().dispatch([resourceLoader = Ref { resourceLoader }, error = blockedError(request)] {
+ resourceLoader->didFail(error);
+ });
+ return;
+ }

이번 수정은 createSandboxExtensionHandlesIfNecessary()의 반환 타입을 void에서 bool로 변경했습니다. 요청이 file:// URL이고 WebContent process가 sandbox extension handle 생성에 실패하면 false를 반환합니다. WebLoaderStrategy::scheduleLoadFromNetworkProcess에서는 이제 반환값을 확인합니다. false인 경우, 요청이 Networking process에 도달하기 전에 blockedError와 함께 즉시 실패 처리됩니다.

로컬 파일 로드 시 WebContent process와 Networking process 사이의 IPC 경계에서 접근 제어가 강제되지 않는 패턴.

WebKit의 multi-process 아키텍처는 작업을 두 process로 분리합니다. 페이지 렌더링을 담당하는 sandboxed WebContent process와, 네트워크 및 파일 I/O를 처리하는 Networking process입니다. WebContent process는 파일 시스템 접근을 제한하는 엄격한 sandbox 환경에서 실행됩니다. file:// URL을 로드해야 할 때, WebContent process는 SandboxExtension handle을 생성해야 합니다. 이는 Networking process가 특정 파일을 WebContent process 대신 읽을 수 있도록 권한을 부여하는 capability token입니다. SandboxExtension::createHandle은 호출 process 자체가 해당 파일에 접근 권한을 가진 경우에만 성공합니다. Networking process는 WebContent process보다 광범위한 파일 시스템 접근 권한으로 실행됩니다. 모든 origin에 걸쳐 다운로드, 쿠키 저장, 캐시 파일을 처리해야 하기 때문입니다.

이는 IPC 경계에서 발생하는 전형적인 confused-deputy 패턴입니다. 패치 이전에는 createSandboxExtensionHandlesIfNecessary()void를 반환했습니다. WebContent process가 접근 권한이 없는 file:// URL을 요청하면, SandboxExtension::createHandle이 실패하고 resourceSandboxExtension은 빈 상태로 유지됩니다. 그럼에도 로드는 계속 진행되어 sandbox extension 없이 요청이 Networking process로 전달되었습니다. 광범위한 파일 접근 권한을 가진 Networking process는 파일을 읽어 그 내용을 WebContent process에 반환했습니다. 접근 검사 자체는 형식상 존재했습니다. extension 생성 시도는 이루어졌지만, 실패가 조용히 무시된 것입니다.

🔒

Explores the cross-process trust model and how silent failure at a sandbox boundary creates an exploitable file-read primitive

더 확인하려면 구독해 주세요

🔒

Multiple audit patterns identified around IPC sandbox extension validation, with concrete call sites and search targets

더 확인하려면 구독해 주세요