Pixel BigWave BIGO timeout race UAF → scrittura kernel di 2KB da mediacodec
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
TL;DR
- Dal contesto SELinux-confined mediacodec,
/dev/bigwave(Pixel AV1 hardware accelerator) è raggiungibile. Un arretrato di job fa sì cheBIGO_IOCX_PROCESSincappi nel suo 16s wait_for_completion_timeout() e ritorni mentre il thread worker contemporaneamente estrae dalla coda lo stessojobinline. - La chiusura del FD libera immediatamente
struct bigo_inst(che incorporastruct bigo_job). Il worker ricostruisceinst = container_of(job, ...)e poi usa campi già liberati comejob->regsdentrobigo_run_job(), causando un Use-After-Free on the inline job/inst. bigo_pull_regs(core, job->regs)eseguememcpy_fromio(regs, core->base, core->regs_size). Recuperando lo slab liberato e sovrascrivendojob->regs, un attaccante ottiene una scrittura kernel arbitraria di ~2144 byte verso un indirizzo scelto, con controllo parziale dei byte pre-programmando i valori dei registri prima del timeout.
Attack surface mapping (SELinux → /dev reachability)
- Usare strumenti come DriverCartographer per enumerare i device node accessibili da un dato dominio SELinux. Nonostante la policy ristretta di mediacodec (i decoder software dovrebbero restare in un contesto isolato),
/dev/bigwaveè rimasto raggiungibile, esponendo una larga superficie di attacco al codice post-media-RCE.
Vulnerability: BIGO_IOCX_PROCESS timeout vs worker
- Flusso: ioctl copia il buffer registri utente in
job->regs, mette in coda l’jobinline, poi chiamawait_for_completion_timeout(..., 16s). Al timeout prova a dequeue/cancel e ritorna in userspace. - Nel frattempo
bigo_worker_threadpotrebbe aver appena estratto dalla coda lo stessojob:
inst = container_of(job, struct bigo_inst, job);
bigo_push_regs(core, job->regs);
...
bigo_pull_regs(core, job->regs); // memcpy_fromio(regs, core->base, core->regs_size)
*(u32 *)(job->regs + BIGO_REG_STAT) = status;
- Se lo userspace chiude il FD dopo il timeout,
inst/jobvengono liberati mentre il worker continua a usarli → UAF. Non c’è sincronizzazione che leghi la durata del FD al puntatore job del thread worker.
Schema di sfruttamento
- Backlog + timeout: Accoda un numero sufficiente di job in modo da ritardare il worker, poi esegui
BIGO_IOCX_PROCESSe lascia che entri nel percorso di timeout a 16s. - Free while in use: Non appena l’ioctl ritorna, esegui
close(fd)per liberareinst/jobmentre il worker sta ancora eseguendo il job estratto dalla coda. - Reclaim + pointer control: Spray reclaimers (e.g., Unix domain socket message allocations) per occupare lo slot di slab liberato e sovrascrivere l’
jobinline, in particolarejob->regs. - Arbitrary write: Quando
bigo_pull_regs()viene eseguita,memcpy_fromio()scrive core->regs_size (~2144 bytes) da MMIO nell’indirizzo fornito dall’attaccante injob->regs, generando un ampio write-what-where senza un KASLR leak. - Data shaping: Poiché i registri sono inizialmente programmati da dati utente (
bigo_push_regs), impostali in modo che l’hardware non esegua codice, mantenendo l’immagine dei registri copiata vicina a byte controllati dall’attaccante.
Indicazioni per i revisori del driver
- Le struct job inline per-FD messe in coda a worker asincroni devono mantenere riferimenti che sopravvivano ai percorsi di timeout/cancel; la chiusura di un FD deve sincronizzarsi con il consumo da parte del worker.
- Qualsiasi helper di copia MMIO (
memcpy_fromio/memcpy_toio) che usa puntatori a buffer presi dai job dovrebbe essere validato o duplicato prima dell’enqueue per evitare primitive UAF→write.
Riferimenti
- Pixel 0-click (Part 2): Escaping the mediacodec sandbox via the BigWave driver
- Project Zero issue 426567975 – BigWave BIGO timeout UAF
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.


