
Proof-of-Concept- und GLSL-Fuzzer für CVE-2026-9999 im ANGLE/Metal-WebGL-Backend von Chrome, mit Build-Fingerprinting, kuratierten Shadern und Erfassung von Crash-Artefakten.
| Feld | Wert |
|---|
| CVE | CVE-2026-9999 |
| Anbieter / Produkt | Google Chrome |
| Betroffen | Chrome < 148.0.7778.216, nur macOS [1] |
| Behoben in | 148.0.7778.216 [1] |
| Auswirkung | Beliebige Codeausführung innerhalb einer Sandbox über eine präparierte HTML-Seite [1] |
| Chromium-Schweregrad | Hoch [1] |
| CVSS 3.1 (CISA-ADP) | 8.8 HOCH — CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H [1] |
| NVD- (NIST-)CVSS-Bewertung | Noch nicht verfügbar [1] |
| CWE | CWE-269 — Unzureichende Rechteverwaltung (Anreicherung durch CISA-ADP) [1] |
| CISA SSVC (2026-05-29) | exploitation: none, automatable: no, technicalImpact: total [1] |
| Veröffentlicht / zuletzt geändert | 2026-05-28 / 2026-07-21 [1] |
| Grundursache | Nicht öffentlich — Chromium-Issue 513364480 zeigt „Permissions Required" [1] |
Auswirkung auf die Angriffskette: Codeausführung „innerhalb einer Sandbox" [1] bedeutet, dass ein Angreifer die Kontrolle über einen sandboxierten Prozess (am wahrscheinlichsten den GPU-Prozess) erlangt. Eine vollständige Browser-Übernahme würde zusätzlich eine separate Sandbox-Escape erfordern, die nicht Teil dieser CVE ist.
Das Folgende ist eine Schlussfolgerung aus den öffentlichen Informationen, keine bestätigten Fakten:
Der Harness wendet daher genau diese Muster an und mutiert dann GLSL in großem Umfang, um nach einem Absturz auf der Renderer-Seite zu suchen (WebGL-Kontext verloren = GPU-Prozessabsturz oder Watchdog-Beendigung).
| Datei | Zweck |
|---|---|
cve-2026-9999-poc.html | Eigenständiger PoC-Harness (keine Abhängigkeiten): Build-Fingerprinting, 8 kuratierte Übersetzer-Stress-Shader, GLSL-Fuzzer mit Erfassung von Absturzartefakten |
README.md | Diese Datei |
Das Chrome-for-Testing-Archiv von Google stellt versionsgepinnte Builds bereit, die nicht automatisch aktualisiert werden. Finden Sie den neuesten verwundbaren Build (alles unterhalb von 148.0.7778.216 ist betroffen [1]):
import json, urllib.request
data = json.load(urllib.request.urlopen(
"https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json"))
key = lambda v: tuple(int(x) for x in v.split('.'))
fix = (148, 0, 7778, 216)
cands = sorted((v["version"] for v in data["versions"]
if "chrome" in v.get("downloads", {}) and key(v["version"]) < fix), key=key)
print(cands[-5:]) # pick the last (newest vulnerable) entry
Laden Sie für Ihre Architektur herunter (uname -m):
# Apple Silicon
https://storage.googleapis.com/chrome-for-testing-public/<VERSION>/mac-arm64/chrome-mac-arm64.zip
# Intel
https://storage.googleapis.com/chrome-for-testing-public/<VERSION>/mac-x64/chrome-mac-x64.zip
Entpacken Sie in einen Laborordner (z. B. ~/lab/, nicht /Applications) und starten Sie von dort.
Wenn ein bestimmter Build in Chrome for Testing fehlt, verwenden Sie das Chromium-Snapshot-Archiv (commondatastorage.googleapis.com/chromium-browser-snapshots/Mac/ für Intel, .../Mac_Arm/ für Apple Silicon), das nach Commit-Position indiziert ist — ordnen Sie die verwundbare Version über chromium-history einer Branch-Position zu und ziehen Sie anschließend den nächstgelegenen Snapshot. Auch Snapshots aktualisieren sich nicht automatisch.
Beenden Sie die Keystone-Updater-Agenten und blockieren Sie googleupdate.googleapis.com, sonst patcht sich der Test-Build über Nacht stillschweigend selbst. Bei Chrome-for-Testing-Builds nicht erforderlich.
Ohne Metal rendert Chrome WebGL in Software (SwiftShader) und das ANGLE-Metal-Backend wird nie berührt. Führen Sie in der Konsole der PoC-Seite Folgendes aus:
const c = document.createElement('canvas'), g = c.getContext('webgl2');
const x = g.getExtension('WEBGL_debug_renderer_info');
console.log(g.getParameter(x.UNMASKED_RENDERER_WEBGL));
// Good: contains "ANGLE Metal Renderer"
// Bad: contains "SwiftShader" -> the vulnerable path is NOT being exercised
Sie können dies auch unter chrome://gpu bestätigen. Parallels-/VMware-Fusion-Gäste mit GPU-Virtualisierung funktionieren normalerweise; minimale QEMU/UTM-Setups fallen oft auf SwiftShader zurück.
cd <repo dir>
python3 -m http.server 8000
# then browse to http://localhost:8000/cve-2026-9999-poc.html
1) Run curated triggers klicken. Acht Shader belasten die in §2 beschriebenen Übersetzer-Muster (OOB-Konstantenindizierung, Integer-Überlauf bei Array-Größen, dynamische Matrix-Indizierung, Loop-Unrolling-Stress, Arrays-von-Arrays, Discard/Swizzle, Präprozessor-Randfälle, überdimensionierte UBOs). Achten Sie auf [!!]-Ergebnisse und Context-Loss-Ereignisse.2) Fuzz klicken. Mutierte GLSL-Shader werden in einer Schleife kompiliert, verlinkt, gezeichnet und zurückgelesen. Achten Sie im Protokoll auf CONTEXT LOST.localStorage gespeichert. Rufen Sie ihn ab:
localStorage.getItem("cve20269999_poc_fs"); // crashing fragment shader
localStorage.getItem("cve20269999_crashes"); // crash event log
Ein Live-Snapshot eines verdächtigen Laufs ist auch unter
chrome://gpuund in der macOS-Konsole (GPU-Prozess-Absturzberichte) sichtbar.
WEBGL_context_lost ≠ Schwachstelle. Der GPU-Watchdog von Chrome beendet langlebige Shader (der loop-unroll-dos-Auslöser und Fuzz-Iterationen mit riesigen Schleifenzahlen sind absichtlich langsam). Unterdrücken Sie das Rauschen: Reduzieren Sie SH_ITER, oder bestätigen Sie, dass sich ein Kandidaten-Absturz schnell reproduziert (< 1 s pro Iteration).EXC_BAD_ACCESS) statt einer Watchdog-Beendigung.Erstellen Sie eine verwundbare Revision von Chromium mit AddressSanitizer:
fetch chromium
cd src
git checkout tags/148.0.7778.215 # last tag before the fix
gn gen out/asan --args='is_asan=true is_debug=false symbol_level=1 dcheck_always_on=true'
autoninja -C out/asan chrome
Führen Sie dann den minimierten abstürzenden Shader mit aktivierter Metal-API-Validierung aus:
MTL_DEBUG_LAYER=1 out/asan/Chromium.app/Contents/MacOS/Chromium poc.html
Der ASAN-Trace wird die genaue ANGLE/Metal-Funktion benennen und bestätigen, ob der Absturz mit der Komponente der CVE übereinstimmt [1].
(Anschließend: Sobald der Fix-Commit für 148.0.7778.216 sichtbar ist, diffen Sie third_party/angle/src/libANGLE/renderer/metal/, um die wahre Grundursache zu ermitteln und den Fuzzing-Ansatz durch einen deterministischen Auslöser zu ersetzen.)
exploitation: none [1].Testen Sie nur auf Maschinen, die Ihnen gehören oder für die Sie ausdrücklich zum Testen autorisiert sind. Der Harness kompiliert absichtlich adversariale Shader, um einen Grafikprozess zum Absturz zu bringen — erwarten Sie GPU- Prozess-Beendigungen. Halten Sie den verwundbaren Browser-Build von Produktionsnetzwerken fern.
[1] NVD — CVE-2026-9999: https://nvd.nist.gov/vuln/detail/CVE-2026-9999 * Sicherheitshinweis des Herstellers (Chrome-Releases-Blog, Stable-Channel-Update): https://chromereleases.googleblog.com/2026/05/stable-channel-update-for-desktop_0877304591.html * Chromium-Issue 513364480 (zugriffsbeschränkt): https://issues.chromium.org/issues/513364480