WebKit Silent-Fix Report — 2026-W22
Window: 2026-05-25 - 2026-05-31 (ISO 2026-W22). Generated by the webkitMon commit hunter (structural scorer v2 → LLM triage → root-cause analysis).
Coverage
- 255 commits triaged (floor-0 candidate set: every commit scoring ≥0).
- 71 judged security-relevant; 52 exploitable-grade (isSecurity, confidence ≥0.6, severity high/medium) with full writeups.
- Non-security in candidate set: 184 (candidate-set false-positive rate 72%).
Columns. Sev — severity (high / medium / low / dev). Conf — the triage model’s confidence (0.00–1.00) that the commit is a genuine security fix. Class — bug class (UAF, OOB, type confusion, race, cross-origin, bypass, …). Every row links to a full page with commit metadata and a side-by-side before/after view; the exploitable-grade commits also carry a full root-cause analysis, PoC, and detection guidance.
Exploitable-grade picks
| # | Sev | Conf | Class | Component | Commit | One-liner |
|---|---|---|---|---|---|---|
| 1 | high | 0.85 | Race | WebCore XMLHttpRequest/GC | a814080321 |
UAF/race: XHR responseXML/upload mutated on main thread while GC thread visits opaque roots; adds m_gcLock |
| 2 | high | 0.85 | Race | WebCore Streams | ad57b514bb |
UAF/race: ReadableStreamDefaultReader m_stream visited on GC thread while released on main; adds m_streamLock |
| 3 | high | 0.85 | Race | WebCore Streams | 597af50a64 |
UAF/race: ReadableStreamBYOBReader m_stream accessed on GC thread while mutated on main; adds m_streamLock |
| 4 | high | 0.85 | UAF | WebCore Shadow DOM SlotAssignment | 20beac1f6e |
UAF in NamedSlotAssignment::resolveSlotsAfterSlotMutation; reassign slots when invalid before iterating |
| 5 | high | 0.85 | UAF | JSC Wasm Table | 36a3e59bad |
Wasm Table.grow with non-null funcref default left slot half-initialized; GC freed live wrapper, table.get dangling |
| 6 | high | 0.85 | TypeConfusion | JSC FTL OSR | eba64ef44d |
FTL Phantom array rematerialization used wrong structure after having-a-bad-time; ArrayStorage vs contiguous mismatch |
| 7 | high | 0.85 | TypeConfusion | JSC FTL OSR | a82eb9dd7f |
FTL rematerialization dropped double-array holes and hasHoles count during bad-time, bypassing prototype accessors |
| 8 | high | 0.85 | OOB | JSC TypedArray | c8525868de |
TypedArray sort used cached length instead of span size; parallel SharedArrayBuffer grow could OOB |
| 9 | high | 0.85 | OOB | WebCore Crypto (SubtleCrypto) | d3de21e23b |
Add bounds checks to platformImportSpki/platformImportPkcs8 preventing over-read when index==keyData.size() |
| 10 | high | 0.85 | TypeConfusion | JSC DFG | 78c04ea7a1 |
Validate initial object structure in DFG tryEnsureAbsence before caching a property-miss condition |
| 11 | high | 0.85 | UAF | JSC Interpreter | 32f1bfb841 |
Defer GC while direct-eval CacheLookupKey holds a raw StringImpl from a rope fiber that flattening can free |
| 12 | high | 0.80 | UAF | WebCore ScrollerMac | a926a679cf |
UAF in WebScrollbarPartAnimationMac setCurrentProgress; ScrollerMac moved to ThreadSafeWeakPtr with null-check |
| 13 | high | 0.80 | UAF | WebCore forms date/time input | 869d5c5531 |
UAF in BaseDateAndTimeInputType::didChangeValueFromControl; null-check element() instead of asserting |
| 14 | high | 0.80 | TypeConfusion | JSC DFG | 177d2cad35 |
DFG tryEnsureAbsence accepted dictionary structures; a ’then’ added later went undetected, breaking Promise.resolve |
| 15 | high | 0.80 | TypeConfusion | JSC B3 | 81aa535db3 |
B3CanonicalizePrePostIncrements dominance analysis mishandled non-dominated uses, producing a miscompile |
| 16 | high | 0.80 | IntOverflow | ANGLE Metal backend | 0fe9ff8c67 |
ANGLE Metal syncDirtyAttrib crashed on OOB vertex attribute offset; vertex-count math hardened with CheckedNumeric |
| 17 | high | 0.80 | CrossOrigin | WebKit NetworkProcess (cookies) | fb75caed1b |
Validate cookie.domain and url match firstParty in setRawCookie and guard NSHTTPCookie creation exceptions |
| 18 | high | 0.75 | UAF | JSC FTL | e638840dd2 |
Fix GC safety for sunk contiguous array materialization in FTL by keeping element cell values live across allocation |
| 19 | high | 0.72 | UAF | JSC Wasm JSWebAssemblyInstance | 76b3468621 |
Unregister/tear down Wasm InstanceAnchor at the prologue of JSWebAssemblyInstance destructor to avoid UAF |
| 20 | high | 0.72 | UAF | JSC TypedArray prototype | a271abef22 |
Fix vector caching in TypedArray.prototype.forEach so a transitioning/reallocating buffer isn’t read via a stale pointer |
| 21 | high | 0.70 | OOB | JSC InlineCacheCompiler | 34669c802f |
Move DataView null-vector check outside IC register save/restore to avoid stub stack desynchronization |
| 22 | high | 0.65 | OOB | JSC ClonedArguments | 5099a4a895 |
Fix incorrect loop condition (length→length+offset) in ClonedArguments::copyToArguments with non-zero offset |
| 23 | medium | 0.80 | IntOverflow | libwebrtc H264 AVC parser | 86f9503e09 |
Reject AVC where size <= NALU type size in ComputeH264InfoFromAVC to fix integer underflow crash on attacker data |
| 24 | medium | 0.75 | Bypass | WebCore CSP / WebAssembly | 4003087f20 |
CSP wasm-unsafe-eval not enforced during Wasm byte compilation; Module() now blocked like Instance() |
| 25 | medium | 0.75 | Bypass | WebCore LocalDOMWindow postMessage | cfbce92003 |
postMessage relay indefinitely extended user-gesture token lifetime; now expires forwarded token |
| 26 | medium | 0.75 | Bypass | WebKit Storage Access / Tracking Prevention | 5021f999fe |
No-gesture requestStorageAccess() rejection fabricated user interaction that silently granted storage access under the opener |
| 27 | medium | 0.70 | UAF | WebCore Navigation/Loader | 8e3ad95fd1 |
Crash in HistoryController::updateForCommit when navigation.reload() runs during pageswap; now rejected |
| 28 | medium | 0.70 | Other | WebCore Font / GPU IPC | e57f9072af |
FontPlatformSerializedAttributes::toCFDictionary crashed on null palette entries from IPC; now skipped |
| 29 | medium | 0.70 | UAF | WebCore render tree form controls | 4f359a0df3 |
Crash recreating option::checkmark; advance beforeChild before destroying existing pseudo-element |
| 30 | medium | 0.70 | Race | WebCore PlatformScreen | 08911bd034 |
Concurrent screenData HashMap access caused MTE crashes; routed through PlatformScreen singleton |
| 31 | medium | 0.70 | CrossOrigin | WebKit UIProcess site-isolation | 1ad0d2a7c3 |
Cross-process page identity confusion in didPostMessage; Close now carries explicit page identifier |
| 32 | medium | 0.70 | Bypass | WebCore CSP site-isolation | 888c80c640 |
CSP upgrade-insecure-requests skipped when a cross-process iframe navigates the top frame; now plumbed to UIProcess |
| 33 | medium | 0.70 | UAF | WebKit UIProcess iOS forms | 7b904b1187 |
Crash in WKDateTimePicker removeDatePickerPresentation; protect() controls before dismiss/edit callbacks |
| 34 | medium | 0.70 | Race | WebCore GPUCanvasContextCocoa | cf20d123b3 |
Fix concurrent HashMap access in GPU canvas EDR headroom updates that caused MTE crashes |
| 35 | medium | 0.65 | UAF | WebKit UIProcess RemoteLayerTree | 2b7262df1a |
UI-process crash under DisplayLink callbacks; dtor now stops display links via WeakPtr process pool |
| 36 | medium | 0.65 | TypeConfusion | JSC DFG CSE | 1f4e4caab0 |
DFG StringAt did not include arrayMode in CSE, letting in-bounds/OOB variants be merged incorrectly |
| 37 | medium | 0.65 | CrossOrigin | WebCore SpeechSynthesis | 35c8316c38 |
Cancel SpeechSynthesis on suspend/stop so utterance audio does not leak to the next page on navigation |
| 38 | medium | 0.65 | UAF | WebKit Site Isolation (WebProcessPool) | 6512004572 |
Hold a shutdownPreventingScope on the reused process across addAllowedFirstPartyForCookies callback |
| 39 | medium | 0.60 | Other | JSC FTL/B3 Air | 1b422914d5 |
FTL stack-overflow check moved to prologue before frame allocation |
| 40 | medium | 0.60 | UAF | WebKit UIProcess Inspector site-isolation | bafdda395e |
Inspector proxying agent pinned process refs to avoid null/leak when removing receivers for swapped-out processes |
| 41 | medium | 0.60 | UAF | WebKit UIProcess WKWebView iOS | 8ea9912036 |
Crash in _dispatchSetViewLayoutSize when client overrides setFrame; null-check _page |
| 42 | medium | 0.60 | Race | WebCore GStreamer WebRTC | 8af0c2d1ea |
GStreamer WebRTC ICE agent used after close in async configure/incoming-data callbacks; added isClosed guards |
| 43 | medium | 0.60 | LogicError | WebCore DOM ContainerNode | 4c43686c30 |
ContainerNode::replaceAll short-circuit skipped removeAllChildren for Element inserts, leaving stale children |
| 44 | medium | 0.60 | Bypass | WebCore LocalDOMWindow postMessage | 4f82ed3499 |
postMessage user-gesture token expiry fix (part of the series, adds duplicate expiry guard) |
| 45 | medium | 0.60 | Bypass | WebCore LocalDOMWindow postMessage | 2050ddd586 |
postMessage user-gesture token expiry fix (series commit with duplicated expiry guard) |
| 46 | medium | 0.60 | UAF | JSC bytecode ExpressionInfo | 799e388d2e |
ExpressionInfo::Encoder::adjustInstPC takes an index instead of a pointer to survive vector reallocation |
| 47 | medium | 0.60 | TypeConfusion | JSC B3/Air | fa0214fe9a |
Fix AirFixObviousSpills modeling of early defs (clobber early defs before late defs) |
| 48 | medium | 0.60 | Other | JSC Wasm builtins | 57df341619 |
Add missing exception check after rope string resolution in WebAssembly builtins |
| 49 | medium | 0.60 | Bypass | WebKit NetworkProcess IPC | 479f2b4542 |
Replace abusable RELEASE_ASSERT(identifier) with MESSAGE_CHECK in scheduleResourceLoad |
| 50 | medium | 0.60 | Other | JSC IteratorOperations | b67282ad89 |
Add missing exception check in forEachInIteratorProtocol Set-iterator fast path |
| 51 | medium | 0.60 | Race | JSC JSLock | aed1fddc0b |
Make JSLock m_hasOwnerThread atomic with acquire/release to fix cross-thread data race |
| 52 | medium | 0.60 | CrossOrigin | WebKit Site Isolation / bfcache | fd143209a4 |
bfcache restore of a page with a cross-site iframe left iframe process’s top URL stale, resolving first party for cookies to the wrong site |
Other security-relevant
| Sev | Conf | Class | Component | Commit | One-liner |
|---|---|---|---|---|---|
| medium | 0.55 | OOB | JSC YARR RegExp | 7663d811d0 |
|
| medium | 0.55 | LogicError | JSC DFG OSR exit | 4e802a14ca |
|
| medium | 0.55 | Other | JSC StringPrototype | 18a2c9a100 |
|
| medium | 0.50 | TypeConfusion | JSC DFG allocation sinking | cdfa73fdc3 |
|
| medium | 0.50 | TypeConfusion | JSC LiteralParser | 09c07d2796 |
|
| low | 0.55 | UAF | WebCore SVG (SVGFontFace) | 33448fd684 |
|
| low | 0.55 | OOB | bmalloc libpas enumerator | ed57dc0915 |
|
| low | 0.50 | LogicError | WebCore TextExtraction | 55bbd269b7 |
|
| low | 0.50 | SandboxEscape | WebKit GPUProcess sandbox (macOS) | 083c7393fe |
|
| low | 0.45 | LogicError | WebCore scroll-snap | 1aba36b70e |
|
| low | 0.45 | LogicError | JSC iterator/Set prototype | ed0f115abf |
|
| low | 0.45 | LogicError | JSC JSArray toPrimitive | 8a7e39c2bf |
|
| low | 0.45 | Bypass | WTF URL/IDN | 8449fc1aac |
|
| low | 0.45 | UAF | WebCore editing Cocoa | 1ea0492626 |
|
| low | 0.40 | Other | WebKit SpeechRecognitionServer IPC | 5db4d93144 |
|
| low | 0.40 | UAF | WebKit UIProcess drag/sandbox | 5f39d2e310 |
|
| low | 0.40 | Other | WebKit ModelProcess IPC | 69ff7c4b91 |
|
| low | 0.40 | LogicError | JSC ArrayPrototype join | f181acea44 |
|
| low | 0.40 | UAF | WebCore graphics text | b88376b534 |