This Week in WebKit — June 13 - June 19, 2026
Featured
A WebAuthn ceremony is scoped to a relying-party origin, and that origin is the one thing the authenticator trusts. But the UIProcess receivers for MakeCredential/GetAssertion consumed frameInfo.securityOrigin and parentOrigin straight off the IPC message, never re-deriving them from the frame's real URL. A WebContent process that's already compromised could therefore claim https://bank.com while hosted elsewhere and run a credential ceremony under the spoofed origin. The fix re-derives the origin from UIProcess-owned WebFrameProxy state and MESSAGE_CHECKs the renderer's claim — terminating the process when it lies.
The UIProcess runs unsandboxed and can read any file the user can, so the only paths it should act on are ones the user dragged or pasted in. registerAttachmentIdentifierFromFilePath skipped that check entirely, taking an arbitrary absolute path from the renderer and binding the file's bytes to an attachment that web content can read back via attachment.info.data. The regression test names /etc/passwd and expects the process to die. The fix adds a per-process allowlist populated only at real drag-drop and pasteboard grants — anything else is a confused-deputy file read.
Streaming Wasm compilation finishes on a background worklist, posting its result back through a DeferredWorkTimer ticket and a captured JSGlobalObject*. Both are scoped to the requesting iframe's realm — tear that iframe out of the DOM before compilation completes and the global is collected, the ticket cancelled and freed, yet the completion lambda dereferences both. The tell is in the removed comment: m_ticket was a PackedPtr deliberately invisible to the GC, so nothing kept the referenced state alive. The fix weak-holds the ticket via ThreadSafeWeakPtr and re-derives the global, early-returning if either is dead.
Before an indexed drawElements, ANGLE computes the highest index referenced and rejects any that exceeds the vertices the bound buffers supply. But the cardinality of the full 32-bit range needs 33 bits, and downstream consumer arithmetic narrows it to 32 — collapsing the maximal range to an apparently-empty, trivially-in-bounds value so the draw proceeds. The result is an out-of-bounds vertex-attribute read in the GPU process, reachable straight from web content via a 0xFFFFFFFF index against an undersized buffer. The fix reworks IndexRange to a start/end pair and computes vertexCount() in size_t.
Security fixes
-
Race-condition UAF in JSSubscriber GC marking
Medium WebCore DOM Observable/Subscriber
Notable development
-
[NavigationScheduler] history.back/forward/go(n) calls don't coalesce per spec when queued synchronously
bug
-
[JSC] New DFG node for StringIteratorPrototype.next
optimization
-
AudioVideoRenderer SharedTimebase ownership and drift reduction
refactor
-
[Site Isolation] Per-frame walk replaces navigatedFrameID heuristic in back/forward routing
bug
-
Sampled mprotect write-guard for DOMWrapperWorld::m_wrappers corruption
hardening
-
Untrusted image data restricted from ImageIO codec dispatch in WebExtension icon loading
hardening
-
Deferred process swapping for HTTP redirects with Enhanced Security
feature
-
Clear-Site-Data "cache" failed to evict BFCache/MemoryCache via SecurityOriginHash ODR violation
bug
-
[Site Isolation] Cross-process resource and loaderId aggregation in Page.getResourceTree
feature
-
[JSC] Map/Set iterator next must not touch JSMapIterator/JSSetIterator directly
refactor
Other security-relevant changes
- [WebKit pasteboard proxy] (sandbox bypass)
0d3713d— pasteboard IPC의 authorization bypass가 수정되었습니다.getPasteboardPathnamesForType()이 drop 시점에만 접근을 허용하는canAccessPasteboardData()대신, drag-over 중에도 접근을 허용하는canAccessPasteboardTypes()를 확인하고 있었습니다. 이로 인해 file path가 의도보다 이른 시점에 노출되었습니다. - [WebCore RTCEncodedStreamProducer] (type confusion)
8384c84—RTCEncodedStreamProducer::writeFrame에 type validation이 추가되었습니다. audio frame이 video sender에 enqueue되거나 그 반대가 되는 type confusion을 방지하며, 이로 인해 OOB read가 발생할 수 있던 문제가 수정되었습니다. - [WebKit NetworkProcess] (sandbox bypass)
5ec3ee1— local file load에 대한 sandbox extension 확인 위치를 WebContent에서 Networking process로 이동하여 access 제한 우회를 방지했습니다. - [JSC AccessCase] (UAF)
055680a— AccessCase에 CustomAccessorGetter/CustomAccessorSetter의 customSlotBase 추적이 추가되었습니다. JIT-cached reference가 slot base의 GC 이후까지 살아있을 경우 발생할 수 있는 UAF를 방지합니다. - [WebCore HTMLDialogElement] (UAF)
7075344—HTMLDialogElement::handleCommandInternal에서 UAF가 수정되었습니다.beforetoggleevent handler가 button의 value attribute를close()에 전달하는 도중 제거할 수 있어 dangling string reference가 발생하는 문제였습니다. - [WebGPU CommandEncoder] (UAF)
5b76a52— render pass 설정 전에 texture view가 파괴되었는지 여부를 검증하도록 변경되었습니다. 무효화된 WebGPU 리소스를 참조할 때 발생하는 UAF를 방지합니다. - [JSC Wasm] (UAF)
9a16de4— Wasm JIT에서 UAF가 수정되었습니다. callsite 수집과 repatch 사이에 BBQCallee가 소멸할 수 있었는데,Heap::stopThePeriphery()가 JS 스레드는 멈추지만 Wasm 스레드는 멈추지 않는 것이 원인이었습니다. BBQCallee를 strong ref로 유지하여 소유한 OMGOSREntryCallee를 보존합니다. - [WebCore FEColorMatrix] (validator bypass)
b5b06c0— GPU process 메시지를 디코딩하기 전, FEColorMatrixvalues벡터의 길이를type에 대해 IPC 측에서 검증하는 로직이 추가되었습니다. web content가 불일치한 type/values 조합을 전송할 경우 발생할 수 있던 crash를 방지합니다. - [WebCore Attr] (UAF)
8d71b72— GC 스레드가 main thread의 소멸과 동시에m_element를 역참조하는 UAF가 수정되었습니다. cross-thread 동기화를 위해 lock과 CheckedPtr이 추가되었습니다. - [WebKit / NetworkProcess] (sandbox bypass)
f10b871—InstallMockContentFilterIPC 처리에AllowTestOnlyMockContentFilterIPC조건 확인이 추가되었습니다. 이전에는 손상된 WebContent 프로세스가 process-globalMockContentFilterSettings싱글톤을 덮어써 모든 NetworkProcess 연결에서 탐색을 리디렉션하거나 차단하는 것이 가능했습니다. - [WebCore filters/morphology] (race condition)
f076e1a— 병렬 morphology filter에서 여러 스레드가 thread-safe하지 않은 PixelBuffer를 공유하던 race condition이 수정되었습니다. 이제 각 job은 별도의 버퍼를 사용합니다. - [ANGLE Metal backend] (type confusion)
c9fd4a1— ANGLE Metal backend에서 stale texture format 문제가 수정되었습니다. 범위를 벗어난 mipmap 업로드 시mFormat이 잘못 업데이트되어 이후 GenerateMipmap 및 render 작업이 native storage와 맞지 않는 형식을 사용하게 되었습니다. - [WebCore PlatformScreen] (lifetime fix)
ee05249— PlatformScreen에서 동시 HashMap 접근으로 인한 MTE crash가 수정되었습니다. 불필요한 reference 변수를 제거하여 memory leak도 함께 해결되었습니다. - [WebCore ControlFactory] (UAF)
ab0c1f8— ControlFactory 싱글톤은 여러 스레드에서 동시에 ref/deref되었지만 thread-safe하지 않은 RefCounted를 사용하고 있어 잠재적 UAF가 발생할 수 있었습니다. ThreadSafeRefCounted로 전환하여 수정되었습니다. - [WebKit CoreIPC] (TOCTOU, OOB read)
ca1cd57—logOnBehalfOfWebContent에서 TOCTOU 문제가 수정되었습니다. 손상된 WebContent 프로세스가 IPC 전송 이후 SharedMemory 기반 문자열을 변조하여 null terminator를 제거하면 UIProcess에서 OOB read가 발생할 수 있었습니다. 이제 수신 즉시 span을 CString으로 복사합니다. - [WebCore Worklets CSP] (CSP bypass)
933debd— AudioWorklet과 PaintWorklet scope가 빈 CSP로 초기화되어 eval() 차단 등의 제한이 우회되던 문제가 수정되었습니다. 이제 생성자 document의 CSP를 올바르게 상속합니다. 또한 worklet module fetch의 CSP directive 확인도 worker-src 대신 script-src를 사용하도록 수정되었습니다. - [WebCore WebGL]
d0000ca— offset이 있는 PBO로 픽셀을 읽을 때 client buffer 경로를 잘못 사용하던 문제가 수정되었습니다. 이로 인해wipeAlphaChannelFromPixels에서 crash가 유발되었습니다.