
CVE-2026-5281 (Chrome Dawn WebGPU UAF) 분석, 실습 검증 도구, 취약한 빌드와 패치된 빌드에 대한 재현 환경.
이 취약점은 우리가 서비스를 제공하는 고객 중 하나에 영향을 미쳤습니다. 이 저장소는 원래 연구에 대한 우리의 기여입니다. 그룹을 위한 중앙 집중식 출발점으로, 이 구성 요소에 영향을 미치는 유사한 취약점이 다시 나타나면 이미 기반이 마련되어 있도록 합니다. 이 저장소는 버그 뒤에 있는 이론, 원래 연구자의 연구 결과에 대한 문서화된 요약, 그리고 실험실 환경에서 노출을 확인하는 실용적인 도구 세트를 한곳에 모아 놓습니다.
참고: 이 연구의 더 많은 내용을 공유하고 싶지만, 회사 제한으로 인해 더 이상 공개할 수 없습니다. 여기에 포함된 모든 것은 검토되었으며 제가 적용받는 어떤 계약도 위반하지 않습니다. 따라서 저장소는 현재 상태로 보관됩니다.
2026년 4월 1일, Google은 21개의 취약점을 해결하는 Chrome 보안 업데이트를 발표했습니다. 그중 하나인 CVE-2026-5281은 공개 시점에 이미 실제 환경에서 적극적으로 악용되고 있었습니다. 사흘 후, CISA는 이 취약점을 KEV(Known Exploited Vulnerabilities) 카탈로그에 추가하고 연방 기관에 패치를 요구하는 구속력 있는 운영 지시를 발령했습니다. 그 시점에 이미 이 취약점은 우리에게 영향을 미쳤습니다.
이 저장소는 한 가지 이유로 존재합니다. 이런 일이 다시 발생할 때 처음부터 시작하는 대신 출발점을 갖기 위해서입니다. 이 저장소는 다음을 한곳에 모아 둡니다:
취약점이 왜 존재하는지 이해하려면, 그 시스템이 무엇을 하도록 만들어졌고 어떤 가정을 기반으로 설계되었는지에서 출발해야 합니다.
WebGPU는 GPU(Graphics Processing Unit)에서 렌더링 및 계산과 같은 작업을 수행하기 위한 API를 제공합니다. WebGPU는 OpenGL이나 OpenGL ES(Embedded Systems)를 노출하려는 시도가 아닙니다. 이는 Direct3D 12, Metal, Vulkan과 같은 현대 API의 아이디어를 바탕으로 구축된 새로운 API입니다.
WebGPU는 브라우저가 수년간 사용해 온 기존 GPU API인 WebGL을 대체하는 현대적인 API입니다. 핵심 차이점은 WebGPU가 처음부터 안전성과 명시적인 리소스 관리를 염두에 두고 설계되었다는 것입니다. 모든 버퍼, 텍스처, 파이프라인의 수명 주기를 직접 선언해야 합니다. 브라우저는 JavaScript와 GPU 하드웨어 사이에서 검증 계층 역할을 합니다.
이 취약점의 중심에 있는 객체는 생성 순서대로 다음과 같습니다:``` GPUAdapter ← represents a physical GPU or software fallback └─ GPUDevice ← your logical connection to the adapter; owns everything ├─ GPUBuffer ← a chunk of GPU-accessible memory ├─ GPUShaderModule ← a compiled WGSL shader program ├─ GPUComputePipeline ← a shader wired to a pipeline layout ├─ GPUBindGroup ← binds buffers as inputs to a pipeline ├─ GPUCommandEncoder ← records a sequence of GPU commands └─ GPUQueue ← submits recorded commands to hardware
여기서 중요한 규칙: 모든 객체는 GPUDevice가 소유합니다. 해당 버퍼를 참조하는 명령이 디바이스에서 아직 실행 중인 동안 버퍼를 파괴하는 것은 스펙상 명시적으로 금지되어 있습니다. Dawn 구현은 이를 감지하고 거부해야 합니다. CVE-2026-5281은 그렇게 하지 못한 사례입니다.
---
---
---
<div id='whatisdawn'/>
## ***⚙️ Dawn이란 무엇인가?***
- **[Dawn - 오픈소스 WebGPU 구현](https://dawn.googlesource.com/dawn)**
> Dawn은 개발 중인 WebGPU 표준의 오픈소스이자 크로스 플랫폼 구현체입니다. 일부 확장 기능과 함께 WebGPU IDL을 미러링하는 네이티브 C++ API를 제공합니다.
Dawn은 Chrome 내부의 C++ 라이브러리로, WebGPU JavaScript 호출을 플랫폼 네이티브 GPU 명령으로 변환합니다. Windows에서는 D3D12, macOS에서는 Metal, Linux에서는 Vulkan을 대상으로 합니다. Chrome의 JavaScript 엔진과 하드웨어 드라이버 사이에 위치하며, API 호출 검증, 명령 직렬화, 객체 수명 추적, JavaScript로 오류를 다시 전달하는 네 가지 역할을 담당합니다.
CVE-2026-5281은 수명 추적 부분에 존재합니다. 구체적으로는, 해당 버퍼를 참조하는 명령이 하드웨어 큐에서 아직 실행 대기 중인 동안 Dawn이 GPU 버퍼 객체를 얼마나 오래 유지하는지에 관한 것입니다.```
JavaScript (V8)
│ WebGPU API calls
▼
Dawn (C++) - validates, serializes, tracks lifetimes, reports errors
│
▼
D3D12 (Windows) - Metal (macOS) - Vulkan (Linux)
│
▼
GPU hardware driver
│
▼
Physical GPU - shader cores, VRAM
Use-After-Free를 직관적으로 이해하려면 먼저 메모리에서 데이터가 어디에 저장되는지에 대한 명확한 개념이 필요합니다.``` High addresses ┌────────────────────────────────────┐ │ Kernel space │ The OS and drivers live here. │ │ User-mode code cannot touch it. ├────────────────────────────────────┤ │ Stack │ Function call frames. Fast. │ (grows downward) │ Freed automatically when the │ │ function returns. ├────────────────────────────────────┤ │ Heap │ Dynamic allocations - malloc, new, │ (grows upward) │ smart pointers like Ref. │ │ Freed only when you say so. ├────────────────────────────────────┤ │ BSS / Data / Text │ Globals, constants, compiled code. └────────────────────────────────────┘ Low addresses
Dawn의 C++ 객체(예: GPUBuffer를 뒷받침하는 내부 객체)는 힙에 존재합니다. 이들은 참조 카운트 방식으로 관리됩니다. 즉, 스마트 포인터가 객체에 대한 참조를 보유한 대상의 수를 추적합니다. 그 수가 0에 도달하면 소멸자가 실행되고 메모리는 할당자에게 반환됩니다.
GPUBuffer는 동시에 두 가지 표현을 가지는데, 하나는 CPU 측이고 다른 하나는 GPU 측입니다.```
CPU side (Dawn, system RAM)
└─ C++ object - metadata, state flags, and a hardware handle
│
│ handle: ID3D12Resource* (D3D12) - MTLBuffer (Metal) - VkBuffer (Vulkan)
▼
GPU side (driver, VRAM)
└─ Actual memory allocation on the graphics card
JavaScript가 buffer.destroy()를 호출하면 의도된 동작은 객체를 소멸된 것으로 표시하고, 참조 횟수를 줄이고, 하드웨어 핸들을 해제하고, VRAM을 해제하는 것입니다. CVE-2026-5281의 버그는 GPU 명령 큐가 여전히 해당 하드웨어 핸들에 대한 참조를 보유하고 있는 동안 VRAM이 해제되도록 하여, GPU가 더 이상 자신의 것이 아닌 메모리를 적극적으로 읽거나 쓰게 만듭니다.
CWE-416: Use After Free (MITRE)
해제된 메모리를 참조하면 프로그램이 충돌하거나 예기치 않은 값을 사용하거나 코드를 실행할 수 있습니다. 이전에 해제된 메모리를 사용하면 유효한 데이터의 손상부터 임의 코드 실행에 이르기까지 다양한 부정적 결과가 발생할 수 있습니다.
Use-After-Free는 고정된 3단계 패턴을 따르며, 브라우저 보안에서 가장 지속적으로 악용되는 메모리 안전 버그 클래스 중 하나입니다:```
2단계가 끝나면 할당자는 동일한 메모리 영역을 완전히 다른 할당에 넘길 수 있습니다. 공격자가 해제된 영역에 무엇이 들어갈지 제어할 수 있다면(힙 그루밍(heap grooming)이라는 기법), 스테일 포인터가 다시 읽어 들이는 값을 제어할 수 있습니다. 이것이 메모리 안전 버그가 코드 실행으로 이어지는 방식입니다.
GPU 측 UAF는 CPU 측 UAF보다 관찰하기 어렵습니다. 그 이유는 다음과 같습니다.