
CVE-2026-5281 (Chrome Dawn WebGPU UAF) Analyse, Laborvalidierungstools und reproduzierbare Umgebung für verwundbare vs. gepatchte Builds.
Diese Sicherheitslücke hat einen unserer Kunden betroffen, dem wir Dienstleistungen anbieten. Dieses Repository ist unser Beitrag zur ursprünglichen Forschung: ein zentraler Ausgangspunkt für das Team, sodass wir, falls eine ähnliche Schwachstelle in dieser Komponente erneut auftritt, bereits die Grundlage gelegt haben. Es vereint die Theorie hinter dem Fehler, eine dokumentierte Zusammenfassung der Ergebnisse des ursprünglichen Forschers und eine Reihe praktischer Werkzeuge, um die Gefährdung in einer Laborumgebung zu überprüfen.
Hinweis: Ich hätte gerne mehr dieser Forschung geteilt, aber aufgrund von Unternehmensbeschränkungen kann ich keine weiteren Details offenlegen. Alles hier Enthaltene wurde überprüft und verstößt nicht gegen irgendwelche Vereinbarungen, denen ich unterliege. Das Repository wird daher in seinem aktuellen Zustand archiviert.
Am 1. April 2026 veröffentlichte Google ein Chrome-Sicherheitsupdate, das 21 Schwachstellen behob, von denen eine, CVE-2026-5281, zum Zeitpunkt der Offenlegung bereits aktiv im Internet ausgenutzt wurde. Drei Tage später fügte CISA sie dem Katalog bekannter ausgenutzter Schwachstellen hinzu und erließ eine verbindliche operative Anweisung, die Bundesbehörden zum Patchen verpflichtete. Zu diesem Zeitpunkt hatte sie uns bereits getroffen.
Dieses Repository existiert aus einem Grund: damit wir beim nächsten Mal, wenn so etwas passiert, einen Ausgangspunkt haben, anstatt bei Null anfangen zu müssen. Es vereint:
Wenn Sie verstehen wollen, warum eine Sicherheitslücke existiert, beginnen Sie damit, wofür das System entwickelt wurde und welche Annahmen ihm zugrunde liegen.
WebGPU stellt eine API für die Durchführung von Operationen wie Rendering und Berechnung auf einer Grafikverarbeitungseinheit bereit. WebGPU ist kein Versuch, OpenGL oder OpenGL ES (Embedded Systems) bereitzustellen. Es ist eine neue API, die auf den Ideen moderner APIs wie Direct3D 12, Metal und Vulkan aufbaut.
WebGPU ist der moderne Ersatz für WebGL, die alte GPU-API, die Browser seit Jahren verwenden. Der Hauptunterschied besteht darin, dass WebGPU von Grund auf für Sicherheit und explizite Ressourcenverwaltung ausgelegt wurde. Sie deklarieren den Lebenszyklus jedes Puffers, jeder Textur und jeder Pipeline selbst. Der Browser fungiert als Validierungsschicht zwischen Ihrem JavaScript und der GPU-Hardware.
Die Objekte im Zentrum dieser Sicherheitslücke, in der Reihenfolge ihrer Erstellung:``` 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
Die Regel, die hier zählt: Jedes Objekt gehört dem GPUDevice. Das Zerstören eines Puffers, während das Gerät noch Befehle ausführt, die darauf verweisen, ist laut Spezifikation ausdrücklich illegal. Die Dawn-Implementierung soll dies erkennen und ablehnen. CVE-2026-5281 ist ein Fall, in dem sie es nicht tat.
---
---
---
<div id='whatisdawn'/>
## ***⚙️ Was ist Dawn?***
- **[Dawn - Open-Source WebGPU Implementation](https://dawn.googlesource.com/dawn)**
> Dawn ist eine quelloffene und plattformübergreifende Implementierung des in Arbeit befindlichen WebGPU-Standards. Sie stellt eine native C++-API bereit, die das WebGPU-IDL mit einigen Erweiterungen abbildet.
Dawn ist die C++-Bibliothek in Chrome, die WebGPU-JavaScript-Aufrufe in plattformnative GPU-Befehle übersetzt. Unter Windows zielt sie auf D3D12, unter macOS auf Metal und unter Linux auf Vulkan. Sie sitzt zwischen der JavaScript-Engine von Chrome und dem Hardwaretreiber und ist für vier Dinge zuständig: Validieren von API-Aufrufen, Serialisieren von Befehlen, Verfolgen von Objektlebensdauern und Melden von Fehlern zurück an JavaScript.
CVE-2026-5281 befindet sich im Teil der Lebensdauerverfolgung. Genauer gesagt darin, wie lange Dawn GPU-Pufferobjekte am Leben hält, während Befehle, die auf sie verweisen, noch auf der Hardware-Warteschlange auf ihre Ausführung warten.```
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
Sie benötigen ein klares mentales Modell davon, wo Dinge im Speicher leben, bevor eine Use-After-Free intuitiv verständlich wird.``` 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
Dawns C++-Objekte, wie das interne Objekt eines GPUBuffers, befinden sich auf dem Heap. Sie sind referenzgezählt: Ein Smart Pointer zählt, wie viele Referenzen auf das Objekt gehalten werden. Wenn dieser Zähler Null erreicht, wird der Destruktor ausgeführt und der Speicher an den Allokator zurückgegeben.
Ein GPUBuffer hat gleichzeitig zwei Darstellungen, eine auf der CPU-Seite und eine auf der GPU-Seite:```
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
Wenn JavaScript buffer.destroy() aufruft, ist das beabsichtigte Verhalten: das Objekt als zerstört markieren, den Referenzzähler dekrementieren, das Hardware-Handle freigeben und den VRAM freigeben. Der Fehler in CVE-2026-5281 führt dazu, dass der VRAM freigegeben wird, während die GPU-Befehlswarteschlange noch eine Referenz auf dieses Hardware-Handle hält, was bedeutet, dass die GPU aktiv Speicher liest oder schreibt, der nicht mehr zu ihr gehört.
CWE-416: Use After Free (MITRE)
Der Zugriff auf Speicher, nachdem er freigegeben wurde, kann dazu führen, dass ein Programm abstürzt, unerwartete Werte verwendet oder Code ausführt. Die Nutzung von zuvor freigegebenem Speicher kann eine Vielzahl negativer Konsequenzen haben, von der Korruption gültiger Daten bis hin zur Ausführung beliebigen Codes.
Ein Use-After-Free folgt einem festen Drei-Schritte-Muster und ist eine der regelmäßig ausgenutzten Speichersicherheitsfehlerklassen in der Browsersicherheit:```
Nach Schritt 2 kann der Allokator dieselbe Speicherregion einer völlig anderen Allokation zuweisen. Wenn ein Angreifer kontrollieren kann, was in diese freigegebene Region gelegt wird – eine Technik namens Heap Grooming –, kann er kontrollieren, was der veraltete Zeiger zurückliest. So wird ein Memory-Safety-Fehler zur Codeausführung.
GPU-seitiger UAF ist schwieriger zu beobachten als CPU-seitiger UAF, weil:
- Der "Allokator" ist der VRAM-Allokator des GPU-Treibers, nicht der systemische malloc.
- Der "veraltete Zeiger" ist ein Hardware-Handle, der immer noch von der Befehlswarteschlange referenziert wird.
- Die GPU führt Befehle asynchron aus, die CPU ist schon lange vor dem Auftreten des Absturzes weitergezogen.
---
---
---
<div id='thevulnerability'/>
## ***🕳️ Die Schwachstelle***
---
<div id='thevulnerability-whatweknow'/>
### ***📋 Was wir aus öffentlichen Quellen wissen***
Das Folgende beruht vollständig auf dem, was öffentlich bestätigt wurde.
- **[NVD: CVE-2026-5281](https://nvd.nist.gov/vuln/detail/CVE-2026-5281)**
> Use-After-Free in Dawn in Google Chrome vor 146.0.7680.178 erlaubte es einem entfernten Angreifer, der den Renderer-Prozess kompromittiert hatte, beliebigen Code über eine präparierte HTML-Seite auszuführen.
- **[The Hacker News: 1. April 2026](https://thehackernews.com/2026/04/new-chrome-zero-day-cve-2026-5281-under.html)**
> Google ist bekannt, dass ein Exploit für CVE-2026-5281 im Umlauf ist.
- **[Help Net Security: 1. April 2026](https://www.helpnetsecurity.com/2026/04/01/google-chrome-zero-day-cve-2026-5281/)**
> CVE-2026-5281 wurde von einem pseudonymen Bug-Hunter (86ac1f1587b71893ed2ad792cd7dde32) gemeldet, der zuvor zwei Schwachstellen gemeldet hatte, die im Chrome-Update vom 23. März 2026 behoben wurden: einen Heap-Buffer-Overflow in WebGL (CVE-2026-4675) und einen weiteren Use-After-Free-Fehler in Dawn (CVE-2026-4676). Der Bug-Hunter meldete außerdem einen dritten Use-After-Free in Dawn (CVE-2026-5284), der dieses Mal behoben wurde.
---
<div id='thevulnerability-executionlayers'/>
### ***🔗 Von JavaScript zur Hardware***
Um zu verstehen, wo ein UAF in Dawn entstehen kann, hilft es, genau zu sehen, wie ein WebGPU-Aufruf von einer JavaScript-Zeile bis zur physischen Hardware reist:```
JavaScript
↓ navigator.gpu → adapter → device → buffer / pipeline / encoder
↓ queue.submit([commandBuffer]) ← validation happens here
↓ buffer.destroy() ← if this races GPU execution, UAF
Dawn (C++) - validates API calls, serializes commands, tracks lifetimes
↓ translates WebGPU calls to platform-native API calls
D3D12 (Windows)
↓ ID3D12CommandQueue::ExecuteCommandLists()
↓ hardware handle for the buffer passed to the driver
GPU hardware
↓ shader cores execute the queued commands
↓ if the buffer was freed prematurely → they access freed VRAM ← UAF
Die grundlegende Spannung besteht darin, dass queue.submit() und buffer.destroy() beide JavaScript-API-Aufrufe sind, die sofort zurückkehren, aber die GPU die übermittelten Befehle asynchron ausführt, möglicherweise lange nachdem beide Aufrufe zurückgekehrt sind. Dawn muss Pufferobjekte während der gesamten Dauer der GPU-Ausführung lebendig halten, nicht nur bis zum Zeitpunkt der Rückkehr des JavaScript-Aufrufs.
Wenn der UAF ausgelöst wird, erreicht die GPU ein Ereignis, das D3D12 als "Device Removed" bezeichnet. Die Sequenz ist:```
Das erkennt auch der automatisierte Testrunner in diesem Repository: Er überwacht genau diese Konsolensignale, um festzustellen, ob die Schwachstelle in einer bestimmten Chrome-Version auslösbar ist.
---
<div id='thevulnerability-impact'/>
### ***💥 Auswirkungen und Anforderungen an die Ausnutzung***
Die NVD-Beschreibung ist präzise hinsichtlich einer wichtigen Einschränkung: Die Ausnutzung erfordert, dass der Angreifer den Renderer-Prozess bereits kompromittiert hat. Das bedeutet, CVE-2026-5281 ist keine eigenständige RCE mit einem Klick aus dem kalten Start, sondern eine Sandbox-Escape, die Teil einer Kette wird.
In der Praxis würde eine vollständige Angriffskette etwa so aussehen:```
Initial access ← some other vulnerability gets code running in the renderer
↓
CVE-2026-5281 ← UAF in Dawn used to escape the renderer sandbox
↓
Arbitrary code ← execution in a higher-privilege Chrome process or OS context
Dies ist genau das Ausbeutungsmodell, das GPU-Fehler im Browser so wertvoll macht: Sobald man sich im Renderer befindet, ist Dawn eines der natürlichen nächsten Ziele, da es hardwarenahen Speicher mit einer solchen asynchronen Komplexität verwaltet, die diese Timing-Fenster erzeugt.
Der bestätigte Schweregrad zum Zeitpunkt der Offenlegung war die Ausführung beliebigen Codes, und die Vulners-Datenbank verzeichnet Datenkorruption und Browser-Abstürze als weitere beobachtete Auswirkungen.
CVE-2026-5281 trat nicht isoliert auf. Es war der vierte Chrome Zero-Day des Jahres 2026, ein Jahr, das bereits vor Ende des ersten Quartals auf dem besten Weg war, die Gesamtzahl von acht Zero-Days im Jahr 2025 zu übertreffen.
| Datum | Ereignis |
|---|---|
| Februar 2026 | CVE-2026-2441 gepatcht, UAF in Chromes CSS-Komponente, aktiv ausgenutzt |
| 10. März 2026 | CVE-2026-3909 und CVE-2026-3910 gepatcht, beide aktiv ausgenutzte Zero-Days |
| 23. März 2026 | CVE-2026-4675 (WebGL-Heap-Pufferüberlauf) und CVE-2026-4676 (UAF in Dawn) gepatcht, gleicher Melder wie CVE-2026-5281 |
| 1. April 2026 | Google veröffentlicht Chrome 146.0.7680.177/178, 21 Schwachstellen gepatcht, CVE-2026-5281 als in freier Wildbahn ausgenutzt bestätigt |
| 1. April 2026 | CISA nimmt CVE-2026-5281 in den Katalog bekannter ausgenutzter Schwachstellen auf |
| 3. April 2026 | Google bestätigt aktive Ausnutzung gegen 3,5 Milliarden Chrome-Nutzer |
Derselbe pseudonyme Forscher, der CVE-2026-5281 meldete, meldete auch drei weitere Schwachstellen im nahen Zeitfenster (CVE-2026-4675, CVE-2026-4676, CVE-2026-5284, die letzten beiden ebenfalls UAFs in Dawn). Dies deutet auf einen fokussierten, laufenden Forschungsaufwand hin, der speziell auf das Speichermanagement von Dawn abzielt.
Das Toolkit in diesem Repository wurde aufbauend auf ursprüngliche Sicherheitsforschung erstellt, die das Verhalten der Schwachstelle in einer Laborumgebung dokumentiert. Es folgt eine Zusammenfassung dieser Forschung, der verwendeten Strategie zur Auslösung des UAF und der beobachteten Ergebnisse.
Der Ansatz des Forschers zur Auslösung des UAF wurde entwickelt, um gleichzeitig die drei Bedingungen zu erfüllen, die das Wettlauf-Fenster erreichbar machen: ausreichend GPU-Warteschlangendruck zur Verzögerung der Ausführung, enge genug Timing zwischen destroy und dispatch, und Pufferneuzuweisung gleicher Größe zur Maximierung der Wahrscheinlichkeit beobachtbarer Korruption.
Die Strategie gliedert sich in fünf Schritte:
Schritt 1 - Volumen und Druck: 200 temporäre WebGPU-Speicherpuffer mit zufälligen Größen (alle Vielfache von 4 Bytes, wie von der WebGPU-Spezifikation gefordert) allokiert. Dies dient nicht dem Füllen des VRAM, sondern der Erzeugung von genügend ausstehender Arbeit, sodass die GPU die Befehle nicht sofort ausführen kann.
Schritt 2 - Rechen-Thread-Sättigung: 32 parallele Compute-Pipelines mit schweren Arbeitslasten in die Warteschlange gestellt, innere Schleifen mit 1000 Iterationen und Dispatch-Größen von 4096 Arbeitsgruppen. Ziel ist es, die GPU-Warteschlange tief zu stauen, sodass das Fenster zwischen Submit und Ausführung lange genug offen bleibt, um einen Wettlauf zu ermöglichen.
Schritt 3 - Die Falle: Unmittelbar nach dem Einreihen aller Befehlspuffer wird destroy() auf allen 200 Puffern aufgerufen. Zu diesem Zeitpunkt hat die GPU die Befehle erhalten, aber noch nicht ausgeführt. Dawn hat seine Submit-Zeit-Validierung bereits bestanden. Der VRAM wird freigegeben.
Schritt 4 - Der Auslöser: 32 neue Pufferallokationen unter Verwendung exakt derselben Größen wie die gerade freigegebenen Puffer. Wenn der VRAM-Allokator dieselben physischen Adressen zurückgibt, was aufgrund der übereinstimmenden Größen oft der Fall sein wird, zeigen die ausstehenden Befehle der GPU nun auf einen Hardware-Handle, der auf Speicher verweist, der zu einer anderen, lebenden Allokation gehört.
Schritt 5 - Wiederverwendung übermittelter Befehle: Eine weitere Runde von Befehlspuffer-Übermittlungen unter Verwendung der neu allokierten Puffer. Zu diesem Zeitpunkt befinden sich zwei Sätze von Befehlen in der Warteschlange, die auf denselben Speicher verweisen, während die GPU immer noch den ersten Satz abarbeitet.
Das Ergebnis ist ein klassischer UAF auf der VRAM-Ebene: Freigegebener Speicher wird aktiv von laufender Shader-Ausführung gelesen.
Der Forscher führte den PoC sowohl auf einer verwundbaren als auch auf einer gepatchten Chrome-Installation aus und beobachtete eine klare verhaltensbezogene Trennung:
Verwundbarer Lauf (Chrome < 146.0.7680.178):``` [INFO] CVE-2026-5281 AGGRESSIVE PoC Loaded [INFO] Initializing WebGPU context... [INFO] WebGPU device initialized [INFO] Starting aggressive UAF attacks... [ERROR] UNCAUGHT GPU ERROR: device lost due to internal error [CRASH] GPU DEVICE LOST: destroyed [CRASH] [!!!] CRASH DETECTED! Check console for details.
Der gezielte Chrome-Prozess stellte die Darstellung vollständig ein. Das Betriebssystem erlebte kurzzeitiges visuelles Einfrieren, was darauf hindeutet, dass der Grafiktreiber nach dem GPU-Fehler zurückgesetzt werden musste oder die Verarbeitung anhielt. Das device lost-Ereignis wurde einem fatalen GPU-Fehler zugeordnet, nicht einem standardmäßigen WebGPU-API-Validierungsfehler. Dies bestätigt, dass das beschädigte Speicherlayout die Hardware-Ebene erreichte, ohne von der JavaScript-seitigen Sandboxing von Chrome abgefangen zu werden.
**Gepatchter Durchlauf (Chrome >= 146.0.7680.178):**```
[INFO] CVE-2026-5281 AGGRESSIVE PoC Loaded
[INFO] Initializing WebGPU context...
[INFO] WebGPU device initialized
[INFO] Starting aggressive UAF attacks...
[INFO] Max attempts reached without crash
[INFO] Either browser is patched or target build not affected
Kein Absturz, kein Geräteverlust, keine fatalen GPU-Signale bei allen Versuchen. Der Fix hält.
Die folgenden Aufnahmen wurden während der Labortests des Toolkits gegen eine verwundbare und eine gepatchte Chrome-for-Testing-Installation auf einem Windows-Rechner mit einer Intel-Gen12lp-integrierten GPU erstellt. Jedes Tool wurde gegen beide Ziele ausgeführt, um die Verhaltensunterschiede zu überprüfen.
01 - Versionserkennung
| Verwundbar (< 146.0.7680.178) | Gepatcht (>= 146.0.7680.178) |
|---|---|
![]() |
![]() |
02 - Schwachstellenprüfer
| Verwundbar | Gepatcht |
|---|---|
![]() | ![]() |
03 - Lokaler Scanner
| Verwundbar | Gepatcht |
|---|---|
![]() | ![]() |
04 - Fleet-Scanner
| Verwundbar | Gepatcht |
|---|---|
![]() | ![]() |
05 - UAF-Trigger
| Chrome | Firefox |
|---|---|
![]() | ![]() |
Firefox dient dem Vergleich. Firefox verwendet seine eigene WebGPU-Implementierung und ist von dieser Schwachstelle nicht betroffen. Es schließt alle Versuche unabhängig von der Version ohne Absturzsignal ab, was dem erwarteten Verhalten entspricht.
06 - UAF-Trigger + Automatisierter Runner
| GPU-Gerät verloren |
|---|
![]() |
Ein sichtbares Absturzsignal zu erhalten, ist nicht immer einfach. Abhängig von Hardware und Umgebung kann der Trigger eine gewisse Feinabstimmung erfordern, um beobachtbare Ergebnisse zu erzielen. In unserem Fall war das Verhalten reproduzierbar, aber ohne Anpassung der Arbeitslast nicht konsistent sichtbar.
Wir haben in einer kontrollierten Laborumgebung erfolgreich einen Denial-of-Service gegen eine verwundbare Chrome-Installation reproduziert. Der UAF-Trigger führt dazu, dass die GPU zu 100 % ausgelastet wird, da die stark zurückgestaute Befehlswarteschlange den Treiber daran hindert, neue Speicherverwaltungsanfragen zu bedienen. Bei einigen Durchläufen geriet der GPU-Prozess in einen nicht behebbaren Fehlerzustand, der folgende beobachtbare Effekte verursachte:
Die GPU-Sättigung und die gelegentliche Ausnahme bestätigen, dass der Speicherfehler die Hardwareebene erreicht: Das freigegebene Pufferhandle wird von der laufenden Shader-Ausführung angesprochen, die GPU stürzt ab, und D3D12s TDR-Mechanismus gibt dies als Geräteentfernungsereignis aus. Die gepatchte Version hat die gleiche Arbeitslast sauber und ohne jegliches Absturzsignal abgeschlossen.
Die DoS-Reproduktion bestätigt die Schwachstelle. Die laufenden Arbeiten konzentrieren sich auf die Analyse des Patches auf Binärebene, insbesondere auf das Diffing des Dawn-Befehlsbuffer-Übergabepfads zwischen dem letzten verwundbaren Build und 146.0.7680.178, um genau zu verstehen, wo und wie der Fix zur Referenzzählung angewendet wurde.
Betreffend den automatisierten Runner: Der ursprüngliche Forscher veröffentlichte ein Runner-Skript zusammen mit seinem PoC. Unsere Version erforderte Änderungen, um in einem lokalen Laborkontext zuverlässig zu funktionieren, insbesondere die Umstellung auf den neuen Headless-Modus von Chrome und die Hinzufügung einer Option, um die Weitergabe von GPU-Absturzsignalen vom GPU-Prozess an den Renderer zu ermöglichen. Ohne diese beiden Flags absorbiert Chrome GPU-Prozessabstürze stillschweigend, und das Verhaltenssplit zwischen verwundbaren und gepatchten Builds ist von JavaScript aus nicht beobachtbar.
Während die Reverse-Engineering- und Binär-Diffing-Arbeiten noch laufen, wird der automatisierte Runner in diesem Repository nicht veröffentlicht. Er wird in einem Folge-Update enthalten sein, sobald die Patch-Analyse abgeschlossen ist.
Verwenden Sie nur auf Systemen, die Ihnen gehören oder für die Sie ausdrücklich berechtigt sind, Tests durchzuführen.