A robustness or init safeguard the rest of the code assumes is on is silently off
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.
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
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| CVE | What | Component | Vendor | Severity | Month | |
|---|---|---|---|---|---|---|
| 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.
# 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