OOBUninitializedMemory 19 CVEs 19 mapped CWE-665CWE-908CWE-125 2025-03 → 2026-09

A backend, buffer, or attachment relies on a safeguard the higher layer assumes is always in force — a robustness extension, an unconditional padding, a resource-init flag — but that safeguard is never advertised, is gated on the wrong condition, or is not re-armed after an invalidate/reconfigure, so the guarantee callers depend on is silently absent and an OOB or uninitialized read follows.

Invariant
A safeguard that a higher layer treats as always-on — a robustness/validation extension, an unconditional allocation margin, or a resource-init flag — must actually be in force for every case that layer covers, and must be re-armed on every invalidate/discard/reconfigure that can drop it.

Mechanism

ANGLE and Dawn lean on backend safeguards to make higher-level guarantees: the front-end OOB index validation only fires when the backend advertises createContextRobustness; a uniform buffer is safe to over-read only if it was padded; a framebuffer read is safe only if robust resource init marked its attachments MayNeedInit. Each safeguard is set in one place and assumed everywhere else.

The bug is that the safeguard is quietly not in force for some case: the Metal backend never advertises the robustness extension (so front-end index validation is inactive on Apple GPUs), the padding is gated on the buffer’s current bind target rather than on any buffer that could later become a uniform buffer, or an invalidate/discard path drops attachment contents but forgets to reset InitState. The rest of the pipeline still assumes the guarantee holds, so an out-of-bounds index, an over-read past a buffer, or a read of never-initialized attachment memory reaches the GPU process — all from ordinary WebGL/WebGPU content.

Fix shape

Make the safeguard unconditional for every case the higher layer covers: advertise the robustness extension so the front-end validation path always runs, pad every buffer that could ever be bound as a uniform buffer rather than only the currently-bound ones, and re-arm the resource-init flag (markAttachmentsUninitialized) on every invalidate/discard/reconfigure path.

CVEs in this pattern

12 components · ANGLE, WebGL, Skia, Compositing, Passwords, WebView, Network, Chromecast, Dawn, GPU, WebAudio, WebKit
CVEWhatComponentVendorSeverityMonth
CVE-2026-85051 TypeConfusion in Compositing Compositing chrome High 2026-09 🔧
CVE-2026-87501 Spoofing in Passwords Passwords chrome Medium 2026-09 🔧
CVE-2026-87640 OOB in WebView WebView chrome Medium 2026-09 🔧
CVE-2026-87642 UninitializedMemory in WebGL WebGL chrome Medium 2026-09 🔧
CVE-2026-91708 Race in Network Network chrome High 2026-09 🔧
CVE-2026-79020 OOB in Skia Skia chrome Medium 2026-08 🔧
CVE-2026-79054 UAF in Chromecast Chromecast chrome Critical 2026-08 🔧
CVE-2026-79147 InfoDisclosure in Skia Skia chrome Low 2026-08 🔧
CVE-2026-79221 UninitializedMemory in Daw Dawn chrome Medium 2026-08 🔧
CVE-2026-79048 OOB in ANGLE ANGLE chrome High 2026-08 🔧
CVE-2026-17667 UninitializedMemory in ANGLE ANGLE chrome High 2026-07 🔧
CVE-2026-17701 OOB in ANGLE ANGLE chrome High 2026-07 🔧
CVE-2026-17808 UninitializedMemory in WebGL WebGL chrome Medium 2026-07 🔧
CVE-2026-11043 OOB in ANGLE ANGLE chrome Medium 2026-06 🔧
CVE-2026-14429 InputValidation in Skia Skia chrome High 2026-06 🔧
CVE-2026-9113 OOB in GPU GPU chrome High 2026-05 🔧
CVE-2026-9917 UninitializedMemory in WebGL WebGL chrome High 2026-05 🔧
CVE-2026-3540 LogicError in WebAudio WebAudio chrome High 2026-03 🔧
CVE-2025-24201 OOB in WebKit WebKit webkit Medium 2025-03 🔧

Hunt for siblings

For each safeguard a higher layer assumes (robustness extension advertised, buffer padded, attachment InitState set), find every backend/path that must also honor it and confirm none silently skips it.

grep / ripgrep
# Robustness/init safeguards and the paths that must (re)apply them:
rg -n 'createContextRobustness|markAttachmentsUninitialized|InitState|MayNeedInit|IsRobust' \
  src/libANGLE src/dawn/native
# Then: confirm invalidate/discard/reconfigure paths re-arm the flag, and every backend advertises the extension.

Mitigations that would catch this class

  • Treat every cross-layer ’the backend guarantees X’ as a checked contract, asserted on the consuming side, not an assumption
  • Re-arm init/robustness state in a single choke point on every invalidate/discard/reconfigure, never per-call-site
  • Fuzz each backend (Metal especially) for safeguards that other backends advertise but it does not