
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 dell'immagine del glifo non inizializzata in Skia) e CVE-2026-5281 (use-after-free di DeviceInfo nel wire server di Dawn) in una catena completa. Tutte le modifiche sono lato renderer; il codice del processo GPU è invariato:
Info leak (CVE-2026-11057) — Attiva un buffer dell'immagine del glifo non inizializzato tramite il rendering del testo su canvas, rilegge i puntatori dall'heap del processo GPU, li convalida con esecuzioni aritmetiche, deriva la base del pool PartitionAlloc e calcola il target falso del Server M = POOL + 0x202A08000 (offset calibrato).
CC spray — createBuffer(label="CCM:<m>:<n>") attiva l'iniezione di 3000 ChunkedCommands incompleti (bucket da 10KB, remainingSize=1, mantenuti vivi nel mChunkedCommands del wire server). Il payload riempie la regione attorno a M con un falso Server disposto per Android arm64: vptr di MutexProtected a +0xB20, ChunkedCommandSerializer a +0xB50/+0xB58, falso CommandSerializer/vtable a +0xC00/+0xD00.
Trigger 5281 + occupy — queue.writeBuffer(buffer, 0x414141, ...) chiama prima Unregister(Device) per liberare il DeviceInfo da 16 byte, poi inietta un ChunkedCommand occupy da 16 byte per recuperare 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 — La callback dell'errore non catturato dereferenzia info->server = M (falso Server): i mutex azzerati superano il controllo, l'esecuzione raggiunge OnUncapturedError → SerializeCommand, e la chiamata indiretta relativa alla vtable colpisce la nostra falsa vtable, fornendo pc = fake_vtable + offset int32 controllato, dimostrato da pc = 0x7641414141.
Nota: Chromium su Android arm64 utilizza vtable relative (
-fexperimental-relative-c++-abi-vtables); le voci della vtable sono offset relativi a 32 bit anziché puntatori assoluti a funzione, quindi il PoC utilizza un offset int32 controllato come marcatore nel punto di hijack della vtable.
Sul dispositivo di test, la catena completa raggiunge il crash da 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 di CVE-2026-11057. FlattenGlyphsByType() riscrive il payload dello strike in modo che il processo GPU crei uno SkGlyph con fImage == nullptr, leggendo infine un buffer dell'immagine non inizializzato per far trapelare puntatori dell'heap.Device.cpp.patch — CC spray del client wire di Dawn. APICreateBuffer() analizza l'etichetta CCM:, costruisce il payload del falso Server per Android arm64 e inietta N ChunkedCommands incompleti che restano vivi nel processo GPU.ApiProcs.cpp.patch — Trigger + occupy di CVE-2026-5281. Sull'offset magico 0x414141 di QueueWriteBuffer, chiama Unregister(Device) per liberare DeviceInfo, inietta un ChunkedCommand da 16 byte per recuperare lo slot e impostare info->server = M, quindi procede con un offset fuori dai limiti per attivare la callback pendente.exploit.html — Orchestrazione della pagina: primitiva di leak (groom/draw/readCell/verifyRuns/derivePoolBase), CC spray e un trigger autonomo exploit5281(); in caso di fallimento ripulisce lo stato dello spray e ricarica in modo che le fasi non interferiscano.Questo ExP è divulgato solo fino al passaggio di hijack della vtable (target della chiamata indiretta controllato, pc = base+0x41414141). I passaggi dal salto controllato in poi, così come l'implementazione dell'RCE, sono mantenuti riservati e non sono inclusi in questo repository.
Il mio exploit differisce dall'approccio del reporter originale in un modo fondamentale. L'exploit originale è stato ottenuto modificando il codice sorgente di PartitionAlloc nel processo GPU per disabilitare la randomizzazione degli indirizzi. Questo approccio è adatto solo a scopi di proof-of-concept. Al contrario, il mio exploit combina una vulnerabilità di divulgazione di informazioni per aggirare la randomizzazione degli indirizzi, consentendo un exploit pienamente funzionante che opera in ambienti reali.
# 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 PC