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.
JSC's literal fast path snapshots an object's Structure and a cached single-transition offset, then recursively parses the property value. The catch: a nested __proto__ value synchronously invokes a user setter on Object.prototype, which can mutate the in-progress object's shape mid-parse. Pre-fix, the parser applied the now-stale newStructure/offset to a differently-shaped object — a wrong-slot or out-of-bounds butterfly write plus a structure id that no longer describes the object. The fix re-reads object->structure() after the recursive parse and bails to the slow path on mismatch.
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— Fixed authorization bypass in pasteboard IPC: getPasteboardPathnamesForType() checked canAccessPasteboardTypes() (allows during drag-over) instead of canAccessPasteboardData() (allows only at drop), exposing file paths prematurely. - [WebCore RTCEncodedStreamProducer] (type confusion)
8384c84— Adds type validation in RTCEncodedStreamProducer::writeFrame to prevent audio frames from enqueuing on video senders and vice versa, fixing a type confusion that enabled out-of-bounds reads. - [WebKit NetworkProcess] (sandbox bypass)
5ec3ee1— Moved sandbox extension check for local file loads from WebContent to Networking process to prevent circumvention of access restrictions. - [JSC AccessCase] (UAF)
055680a— Adds customSlotBase tracking for CustomAccessorGetter/CustomAccessorSetter in AccessCase, preventing use-after-free when JIT-cached references outlive garbage collection of the slot base. - [WebCore HTMLDialogElement] (UAF)
7075344— Fixed use-after-free in HTMLDialogElement::handleCommandInternal where a beforetoggle event handler could remove a button's value attribute while it was being passed to close(), causing a dangling string reference. - [WebGPU CommandEncoder] (UAF)
5b76a52— Validates that texture views have not been destroyed before using them in render pass setup. Prevents use-after-free when attempting to reference invalidated WebGPU resources. - [JSC Wasm] (UAF)
9a16de4— Fixed use-after-free in Wasm JIT where BBQCallee could die between callsite collection and repatch because Heap::stopThePeriphery() stops JS threads but not Wasm threads. Keeps BBQCallee alive via strong refs to preserve its owned OMGOSREntryCallee. - [WebCore FEColorMatrix] (validator bypass)
b5b06c0— Added IPC-side validation of FEColorMatrixvaluesvector length againsttypebefore decoding, preventing crashes when web content sends mismatched type/values in GPU process messages. - [WebCore Attr] (UAF)
8d71b72— Fixes use-after-free where GC thread dereferenced m_element concurrently with main thread destruction; adds lock and CheckedPtr for cross-thread synchronization. - [WebKit / NetworkProcess] (sandbox bypass)
f10b871— Gated InstallMockContentFilter IPC behind AllowTestOnlyMockContentFilterIPC; a compromised WebContent process could overwrite the process-global MockContentFilterSettings singleton, redirecting or blocking navigations for all NetworkProcess connections. - [WebCore filters/morphology] (race condition)
f076e1a— Fixed race condition in parallel morphology filter where threads accessed shared non-thread-safe PixelBuffer; each job now has separate buffers. - [ANGLE Metal backend] (type confusion)
c9fd4a1— Fixed stale texture format in ANGLE Metal backend — mFormat was incorrectly updated on out-of-range mipmap uploads, causing subsequent GenerateMipmap and render operations to use wrong format against native storage. - [WebCore PlatformScreen] (lifetime fix)
ee05249— Fixed MTE crashes from concurrent HashMap access in PlatformScreen by removing an unnecessary reference variable that was introducing a memory leak. - [WebCore ControlFactory] (UAF)
ab0c1f8— ControlFactory singleton was ref'd/deref'd concurrently from multiple threads but used non-thread-safe RefCounted, causing potential UAF. Fixed by switching to ThreadSafeRefCounted. - [WebKit CoreIPC] (TOCTOU, OOB read)
ca1cd57— Fixed TOCTOU in logOnBehalfOfWebContent where a compromised WebContent process could mutate SharedMemory-backed strings after sending over IPC, removing null terminators and causing OOB reads in UIProcess. Copies spans to CStrings immediately on receipt. - [WebCore Worklets CSP] (CSP bypass)
933debd— AudioWorklet and PaintWorklet scopes were initialized with empty CSP, bypassing restrictions like eval() blocking; now properly inherit creator document's CSP. Also corrected CSP directive check for worklet module fetches to use script-src instead of worker-src. - [WebCore WebGL]
d0000ca— Avoided incorrectly using the client buffer path when reading pixels to PBO with offset, which triggered a crash via wipeAlphaChannelFromPixels.