
Vollständige Exploit-Kette für Android Chromium, die den CVE-2026-11057-Informationsleck und den CVE-2026-5281-Use-after-Free kombiniert, um eine Vtable-Übernahme und beliebige Codeausführung zu erreichen.
Pixel 7 Android 16 ARM64
commit 994c846bbd7a35241ba7c08158c13d66412a6993 (HEAD -> 146.0.7680.111, tag: 146.0.7680.111)
Author: Roger McFarlane <[email protected]>
Date: Mon Mar 9 12:48:07 2026 -0700
Dieses Repository kombiniert CVE-2026-11057 (nicht initialisierter Glyph-Bildspeicher in Skia) und CVE-2026-5281 (Use-after-free in DeviceInfo des Dawn-Wire-Servers) zu einer vollständigen Kette. Alle Änderungen erfolgen rendererseitig; der Code des GPU-Prozesses bleibt unverändert:
Info-Leak (CVE-2026-11057) — Löse einen nicht initialisierten Glyph-Bildpuffer über Canvas-Textrendering aus, lies Zeiger aus dem Heap des GPU-Prozesses zurück, validiere sie mit arithmetischen Läufen, leite die Basis des PartitionAlloc-Pools ab und berechne das gefälschte Server-Ziel M = POOL + 0x202A08000 (kalibrierter Offset).
CC-Spray — createBuffer(label="CCM:<m>:<n>") löst die Injektion von 3000 unvollständigen ChunkedCommands aus (10KB-Bucket, remainingSize=1, am Leben gehalten in mChunkedCommands des Wire-Servers). Die Payload füllt den Bereich um M mit einem gefälschten Server, der für Android arm64 ausgelegt ist: MutexProtected-vptr bei +0xB20, ChunkedCommandSerializer bei +0xB50/+0xB58, gefälschter CommandSerializer/vtable bei +0xC00/+0xD00.
5281-Trigger + Belegen — queue.writeBuffer(buffer, 0x414141, ...) ruft zuerst Unregister(Device) auf, um das 16-Byte-DeviceInfo freizugeben, injiziert dann einen 16-Byte-Beleg-ChunkedCommand, um diesen Slot zurückzugewinnen und info->server mit M zu überschreiben, und löst schließlich einen Validierungsfehler mit einem Out-of-Bounds-Offset aus.
Dangling-Callback → Vtable-Hijack — Der Callback für nicht abgefangene Fehler dereferenziert info->server = M (gefälschter Server): Die genullten Mutexe werden passiert, die Ausführung erreicht OnUncapturedError → SerializeCommand, und der indirekte Aufruf über die relative Vtable trifft unsere gefälschte Vtable, was pc = fake_vtable + kontrollierter int32-Offset ergibt, demonstriert durch pc = 0x7641414141.
Hinweis: Chromium unter Android arm64 verwendet relative Vtables (
-fexperimental-relative-c++-abi-vtables); Vtable-Einträge sind 32-Bit-relative Offsets statt absoluter Funktionszeiger, daher verwendet der PoC einen kontrollierten int32-Offset als Marker am Punkt des Vtable-Hijacks.
Auf dem Testgerät erreicht die vollständige Kette den Vtable-Hijack-Absturz mit einer Erfolgsrate von nahezu 100 %; die Leak-Stufe kann gelegentlich mehrere automatische Neuladevorgänge erfordern, bevor sie erfolgreich ist.
SkStrike.cpp.patch — CVE-2026-11057-Leak-Trigger. FlattenGlyphsByType() schreibt die Strike-Payload so um, dass der GPU-Prozess ein SkGlyph mit fImage == nullptr erzeugt und schließlich einen nicht initialisierten Bildpuffer liest, um Heap-Zeiger zu leaken.Device.cpp.patch — CC-Spray des Dawn-Wire-Clients. APICreateBuffer() parst das Label CCM:, baut die gefälschte Android-arm64-Server-Payload auf und injiziert N unvollständige ChunkedCommands, die im GPU-Prozess am Leben bleiben.ApiProcs.cpp.patch — CVE-2026-5281-Trigger + Belegen. Beim Magic-Offset 0x414141 von QueueWriteBuffer ruft es Unregister(Device) auf, um DeviceInfo freizugeben, injiziert einen 16-Byte-ChunkedCommand, um den Slot zurückzugewinnen und info->server = M zu setzen, und fährt dann mit einem Out-of-Bounds-Offset fort, um den Dangling-Callback auszulösen.exploit.html — Seiten-Orchestrierung: Leak-Primitive (groom/draw/readCell/verifyRuns/derivePoolBase), CC-Spray und ein eigenständiger exploit5281()-Trigger; bei einem Fehler bereinigt es den Spray-Zustand und lädt neu, damit sich die Stufen nicht gegenseitig beeinflussen.Dieses ExP wird nur bis zum Schritt des Vtable-Hijacks offengelegt (kontrolliertes indirektes Aufrufziel, pc = base+0x41414141). Die Schritte ab dem kontrollierten Sprung sowie die RCE-Implementierung bleiben vertraulich und sind nicht in diesem Repository enthalten.
Mein Exploit unterscheidet sich in einem entscheidenden Punkt vom Ansatz des ursprünglichen Melders. Der ursprüngliche Exploit wurde erreicht, indem der PartitionAlloc-Quellcode im GPU-Prozess modifiziert wurde, um die Adressrandomisierung zu deaktivieren. Dieser Ansatz eignet sich nur für Proof-of-Concept-Zwecke. Im Gegensatz dazu kombiniert mein Exploit eine Informationsoffenlegungsschwachstelle zur Umgehung der Adressrandomisierung und ermöglicht so einen voll funktionsfähigen Exploit, der in realen Umgebungen funktioniert.
# Set build arguments here. See `gn help buildargs`.
is_official_build = true
is_debug = false
symbol_level = 0
v8_symbol_level = 0
blink_symbol_level = 0
is_component_build = false
proprietary_codecs = true
ffmpeg_branding = "Chrome"
dcheck_always_on =false
optimize_webui = true
android_static_analysis = "off"
target_os = "android"
target_cpu = "arm64"
# Disable PartitionAllocEventuallyZeroFreedMemory
disable_fieldtrial_testing_config = true
treat_warnings_as_errors = false
adb logcat | grep DEBUG auf dem PC ausführen