CVE-2026-87520
Overview
Background
- Dawn
- Chromium’s WebGPU implementation, the native library that translates
WebGPUAPI calls into backend graphics commands (Vulkan, Metal, D3D). - Vulkan Dynamic Rendering
- a Vulkan feature (exposed via
DeviceExt::DynamicRendering) that lets rendering begin without pre-createdVkRenderPass/VkFramebufferobjects, which Dawn drives through theToggle::VulkanUseDynamicRenderingtoggle. - Adapter toggle
- a per-adapter feature switch in Dawn (set via
adapterToggles->ForceSet/adapterToggles->Default) that enables or disables a backend codepath before device creation. - PowerVR / ImgTec
- Imagination Technologies GPUs, identified by
gpu_info::IsImgTec(GetVendorId()), whose Vulkan driver has a defect on the dynamic-rendering path.
Root Cause Analysis
Dawn’s Vulkan backend in PhysicalDeviceVk.cpp enabled the dynamic-rendering codepath by default for any adapter that reported DeviceExt::DynamicRendering support, guarding it only with a blocklist covering older Intel (<= gpu_info::IntelGen::Gen9) and ARM Mali-G68 devices. On Imagination/PowerVR GPUs the vendor driver has a known bug on that path that leads to a use-after-free, so the invariant that “an enabled backend feature must be safe on the reporting driver” was violated because the driver advertised the capability but mishandled its object lifetimes internally. Because the toggle was defaulted to true, every affected PowerVR device silently took the buggy codepath, allowing the driver’s UAF to be reached through normal WebGPU rendering.
The fix adds gpu_info::IsImgTec(GetVendorId()) to the disabling condition so adapterToggles->ForceSet(Toggle::VulkanUseDynamicRendering, false) runs on those GPUs, routing them back to the safe legacy render-pass path. This works because it prevents Dawn from ever exercising the driver code that triggers the use-after-free.
dynamicRendering support without accounting for a known-buggy vendor (Imagination), and the fix simply extends the existing driver blocklist with gpu_info::IsImgTec(GetVendorId()) so the unsafe codepath is force-disabled on those GPUs.Attack Path
- Vulnerable hardware
The victim runs Chrome on a device with an Imagination/PowerVR GPU whose Vulkan driver reports
DeviceExt::DynamicRenderingsupport. - Reach WebGPU
The victim visits attacker-controlled content that obtains a
WebGPUdevice, which Dawn backs with the Vulkan backend and the default-enabledToggle::VulkanUseDynamicRendering. - Trigger the path The page issues rendering work that exercises the dynamic-rendering codepath, invoking the PowerVR driver’s defective object handling.
- Use-after-free The driver frees and then reuses an object on this path, producing a use-after-free within the GPU process’s driver interaction.
Impact Assessment
Files Changed
src/dawn/native/vulkan/PhysicalDeviceVk.cpp
Audit Directions
- Capability-vs-safety blocklistsAudit other backend features that are defaulted on from an advertised extension/feature flag alone; each should have a vendor/driver blocklist and be reviewed as new buggy vendors surface.
- Vendor coverage gapsReview every
gpu_info::Is*guard in Dawn’s toggle setup for missing vendors (e.g., Imagination, Qualcomm, other mobile GPUs) on paths that already blocklist Intel or ARM, since partial blocklists imply an incompletely surveyed driver-bug surface. - Driver-lifetime pathsHunt for codepaths (like dynamic rendering) where object lifetime is managed inside the vendor driver rather than by Dawn, since UAFs there are invisible to Dawn’s own object tracking and only mitigable by disabling the path.
Patch
From 8b692610bcff3452945acf376290c6d753bfc833 Mon Sep 17 00:00:00 2001 From: Brandon Jones <[email protected]> Date: Mon, 13 Jul 2026 19:57:16 -0700 Subject: [PATCH] Suppress Vulkan Dynamic Rendering path on PowerVR There's a known driver issue with Imagination devices that can cause a use-after-free when the dynamic rendering Vulkan codepath is used. Blocklist dynamic rendering on Imagination GPUs to avoid the issue. Fixes: 529878021 Change-Id: I8d41e6d521c90a0b76e6a1033da7947a9ca5513c Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/324115 Reviewed-by: Kai Ninomiya <[email protected]> Commit-Queue: Brandon Jones <[email protected]> --- diff --git a/src/dawn/native/vulkan/PhysicalDeviceVk.cpp b/src/dawn/native/vulkan/PhysicalDeviceVk.cpp index 0a8b8aa..be51e7b 100644 --- a/src/dawn/native/vulkan/PhysicalDeviceVk.cpp +++ b/src/dawn/native/vulkan/PhysicalDeviceVk.cpp @@ -987,13 +987,14 @@ // because they affect whether or not the MSAARenderToSingleSampled feature is available. // Use dynamic rendering by default if the corresponding extension is available. - // Also disable on older Intel devices and ARM Mali-G68 devices which have been observed to have - // driver issues with the dynamic rendering path. + // Also disable on older Intel devices, ARM Mali-G68 devices, and PowerVR devices, all of which + // have been observed to have driver issues with the dynamic rendering path. if (!GetDeviceInfo().HasExt(DeviceExt::DynamicRendering) || GetDeviceInfo().dynamicRenderingFeatures.dynamicRendering == VK_FALSE || (gpu_info::IsIntel(GetVendorId()) && gpu_info::GetIntelGen(GetVendorId(), GetDeviceId()) <= gpu_info::IntelGen::Gen9) || - (gpu_info::IsARM(GetVendorId()) && gpu_info::IsMaliG68(GetDeviceId()))) { + (gpu_info::IsARM(GetVendorId()) && gpu_info::IsMaliG68(GetDeviceId())) || + gpu_info::IsImgTec(GetVendorId())) { adapterToggles->ForceSet(Toggle::VulkanUseDynamicRendering, false); } else { adapterToggles->Default(Toggle::VulkanUseDynamicRendering, true);
Original Bug Report
A use-after-free in the IMG Vulkan user-mode driver's dynamic-rendering attachment cache reachable from WebGPU
Summary
A use-after-free in the Imagination PowerVR Vulkan user-mode driver’s dynamic-rendering attachment cache is reachable from WebGPU. The driver maintains an LRU cache of render-attachment state keyed on image view handles; when a cached entry is evicted while still referenced by an in-flight render pass, a subsequent render pass reads and writes freed heap memory.
- Attack surface: WebGPU, reachable from an untrusted web page in the default Chrome for Android configuration.
- Impact: Heap use-after-free in the unsandboxed Chrome GPU process.
- Severity: High.
- Mitigation: A Chrome-layer mitigation in Dawn disables the Vulkan dynamic-rendering code path on affected drivers, falling back to explicit render-pass objects, which do not use the vulnerable cache.
Android bug reference: 528137174