
Structured vulnerability research repo for a Chrome Dawn WebGPU CWE-20 flaw: root cause, patch diff, static verification, severity review, and security lessons.
작업 프로젝트 저장소입니다. 조사·분석·작업·보고서를 한 레포에서 다룹니다 (D088/D091).
이 파일은 레포·보드 진입 문서입니다. 폴더·산출물 규약 전문은
docs/conventions.md를 보세요. 본문(현황·결론·링크)은 보고서(report) 항목이 승격할 때 갱신합니다. 조사·분석·작업 에이전트는 루트 README를 수정하지 않습니다.
한 줄 요약: Google Chrome의 WebGPU 구현체 Dawn이 YCbCr 샘플러 생성 시 Vulkan 규격이 요구하는 파라미터 제약을 검사하지 않아, 이미 렌더러 프로세스를 장악한 공격자가 규격 위반 값을 GPU 프로세스까지 흘려보낼 수 있었던 문제입니다(CWE-20). 수정은 검증 추가와 백엔드 강제를 두 겹으로 넣었고, Chrome 150.0.7871.47에서 반영되었습니다.
상세 학습 문서는 docs/cve-2026-13934/에 있습니다 — 원인·수정·실증·교훈을
재현 없이 따라갈 수 있게 썼습니다.
대상: CVE-2026-13934 — Google Chrome / Dawn (WebGPU 구현), 취약 유형 CWE-20
(Improper Input Validation). CVE 발행 2026-06-30, 수정 버전 150.0.7871.47.
근거: research/20260804-cve-2026-13934-6bacf7/sources.md §1·§2.
진행 단계 — 조사(공개 정보) · 조사(패치·diff) · 분석(재현·실증) · 보고(학습 정리) 네 라인으로 진행했고, 네 라인 모두 완료했습니다.
확인된 것
150.0.7871.47과 수정 커밋(Dawn 43055cbe…), 변경된 파일 3개와 변경 이유.cases/20260804-cve-2026-13934-4d10a8/report.md §3).아직 확인되지 않은 것 (추정으로 메우지 않았습니다)
VkSampler 파라미터, Vulkan 검증 레이어의 VUID 보고는 코드
근거에 기반한 예상값입니다 (cases/…-4d10a8/report.md §4).150.0.7871.46·.47·.63이 모두 동일한 Dawn 리비전을
고정하는데 CVE는 "prior to .47"로 적습니다. 이 표기의 근거를 확인하지 못했습니다.src 측
동반 변경 여부는 전수 조사하지 않았습니다.513006636은 접근 제한 상태입니다.심각도 — 출처마다 다릅니다. 벤더(Chromium) 자체 등급은 Medium, CISA-ADP의 CVSS v3.1은
9.6 CRITICAL(CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H)이며 NVD 자체 평가는 없습니다.
어느 쪽이 옳다고 판정하지 않고 병기합니다 — 해석은
docs/cve-2026-13934/overview.md에 있습니다.
이 저장소에는 배포된 서비스(API·백엔드·데이터베이스 등)가 없습니다. 모든 산출물은 문서입니다.
Vulkan 규격은 YCbCr 변환이 붙은 샘플러에 대해 모든 축의 주소 모드가 CLAMP_TO_EDGE이고
비등방 필터링(anisotropy)이 비활성일 것을 요구합니다
(VUID-VkSamplerCreateInfo-addressModeU-01646). 패치 이전 Dawn은 이 제약을 검사하지 않았고,
그래서 규격을 위반하는 파라미터가 검증을 통과해 VkSampler 생성까지 도달할 수 있었습니다.
결정적인 것은 위협 모델입니다. 공개 설명은 공격자가 렌더러 프로세스를 이미 장악한 상태를 전제합니다("a remote attacker who had compromised the renderer process"). 그 위치에서는 정상 웹 API 경로가 아니라 프로세스 간 명령을 직접 조작할 수 있으므로, 렌더러 쪽 검증은 신뢰 경계 밖입니다. 그리고 Dawn의 Vulkan 백엔드는 렌더러보다 권한이 높은 GPU 프로세스에서 동작합니다 — 그래서 이 결함이 샌드박스 탈출 표면이 됩니다.
근거: cases/20260804-cve-2026-13934-4d10a8/root_cause.md §2 ·
상세: docs/cve-2026-13934/root-cause-and-fix.md
수정 커밋은 Dawn 43055cbeadddca41a9c973a809f859d641077b2f
("Add YCbCr sampler validation", 2026-05-27, Bug: 513006636)이며 세 파일을 바꿉니다.
이 구조가 이 CVE의 핵심입니다. 렌더러가 이미 침해된 것을 전제하므로 검증만으로는 부족하고, 권한이 높은 쪽에서 값을 강제하는 두 번째 겹이 실질적인 차단선입니다. "입력 검증이 빠져서 검증을 추가했다"로 요약하면 방어 설계의 요점을 놓칩니다.
변경 규모는 추가 53행, 삭제 0행 — 기존 로직을 고치지 않고 빠진 검사를 채운 패치입니다.
근거: research/20260804-cve-2026-13934-diff-92f928/report.md §3·§4 ·
cases/20260804-cve-2026-13934-4d10a8/patch_diff.md §4
Chrome이 실제로 고정한 두 Dawn 스냅샷의 소스를 대조했습니다.
여기서 드러난 것: 취약 측에도 YCbCr 분기와 검사 2건이 이미 있었습니다. 결함은 경로 누락이 아니라 분기 안의 조건부 제약 검사 누락이었습니다.
빌드·실행은 하지 않았으므로 아래 두 항목은 코드 근거에 기반한 예상이며 실측이 아닙니다.
근거: cases/20260804-cve-2026-13934-4d10a8/report.md §1~§4 ·
상세: docs/cve-2026-13934/evidence.md
보안 설계 관점
조사 방법 관점
DEPS의 컴포넌트 리비전 → 컴포넌트 커밋 로그에서 버그 번호 검색으로 수정 커밋을
찾았습니다. 절차: research/20260804-cve-2026-13934-diff-92f928/sources.md §6.상세: docs/cve-2026-13934/lessons.md
docs/)research/20260804-cve-2026-13934-6bacf7/)research/20260804-cve-2026-13934-diff-92f928/)cases/20260804-cve-2026-13934-4d10a8/)reports/20260804-cve-2026-13934-8400bc/)https://www.cve.org/CVERecord?id=CVE-2026-13934https://nvd.nist.gov/vuln/detail/CVE-2026-13934https://dawn.googlesource.com/dawn/+/43055cbeadddca41a9c973a809f859d641077b2f전체 목록과 발행일·식별자는 두 조사 라인의 sources.md에 있습니다.
| 유형 | 루트 |
|---|---|
| 조사 | research/ |
| 분석 | cases/ |
| 작업 | work/ |
| 보고서 | reports/ |
정기 수집: research/topics/<topic>/
research/ · cases/ · work/ · reports/ · docs/ · .laurelin/ · .github/docs/conventions.md| 라인 | 상태 | 확보한 것 |
|---|
공개 정보·영향 범위 조사 (research/…-6bacf7/) | 완료 (4문서) | CVE·NVD·벤더 공지 메타데이터, CWE·CVSS, 영향 버전 경계, 판단 기준 판정 |
패치·diff 비교 (research/…-diff-92f928/) | 완료 (4문서) | 수정 커밋 특정, 비교 기준 3층위, 변경 파일·로직 델타, 우회·잔존 위험 판정 |
재현·실증 (cases/…-4d10a8/) | 완료 (6문서) — 정적 대조 수행, 실행 수준 미관찰 | 원인 구조, 실행 가능성·제약, 두 리비전 정적 대조 관찰값 |
학습 보고서 (reports/…-8400bc/) | 완료 (4문서) | 목차·인용 지도, 루트 README 초안, docs/ 문서 목록 |
| 변경 | 파일 | 성격 |
|---|
YCbCr 서술자에 주소 모드·maxAnisotropy 검사 4건 추가 | src/dawn/native/Sampler.cpp | 프론트엔드 검증 — 위반 요청을 거부 |
| YCbCr 변환이 붙는 경로에서 주소 모드·anisotropy를 규격 준수 값으로 덮어쓰기 | src/dawn/native/vulkan/SamplerVk.cpp | 백엔드 강제 — 입력이 무엇이든 위반 상태를 만들지 않음 |
회귀 테스트 YCbCrSamplerRequiredParams 추가 | src/dawn/tests/unittests/validation/YCbCrValidationTests.cpp | 재발 방지 |
| 관찰 대상 | 취약 측 54b4153c… | 수정 측 01249a97… | 확인 수준 |
|---|
YCbCr 검증 블록의 DAWN_INVALID_IF 수 | 2건 (기능 게이트 + 포맷 미정의) | 6건 | 실측 |
| Vulkan 백엔드의 규격 준수 값 강제 | 없음 (pNext 연결까지) | 있음 | 실측 |
회귀 테스트 YCbCrSamplerRequiredParams | 없음 (TEST_F 23개) | 있음 (24개) | 실측 |
| 위반 요청 시 device error | 발생하지 않음 | 발생 | 예상 (코드 근거) |
| 문서 | 내용 |
|---|
docs/cve-2026-13934/overview.md | 개요·배경·결론 요약, 심각도 해석 |
docs/cve-2026-13934/root-cause-and-fix.md | 원인 3층 구조와 패치의 두 계층 |
docs/cve-2026-13934/evidence.md | 정적 대조 관찰값, 관찰 경로와 한계 |
docs/cve-2026-13934/lessons.md | 보안 설계·조사 방법 교훈 |
docs/cve-2026-13934/limits-and-sources.md | 한계·미확인 항목과 출처 목록 |
docs/conventions.md | 폴더·산출물 규약 (전문) |
| 문서 | 내용 |
|---|
brief.md | 의뢰 원문, 판단 기준 C1~C6, 공식 출처 정의 |
sources.md | CVE·NVD·벤더 공지 메타데이터, CWE·CVSS, 출처 간 상충 |
report.md | 영향·CVSS·취약 조건 판정, C1~C6 판정, 심각도 해석 |
followups.json | 후속 제안 |
| 문서 | 내용 |
|---|
brief.md | 목표, 판단 기준 D1~D6, 기준 패치 트리 |
sources.md | 수정 커밋·비교 기준 쌍, DEPS·Gerrit, 추적 절차 |
report.md | 변경 파일·로직 델타·우회/잔존 위험 판정, D1~D6 |
followups.json | 후속 제안 |
| 문서 | 내용 |
|---|
intake.md | 접수 메타, 대상·버전 범위, 착수 조건, 격리 요건, 판단 기준 J1~J4 |
patch_diff.md | 변경점·변경 이유, 패치 전후 관찰 지표 |
root_cause.md | 핵심 원인 3층 구조, 전제 P1~P7, 신뢰 경계 |
exploitability.md | 실증 가능/불가 구분, 관찰 경로, 제약, 확산 방지 경계 |
report.md | 재현 검증 종합 — 정적 대조 관찰값, 전후 차이, J1~J4 판정 |
followups.json | 후속 제안 |
| 문서 | 내용 |
|---|
outline.md | 독자·목차·출처 인용 지도(S1~S15) |
README.md | 이 루트 README의 승격 원본 초안 |
docs-index.md | docs/ 문서 목록·요약, 승격 유의 사항 |
followups.json | 후속 제안 |