WebKit — 2026-W37

Clone-free silent-fix hunt over WebKit (GitHub-sourced), 2026-09-07 → 2026-09-13. Every candidate below is cherry-picked from the week’s merged Source/ commits, triaged on the patch-now / watch / noise ladder, given a full root-cause writeup, and put through independent adversarial verification — the same bar as the Chrome weekly reports.

This week. 79 candidates — 13 patch-now (RCE-class, attacker-reachable in default config), 20 watch (security-relevant but gated / weaker primitive / unproven), 46 noise, 0 duplicate. 7 root-caused · 7 tier-2 verified.

Candidates

Verdict: 🔴 patch-now (RCE-class, attacker-reachable in default config) · 🟡 watch (security-relevant but not confirmed patch-now — gated, weaker primitive, or unproven) · ⚪ noise (structural false positive) · 🔁 dup (cherry-pick). ✔︎verified = passed independent adversarial tier-2 review; ~plausible = tier-2 could not fully confirm from the diff. Conf is confidence the commit is a genuine security fix.

Verdict Class Conf Sev CVSS Component Commit Primitive
🔴 patch-now · ✔︎verified UAF 0.85 high — Source/WebCore/platform d4aabfbeb55f Cross-thread UAF: m_private (MediaPlayerPrivateInterface) freed on main thread while the audio render thread reads it via audioSourceProvider()
🔴 patch-now · ✔︎verified UAF 0.82 high — Source/WebCore/html fe938b0a2301 Stale FontSelectorClient pointer from by-value FontProxy copied into Vector that relocates
🔴 patch-now Spoofing 0.8 medium — Source/WTF/ 2ae84d79b1af compromised WebContent passing an arbitrary URL to ProvisionalPageProxy::didStartProvisionalLoadForFrame (provisional/address-bar URL spoof)
🔴 patch-now · ~plausible OOB-read 0.8 high — Source/WebGPU/ 5c003980c0fe A render bundle’s indexed indirect-draw ICB slot reused on equal generations let an index buffer mutated after baking feed out-of-bounds vertex indices to the GPU.
🔴 patch-now · ~plausible OOB-write 0.78 high — Source/JavaScriptCore/runtime ae97aa471a12 Out-of-bounds read/write on JSArray butterfly in fastCopyWithin when vectorLength < length
🔴 patch-now PolicyBypass 0.72 medium — Source/WebKit/UIProcess 173261c80c9a compromised WebContent process forging transient activation to obtain clipboard paste access via requestDOMPasteAccess
🔴 patch-now · ~plausible OOB-write 0.65 high — Source/WebGPU/ 77acddc2cf45 Compressed-texture repack in Queue::writeTexture lacked the per-row/per-image bounds checks that the hardened path adds, risking out-of-bounds buffer access during the repack copy.
🔴 patch-now UAF 0.62 medium — Source/WebCore/platform d147fe73cf32 Use-after-free: AudioHardwareListener held its Client by raw reference and called into it after the client was destroyed
🔴 patch-now Race 0.6 medium — Source/WebKit/UIProcess 0ccf17b18a16 off-main-thread access to WebPageProxy::attachmentForIdentifier / m_attachments from the item-provider file callback
🔴 patch-now · ✔︎verified UAF 0.6 high — Source/WebGPU/ 70e05bc9fbbf GPU command buffer / referenced resources could be freed while a committed Metal command buffer was still in flight at instance teardown.
🔴 patch-now · ✔︎verified OOB-read 0.6 high — Source/WebGPU/ 870a585cde03 copyBufferToTexture/copyTextureToBuffer split-copy loop assumed blockHeight==1, so for block-compressed formats the per-row offset (y*bytesPerRow) over-advanced into out-of-bounds buffer memory.
🔴 patch-now Spoofing 0.6 medium — Source/WebKit/UIProcess d4b8cb8d2eef Modal JS dialog shown on behalf of a frame no longer in the displayed frame tree (stale/detached-frame dialog)
🔴 patch-now UAF 0.6 medium — Source/WebCore/platform fb20d4d63ba2 Dangling-reference use of a destroyed PlatformSpeechSynthesizerClient from async platform speech callbacks
🟡 watch PolicyBypass 0.55 medium — Source/WTF/ 8eb608658b83 WebRTC DNS resolution was performed without a policy gate, allowing mDNS/relay-bypass behavior that can expose local IPs.
🟡 watch Race 0.55 medium — Source/WebCore/css b982ebd3147d Unlocked read of CheckedPtr/Ref members (m_track, m_ownerNode, m_current, m_element) on parallel GC marking threads racing main-thread mutation
🟡 watch InputValidation 0.55 medium — Source/WebCore/Modules e410d5cb1d2c WebCodecs video encoder config accepted width/height beyond 32767 (potential integer-overflow/OOB in codec backend)
🟡 watch UAF 0.5 medium — Source/JavaScriptCore/runtime 2c0010b8b5f1 FinalizationRegistry dead registrations keyed on a collected unregister token not swept during GC finalizeUnconditionally
🟡 watch InputValidation 0.5 medium — Source/WebKit/UIProcess 436386a065b7 WebContent sending invalid/unset animation UUIDs in TextAnimationData to WebPageProxy::addTextAnimationForAnimationID
🟡 watch Spoofing 0.5 low — Source/WebCore/loader a37a6505759f A page could focus/raise a named target window via createWindow() without a transient user activation.
🟡 watch PolicyBypass 0.5 medium — Source/WebKit/UIProcess acb9b59d02a8 Provisional (uncommitted) process could trigger arbitrary WebPageProxy sync message handlers
🟡 watch OOB-read 0.45 low — Source/WebCore/platform 560f0ec35828 Cert-chain loop could read past SecTrustCopyCertificateChain array or deref a null chain when its count disagreed with SecTrustGetCertificateCount().
🟡 watch OOB-read 0.45 medium — Source/JavaScriptCore/dfg 5d1761dffb00 String.prototype.at/codePointAt DFG nodes lacked SSA-phase bounds-check lowering that StringCharCodeAt had.
🟡 watch InputValidation 0.45 low — Source/JavaScriptCore/jit a371ed314175 IPC-decoded UUID could be constructed with the reserved empty/deleted sentinel values, previously only caught by a RELEASE_ASSERT (process abort).
🟡 watch UAF 0.45 medium — Source/WebCore/platform f90b4eaa2206 WeakPtr parent/this dereferenced across async main-runloop callbacks without holding a strong reference for the call’s duration
🟡 watch IntegerOverflow 0.42 medium — Source/JavaScriptCore/runtime f52d0e486a0e JSBigInt size/bounds invariants and int32_t bit-count casts hardened against overflow/OOB (truncateToNBits/truncateAndSubFromPowerOfTwo, cachedMod, parseInt)
🟡 watch Race 0.4 low — Source/WebCore/platform 42ca5cc802a1 data races on MockRealtimeVideoSource m_preset/m_startTime/m_elapsedTime/m_deviceOrientation between caller and capture run-loop threads
🟡 watch UAF 0.4 low — Source/WebCore/dom 7737c68ff271 Remote intersection observers were not disconnected at Document teardown, potentially leaving them registered against a destroyed document.
🟡 watch UAF 0.4 low — Source/JavaScriptCore/wasm 92a274ec73ed findBreakpoint() returned a raw Breakpoint* into a HashMap value that could dangle if the map mutated while the pointer was held.
🟡 watch OOB-write 0.4 medium — Source/JavaScriptCore/runtime 9e61914f4c44 BigInt digit-buffer arithmetic (karatsuba/divideSchoolbook/shifts/spanCopy/createFrom) bounded by RELEASE_ASSERTs on span sizes.
🟡 watch PolicyBypass 0.3 low — Source/WebCore/loader 1b00bc4536dc blob/inherited document receiving wrong IP address space for Private Network Access classification
🟡 watch Race 0.3 low — Source/WebCore/loader 7e9466634388 CachedScript m_script/m_decoder/m_decodingState read on main thread without documented locking discipline while compilation threads read under lock.
🟡 watch PolicyBypass 0.3 medium — Source/WebCore/dom 944f82d72ae7 Local Network Access (RFC1918/PNA) control enforcing secure-context + permissions-policy + permission before public pages reach local/loopback addresses.
🟡 watch Race 0.3 low — Source/JavaScriptCore/ftl f2535d35a033 Assorted unguarded cross-thread field accesses (GC, JIT, media, storage) now lock-annotated or atomic
⚪ noise NotSecurity 0.2 low — Source/WebCore/history 3d1769871dc6 null localMainFrame deref during CachedPage::restore under site isolation
⚪ noise NotSecurity 0.2 low — Source/JavaScriptCore/bytecompiler 4fa7b55ae4c6 tail-call optimization incorrectly applied across an await in generator/async bodies
⚪ noise NotSecurity 0.2 low — Source/WebCore/html f2f5e1dff4dd n/a
⚪ noise NotSecurity 0.15 low — Source/WebCore/dom 2aedf51ba631 none
⚪ noise NotSecurity 0.15 low — Source/WebGPU/ 514f90daafbe none
⚪ noise NotSecurity 0.15 low — Source/WebCore/accessibility 6d28d6994a1f n/a
⚪ noise LogicError 0.15 low — Source/WebCore/animation 7b265b345c26 n/a
⚪ noise NotSecurity 0.15 low — Source/WebCore/platform 893cb75bec40 n/a
⚪ noise NotSecurity 0.15 low — Source/WebCore/rendering 8ff57ddb452a n/a
⚪ noise NotSecurity 0.15 low — Source/WebCore/dom 94f9b7905e3c n/a
⚪ noise NotSecurity 0.15 low — Source/WebCore/rendering cb5ef650091f n/a
⚪ noise NotSecurity 0.15 low — Source/WebKit/WebProcess d58d0a3ae2a0 n/a
⚪ noise NotSecurity 0.13 low — Source/WebCore/layout feb8e0dbf2cc none - refactor of how text-overflow/ellipsis style is resolved for anonymous inline/block boxes
⚪ noise NotSecurity 0.12 low — Source/WebCore/html 08004ec9ed57 none
⚪ noise NotSecurity 0.12 low — Source/WebCore/WebCore.xcodeproj 0db442413a5a none
⚪ noise NotSecurity 0.12 low — Source/WebCore/html 1a3eac178b9f none
⚪ noise NotSecurity 0.12 low — Source/WebCore/dom 3b068d9c3d5f none
⚪ noise NotSecurity 0.12 low — Source/JavaScriptCore/runtime b6afe0d39e0a n/a
⚪ noise NotSecurity 0.12 low — Source/WebCore/layout c0a49688cb18 n/a
⚪ noise NotSecurity 0.12 low — Source/WebCore/platform cd04e05d1a61 n/a
⚪ noise NotSecurity 0.12 low — Source/WebGPU/ d0eee3fe1ac2 n/a
⚪ noise NotSecurity 0.12 low — Source/WebCore/platform d95f64460bc6 n/a
⚪ noise NotSecurity 0.12 dev — Source/WTF/ fcef99916e4a none - protect()/RefPtr/WeakPtr SaferCPP hardening sweep plus toAPI(String) signature cleanup
⚪ noise NotSecurity 0.1 low — Source/WebCore/rendering 00af7a4b15fa none
⚪ noise NotSecurity 0.1 low — Source/WebCore/loader 0e84b2439008 none
⚪ noise NotSecurity 0.1 low — Source/WebCore/layout 3974cac991a4 none
⚪ noise NotSecurity 0.1 low — Source/WebCore/svg 3b9b086f6357 none
⚪ noise NotSecurity 0.1 low — Source/JavaScriptCore/b3 41ec81351b41 none
⚪ noise NotSecurity 0.1 dev — Source/JavaScriptCore/yarr 6279ebe3bd2d n/a
⚪ noise NotSecurity 0.1 dev — Source/WebCore/css 63354f38775d n/a
⚪ noise NotSecurity 0.1 low — Source/WebCore/html 7067ca63e913 n/a
⚪ noise NotSecurity 0.1 dev — Source/JavaScriptCore/bytecode 7bd7b6dfadc4 n/a
⚪ noise NotSecurity 0.1 dev — Source/ThirdParty/ANGLE/ 8a3192a38590 n/a
⚪ noise NotSecurity 0.1 dev — Source/WebCore/svg a6509b7967f0 n/a
⚪ noise NotSecurity 0.1 dev — Source/WebKit/UIProcess c0646476dd49 n/a
⚪ noise NotSecurity 0.1 dev — Source/JavaScriptCore/wasm c3a249e70753 n/a
⚪ noise NotSecurity 0.1 low — Source/WTF/ c4a7ebcc295f n/a
⚪ noise NotSecurity 0.1 low — Source/WebCore/html d6d0989dd597 n/a
⚪ noise NotSecurity 0.1 low — Source/JavaScriptCore/runtime df94b6ccbb53 n/a
⚪ noise NotSecurity 0.1 dev — Source/JavaScriptCore/llint e00002d2d87a n/a
⚪ noise NotSecurity 0.08 dev — Source/JavaScriptCore/runtime 00130dc2f37d none
⚪ noise NotSecurity 0.08 dev — Source/WTF/ 3e12766ced21 none
⚪ noise NotSecurity 0.08 low — Source/WTF/ 4b78955e0ded none
⚪ noise NotSecurity 0.08 dev — Source/WebCore/css edc74c3eeb03 n/a
⚪ noise NotSecurity 0.05 dev — Source/WebCore/css 051c3dbad0e7 none
⚪ noise NotSecurity 0.05 dev — Source/WebCore/css 0e801491f720 none