← All issues

[1] NetworkProcess IPC File-Read Sandbox Bypass via Unvalidated replacementPath

Severity: High | Component: WebKit Network Process | c2a306a

replacementPath IPC 파라미터 미검증으로 인해 WebContent 프로세스에서 임의 파일 읽기가 가능한 취약점입니다. 메모리 corruption 없이 순수한 IPC validation 로직 버그만으로 발생하며, 테스트 케이스는 confidence 0.95 수준의 완전한 end-to-end exploit chain을 보여줍니다. WebContent 프로세스의 파일 접근 제한을 Network 프로세스를 통해 우회하는 방식입니다.

이 패치는 NetworkConnectionToWebProcess::registerInternalFileBlobURL에서 replacementPath 파라미터에 대한 검증을 추가합니다. 수정 전에는 path 파라미터만 isFilePathAllowed()를 통해 허용 목록 검사를 거쳤습니다. 트랜스코딩된 파일에 사용되는 replacementPath는 아무런 검사 없이 통과되었습니다. 수정 후 Cocoa 플랫폼에서는 두 가지 검증 경로가 추가되었습니다. sandbox extension이 제공된 경우에는 원격 WebProcess PID를 대상으로 sandbox_check()를 호출해 실제 sandbox 수준의 file-read-data 접근 권한을 확인합니다. sandbox extension이 없는 경우에는 기존 isFilePathAllowed() 검사로 대체됩니다. Cocoa 외 플랫폼에서는 항상 허용 목록 검사를 사용합니다.

  Before:                                   After:
  registerInternalFileBlobURL()             registerInternalFileBlobURL()
    └─► check path ──► check replacementPath? NO     └─► check path
          └─► register blob                            └─► check replacementPath
                                                             ├─ sandbox ext? ──► sandbox_check(PID)
                                                             └─ no ext? ──► isFilePathAllowed()
                                                                  └─► register blob

Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp

if (blobFileAccessEnforcementEnabled() && shouldCheckBlobFileAccess())
MESSAGE_CHECK(isFilePathAllowed(*session, path));
 
+ RefPtr sandboxExtension = SandboxExtension::create(WTF::move(extensionHandle));
+
+ if (!replacementPath.isEmpty()) {
+#if PLATFORM(COCOA)
+ // 트랜스코딩된 파일의 경우, 내부 허용 경로 목록 대신
+ // 원본 파일에 부여된 extension을 통해 WebProcess가
+ // 실제 sandbox 접근 권한을 가지는지 확인합니다.
+ // (임시 트랜스코딩 파일은 허용 목록에 포함되지 않음)
+ if (sandboxExtension) {
+ // sandbox_check는 접근 허용 시 0, 실패 시 non-zero를 반환합니다
+ if (sandbox_check(m_connection->remoteProcessID(), "file-read-data", static_cast<enum sandbox_filter_type>(SANDBOX_FILTER_PATH | SANDBOX_CHECK_NO_REPORT), FileSystem::fileSystemRepresentation(replacementPath).data())) {
+ CONNECTION_RELEASE_LOG_ERROR(Sandbox, "registerInternalFileBlobURL: WebProcess does not have sandbox access to replacementPath");
+ MESSAGE_CHECK(false);
+ }
+ } else // sandbox extension 없음 — 경로 허용 목록 검사로 대체
+ MESSAGE_CHECK(isFilePathAllowed(*session, replacementPath));
+#else
+ MESSAGE_CHECK(isFilePathAllowed(*session, replacementPath));
+#endif
+ }
+
m_blobURLs.add({ url, std::nullopt });
- session->blobRegistry().registerInternalFileBlobURL(url, BlobDataFileReferenceWithSandboxExtension::create(path, replacementPath, SandboxExtension::create(WTF::move(extensionHandle))), contentType);
+ session->blobRegistry().registerInternalFileBlobURL(url, BlobDataFileReferenceWithSandboxExtension::create(path, replacementPath, WTF::move(sandboxExtension)), contentType);

LayoutTests/http/tests/security/registerBlobURL.html

+ connection.sendMessage(
+ 0,
+ IPC.messages.NetworkConnectionToWebProcess_RegisterInternalFileBlobURL.name,
+ [
+ {type: 'URL', value: 'blob:blobinternal:///b7701c13-a454-4b76-a3b1-e3e57d972c5d'},
+ {type: 'String', value: rootPath},
+ {type: 'String', value: '/private/var/db/com.apple.networkextension.tracker-info'},
+ {type: 'uint8_t', value: 0},
+ {type: 'String', value: 'text/html'}
+ ]
+ );

주 경로의 접근 제어 검사를 우회하는 보조 파일 경로에 대한 IPC 파라미터 검증 누락.

WebKit의 멀티 프로세스 아키텍처는 웹 콘텐츠 렌더링(WebContent 프로세스)과 네트워크 작업(Network 프로세스)을 분리합니다. WebContent 프로세스는 IPC 메시지를 통해 Network 프로세스와 통신하며, Network 프로세스는 WebContent 프로세스가 파일 기반 blob URL을 등록할 때 파일 접근 정책을 적용합니다.

registerInternalFileBlobURL IPC 메시지는 path(원본 파일)와 replacementPath(파일이 다른 포맷으로 트랜스코딩된 경우 사용 — 예: HEIC 이미지를 웹 표시용 JPEG로 변환)를 모두 받습니다. replacementPath가 비어 있지 않으면 blob registry는 path 대신 replacementPath에서 콘텐츠를 읽습니다.

MESSAGE_CHECK는 WebKit의 IPC validation 매크로로, 검사가 실패하면 Network 프로세스가 해당 WebContent 프로세스의 연결을 종료합니다. isFilePathAllowed()는 경로를 내부 허용 목록과 대조해 WebContent 프로세스가 참조 권한을 가진 파일인지 검증합니다.

registerInternalFileBlobURL IPC 핸들러는 path 파라미터에 대해 허용 목록 검사를 수행했지만, replacementPath는 검증하지 않았습니다. replacementPath는 트랜스코딩된 파일을 위한 파라미터로, 원본 path는 검증을 통과하더라도 실제 파일 콘텐츠는 replacementPath에서 읽힙니다. 이 동작은 파라미터 이름, fix 패턴, 그리고 실제로 동작하는 테스트 케이스에서 강하게 뒷받침됩니다.

공격자가 제어하는 WebContent 프로세스는 허용 목록 검사를 통과하는 정상적인 path와 함께 replacementPath를 디스크 위의 임의 파일로 설정한 IPC 메시지를 조작할 수 있습니다. 이렇게 하면 blob URL 조회 시 공격자가 지정한 파일의 내용이 반환됩니다.

테스트 케이스는 완전한 end-to-end exploit을 보여줍니다. FileSystemGetDirectory/GetFile로 유효한 파일시스템 경로를 확보하고, 이를 path 파라미터로 사용합니다. 이후 replacementPath/private/var/db/com.apple.networkextension.tracker-info로 설정하고 blob chain을 등록한 뒤, fetch(blobURL)으로 파일을 읽습니다. 메모리 corruption은 전혀 필요하지 않으며, 순수한 IPC validation 로직 버그에 해당합니다.

🔒

Explores the IPC trust boundary between WebContent and Network processes, with a detailed walkthrough of how the validation gap enables filesystem access escalation

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

🔒

Multiple audit patterns identified for IPC parameter validation gaps across Network process message handlers, with concrete search targets

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