
Structured vulnerability research repo for a Chrome Dawn WebGPU CWE-20 flaw: root cause, patch diff, static verification, severity review, and security lessons.
This is the work project repository. Investigation, analysis, work, and reports are handled in one repo (D088/D091).
This file is the repository/board entry document. For the full folder and artifact conventions, see
docs/conventions.md. The body (status, conclusions, links) is updated when a report item is promoted. Investigation, analysis, and work agents do not modify the root README.
One-line summary: Google Chrome's WebGPU implementation Dawn did not check the parameter constraints required by the Vulkan specification when creating YCbCr samplers, allowing an attacker who already controlled the renderer process to pass specification-violating values through to the GPU process (CWE-20). The fix added validation and backend enforcement as two layers, and was included in Chrome 150.0.7871.47.
Detailed learning documents are in docs/cve-2026-13934/ — written so that the cause, fix, evidence, and lessons can be followed
without reproduction.
Target: CVE-2026-13934 — Google Chrome / Dawn (WebGPU implementation), vulnerability type
(Improper Input Validation). CVE published 2026-06-30, fixed version .
Basis: §1, §2.
Progress stages — carried out across four tracks: investigation (public information), investigation (patch/diff), analysis (reproduction/demonstration), and reporting (learning summary); all four tracks are complete.
| Track | Status | What was obtained |
|---|---|---|
Public information and impact scope investigation (research/…-6bacf7/) | Complete (4 documents) | CVE, NVD, vendor advisory metadata, CWE/CVSS, affected version boundaries, judgment criteria rulings |
Patch/diff comparison (research/…-diff-92f928/) | Complete (4 documents) | Fixing commit identified, three-tier comparison baseline, changed files/logic delta, bypass/residual risk rulings |
Reproduction/demonstration (cases/…-4d10a8/) | Complete (6 documents) — static comparison performed, no execution-level observation | Root cause structure, exploitability/constraints, static comparison observations of both revisions |
Learning report (reports/…-8400bc/) | Complete (4 documents) | Table of contents/citation map, root README draft, docs/ document list |
What has been confirmed
150.0.7871.47, the fixing commit (Dawn 43055cbe…), and the 3 changed files with the reasons for the changes.cases/20260804-cve-2026-13934-4d10a8/report.md §3).What has not been confirmed yet (not filled in with speculation)
VkSampler parameters, and the VUID reports from the Vulkan validation layers are expected values
based on the code (cases/…-4d10a8/report.md §4).150.0.7871.46, .47, and .63 all pin the same Dawn revision, yet the CVE
says "prior to .47". We could not confirm the basis for this notation.src side was not exhaustively investigated.513006636 containing the root cause is access-restricted.Severity — differs by source. The vendor (Chromium) itself rates it Medium, CISA-ADP's CVSS v3.1 is
9.6 CRITICAL (CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H), and there is no NVD own assessment.
Both are stated side by side without ruling which is correct — the interpretation is in
docs/cve-2026-13934/overview.md.
This repository has no deployed services (APIs, backends, databases, etc.). All artifacts are documents.
The Vulkan specification requires that for samplers with YCbCr conversion, the address mode of all axes is CLAMP_TO_EDGE and
anisotropic filtering is disabled (VUID-VkSamplerCreateInfo-addressModeU-01646). Before the patch, Dawn did not check this
constraint, so specification-violating parameters could pass validation and reach VkSampler creation.
The decisive point is the threat model. The public description assumes an attacker who already controls the renderer process ("a remote attacker who had compromised the renderer process"). From that position, inter-process commands can be manipulated directly rather than going through the normal web API path, so renderer-side validation is outside the trust boundary. And Dawn's Vulkan backend runs in the GPU process, which has higher privileges than the renderer — which is why this flaw becomes a sandbox escape surface.
Basis: cases/20260804-cve-2026-13934-4d10a8/root_cause.md §2 ·
Details: docs/cve-2026-13934/root-cause-and-fix.md
The fixing commit is Dawn 43055cbeadddca41a9c973a809f859d641077b2f ("Add YCbCr sampler validation", 2026-05-27, Bug: 513006636)
and changes three files.
| Change | File | Nature |
|---|---|---|
Adds 4 checks for address mode and maxAnisotropy on YCbCr samplers | src/dawn/native/Sampler.cpp | Frontend validation — rejects violating requests |
| Overwrites address mode and anisotropy with specification-compliant values on paths with YCbCr conversion | src/dawn/native/vulkan/SamplerVk.cpp | Backend enforcement — never creates a violating state regardless of input |
Adds regression test YCbCrSamplerRequiredParams | src/dawn/tests/unittests/validation/YCbCrValidationTests.cpp | Prevents recurrence |
This structure is the core of this CVE. Because the renderer is assumed to be already compromised, validation alone is insufficient; the second layer, which enforces values on the higher-privilege side, is the substantive line of defense. Summarizing this as "input validation was missing, so validation was added" misses the point of the defense design.
The change scale is 53 additions, 0 deletions — a patch that fills in the missing checks without modifying existing logic.
Basis: research/20260804-cve-2026-13934-diff-92f928/report.md §3, §4 ·
cases/20260804-cve-2026-13934-4d10a8/patch_diff.md §4
We compared the source of the two Dawn snapshots actually pinned by Chrome.
| Observation target | Vulnerable side 54b4153c… | Fixed side 01249a97… | Verification level |
|---|---|---|---|
Number of DAWN_INVALID_IF in the YCbCr validation block | 2 (feature gate + undefined format) | 6 | Measured |
| Specification-compliant value enforcement in the Vulkan backend | None (down to pNext chaining) | Present | Measured |
Regression test YCbCrSamplerRequiredParams | None (TEST_F 23) | Present (24) | Measured |
| Device error on violating request | Does not occur | Occurs | Expected (code-based) |
What this revealed: the vulnerable side also already had a YCbCr branch and 2 checks. The flaw was not a missing path but a missing conditional-constraint check inside the branch.
Since we did not build or run, the two items below are expected values based on the code, not measurements.
Basis: cases/20260804-cve-2026-13934-4d10a8/report.md §1–§4 ·
Details: docs/cve-2026-13934/evidence.md
From a security design perspective
From an investigation methodology perspective
DEPS → searching the component commit log for the bug number.
Procedure: research/20260804-cve-2026-13934-diff-92f928/sources.md §6.Details: docs/cve-2026-13934/lessons.md
docs/)| Document | Contents |
|---|---|
docs/cve-2026-13934/overview.md | Overview, background, conclusion summary, severity interpretation |
docs/cve-2026-13934/root-cause-and-fix.md | Three-tier root cause structure and the patch's two layers |
docs/cve-2026-13934/evidence.md | Static comparison observations, observation paths, and limitations |
docs/cve-2026-13934/lessons.md | Security design and investigation methodology lessons |
docs/cve-2026-13934/limits-and-sources.md | Limitations, unconfirmed items, and source list |
docs/conventions.md | Folder/artifact conventions (full text) |
research/20260804-cve-2026-13934-6bacf7/)| Document | Contents |
|---|---|
brief.md | Original request text, judgment criteria C1–C6, definition of official sources |
sources.md | CVE, NVD, vendor advisory metadata, CWE/CVSS, conflicts between sources |
report.md | Impact, CVSS, and vulnerability-condition rulings, C1–C6 rulings, severity interpretation |
followups.json | Follow-up suggestions |
research/20260804-cve-2026-13934-diff-92f928/)| Document | Contents |
|---|---|
brief.md | Objective, judgment criteria D1–D6, baseline patch tree |
sources.md | Fixing commit and comparison baseline pair, DEPS/Gerrit, tracing procedure |
report.md | Changed files, logic delta, bypass/residual risk rulings, D1–D6 |
followups.json | Follow-up suggestions |
cases/20260804-cve-2026-13934-4d10a8/)| Document | Contents |
|---|---|
intake.md | Intake metadata, target/version scope, start conditions, isolation requirements, judgment criteria J1–J4 |
patch_diff.md | Changes and reasons, observation indicators before/after the patch |
root_cause.md | Core three-tier root cause structure, premises P1–P7, trust boundary |
exploitability.md | Demonstrable/not-demonstrable classification, observation paths, constraints, containment boundaries |
report.md | Reproduction verification synthesis — static comparison observations, before/after differences, J1–J4 rulings |
followups.json | Follow-up suggestions |
reports/20260804-cve-2026-13934-8400bc/)| Document | Contents |
|---|---|
outline.md | Audience, table of contents, source citation map (S1–S15) |
README.md | Draft source for promotion to this root README |
docs-index.md | docs/ document list and summary, promotion notes |
followups.json | Follow-up suggestions |
https://www.cve.org/CVERecord?id=CVE-2026-13934https://nvd.nist.gov/vuln/detail/CVE-2026-13934https://dawn.googlesource.com/dawn/+/43055cbeadddca41a9c973a809f859d641077b2fThe full list with publication dates and identifiers is in the sources.md files of the two investigation tracks.
| Type | Root |
|---|---|
| Investigation | research/ |
| Analysis | cases/ |
| Work | work/ |
| Reports | reports/ |
Periodic collection: research/topics/<topic>/
research/ · cases/ · work/ · reports/ · docs/ · .laurelin/ · .github/docs/conventions.md