
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.