[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 프로세스를 통해 우회하는 방식입니다.
Patch Details
이 패치는 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 파라미터 검증 누락.
Background
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 프로세스가 참조 권한을 가진 파일인지 검증합니다.
Analysis
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 로직 버그에 해당합니다.
Aaaaaaa Aaa Aaaaaa Aaaa Aaaa Aaaaaaaaaa Aaaaaaa Aaa Aaaaaaa Aaa Aaa Aaa Aaaaaa Aaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaa Aaaa Aaaaaa Aa Aaaaaaa Aa Aaa Aaaa Aa Aaaa Aaaaaaaaaaaaaaaaaa Aaaaaaa Aaaaa Aa a Aa Aa Aaa Aaaaaa Aa Aa Aaaaa Aaaa Aa Aaaa Aaaa Aaaaa Aaaaaaaaaaaa Aaaaaaaa Aa Aaaa Aaa Aa Aaa Aa a Aaaaa
Aaaaaaa Aaaaa Aaaaaaaaaa Aaaaaa Aaa Aaaaaaa Aaaa Aaaa Aaaa Aaaaaaaaaa Aaaaa Aaa a Aa Aaaa Aaa Aaaaaa Aaaaa a Aaaa Aa Aa Aaaa Aaaaaaaa Aaaaa Aaaa Aaa Aaaa Aaaaaaaaaaaaaaaaaa Aa Aaa Aaaaaa Aaaaaaaaaa Aaaaa Aaaaaaa Aaaa Aa Aaa Aa Aaa Aa a Aa a Aaaaa Aa Aaaa Aaa Aaaa Aaaa Aaaaaaaaaaaa Aaaaaaa Aaaa Aaa Aa Aaa Aaa Aaaa Aa Aaaaaa
a Aaa Aa Aaaa Aaaa Aaaaaa Aaaaa Aaaa Aaa a Aaaaaa Aaa Aaa Aaaa Aaa Aaa Aaa Aa Aa Aaa Aaa Aaaa Aa Aa a Aaaaa Aaaaa Aaaa Aaaa Aaaaaaa Aaa Aa Aaaa Aaa Aa Aaa Aaaaaaa Aaaaaa Aaaaa Aa Aaaaa Aaa Aa Aaa Aaaaaaaaaaaaaaaaaa Aaaaaaaa Aa Aa Aa Aaa Aaaaa Aaaaa Aaaaaa Aaaaaaa Aaaaaaaaaa Aaa Aa Aa Aa Aaaa Aaaa Aaa Aa Aaaaa Aa Aaaaaaa Aaaaaaaa Aaaa Aaaaaaaaaaaaaaaaaa Aaaa Aa Aa Aaa Aaaaaaa
Aaaaaaaaa Aa Aa a Aaaaaaaaaaaaaaaaaa Aa Aa Aa Aa Aaaa Aaaaaaaaa Aa Aaaa Aaaa Aaaa Aa a a Aaaa Aaa Aaa Aaa Aaa Aaa Aaaa Aaa Aaaaa Aaa Aaaaaaa Aa Aaaa Aaaaaaaaa Aa Aa Aaa Aaaaa Aaaa Aaaaa Aaaa Aaa Aaaaaaaaaa Aaaaaaa Aaaaaa Aaa Aaa Aaaa Aaaaaa
🔒Explores the IPC trust boundary between WebContent and Network processes, with a detailed walkthrough of how the validation gap enables filesystem access escalation
더 확인하려면 구독해 주세요
Audit directions
a Aaaaa Aaaaa Aaaa Aaa Aa Aaa Aaa Aaa Aaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aa Aaa Aa Aaaaa Aa Aaa Aaa a Aa Aa Aaa Aa Aa Aaaaa Aaaa Aaa Aaaaaa Aaaaaaaaaaaaaaaaaaaa Aaa Aa Aa Aaa Aaa Aa Aaa Aaa Aaa Aaa Aaa Aa Aaa Aaaa Aa Aaaaa Aaa Aaaa
a Aaaaa Aaa Aaa Aa Aaaa Aa Aaa Aaaaaa Aa Aaaa Aaa Aa Aaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaa Aa Aaa Aaa Aaaaaa Aa Aaaaaaaaaaaa Aaaa Aaaaaaaaa Aaaaa Aaaaaa Aaaaaaaa Aaaaaaaaa Aaaa Aaa Aa Aa Aa Aaaa Aaa a Aaa Aaaa Aaaa
a Aaaaaaaaaaaa Aaaaaaa Aaaaa Aa Aaaaa Aaaa Aaaaaaa Aaaa a Aa Aaa Aaaaaa Aa Aaa Aaa Aaaaa Aaaaaaa Aaaaa Aaaaaaaaaa Aaaaaa Aaaaa Aa Aaa Aa Aaaa Aaa a Aaa Aaaa Aaa Aaaaa Aa Aaaaaaa Aaa Aa Aaa Aaaaa Aaa Aaaaaa Aaaa Aaaa Aaaaa Aaaaaaaa Aaaaaaa Aaaaaa Aaaa Aa Aaaa Aaa Aaa Aaa Aaaa Aaaa
🔒Multiple audit patterns identified for IPC parameter validation gaps across Network process message handlers, with concrete search targets
더 확인하려면 구독해 주세요