Pixel BigWave BIGO timeout race UAF → 2KB kernel write from mediacodec
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
TL;DR
- Iz SELinux-ograničenog mediacodec konteksta,
/dev/bigwave(Pixel AV1 hardware accelerator) je dostupan. Nagomilavanje poslova uzrokuje daBIGO_IOCX_PROCESSdostigne svoj 16s wait_for_completion_timeout() i vrati se dok worker thread istovremeno dekuje istu inlinejobstrukturu. - Zatvaranjem FD-a odmah se oslobađa
struct bigo_inst(koji sadržistruct bigo_job). Worker rekonstrušeinst = container_of(job, ...)i kasnije koristi oslobođena polja kao što jejob->regsunutarbigo_run_job(), što dovodi do Use-After-Free na inline job/inst. bigo_pull_regs(core, job->regs)izvršavamemcpy_fromio(regs, core->base, core->regs_size). Preuzimanjem oslobođenog slaba i prepisivanjemjob->regs, napadač dobija ~2144-byte arbitrary kernel write na odabranu adresu, sa delimičnom kontrolom bajtova podešavanjem vrednosti registara pre timeout-a.- Praćeno kao CVE-2025-36934; ispravljeno u 2026-01-05 Pixel/2025-12-01 ASB buildovima.
Attack surface mapping (SELinux → /dev reachability)
- Koristite alate kao što su DriverCartographer za enumeraciju device node-ova dostupnih iz datog SELinux domena. Uprkos ograničenoj politici mediacodec-a (software decoders treba da ostanu u izolovanom kontekstu),
/dev/bigwaveje ostao dostupan, otkrivajući veliku površinu napada za post-media-RCE kod.
Vulnerability: BIGO_IOCX_PROCESS timeout vs worker
- Tok: ioctl kopira korisnički register buffer u
job->regs, stavi inlinejobu red, zatim se pozivawait_for_completion_timeout(..., 16s). Na timeout pokušava da dekuje/otkaže i vraća se u userspace. - U međuvremenu,
bigo_worker_threadje mogao upravo da dekuje istijob:
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;
- Ako userspace zatvori FD posle timeout-a,
inst/jobse oslobode dok worker i dalje koristi te strukture → UAF. Nema sinhronizacije koja vezuje životni vek FD za job pointer worker threada.
Plan eksploatacije
- Backlog + timeout: Umetni dovoljno job-ova u red da se worker zakašnjava, zatim pozovi
BIGO_IOCX_PROCESSi pusti da udari u 16s timeout path. - Free while in use: Čim ioctl vrati kontrolu, pozovi
close(fd)da oslobodišinst/jobdok worker i dalje izvršava izbačeni job iz reda. - Reclaim + pointer control: Rasprši reclaimere (npr. Unix domain socket message alokacije) da zauzmu oslobođeni slab slot i prepišu inline
job, posebnojob->regs. - Arbitrary write: Kada
bigo_pull_regs()radi,memcpy_fromio()upisuje core->regs_size (~2144 bytes) iz MMIO u adresu zadatu od strane napadača ujob->regs, proizvodeći veliki write-what-where bez KASLR leak. - Data shaping: Pošto se registri prvo programiraju iz user podataka (
bigo_push_regs), postavi ih tako da hardver ne izvrši kod, držeći vraćenu sliku registara blizu bajtova pod kontrolom napadača.
Minimalni PoC skelet (blocking backlog + reclaim)
int fd = open("/dev/bigwave", O_RDWR);
for (int i = 0; i < 64; i++) submit_job(fd, regs_buf); // fill worker queue
submit_job(fd, regs_buf); // victim job
auto t0 = now();
while (now() - t0 < 17000ms) sched_yield(); // hit 16s timeout
close(fd); // free inst/job
spray_uds_msgs(payload_pointing_to_target, spray_count); // reclaim slab
sleep(1); // let worker memcpy_fromio
regs_buftreba unapred da konfiguriše BigWave da bude u idle stanju (npr. postaviti kontrolne bitove da preskoči izvršenje) tako da povratno kopirana slika registara ostane deterministička.
Zaključci za pregledaoce drajvera
- Inline per-FD job structs enqueued to async workers moraju držati reference koje prežive timeout/cancel putanje; zatvaranje FD mora biti sinhronizovano sa potrošnjom od strane workera.
- Bilo koji MMIO copy helperi (
memcpy_fromio/memcpy_toio) koji koriste pokazivače na bafer iz jobs treba da budu validirani ili duplicirani pre enqueovanja kako bi se izbegle UAF→write primitive.
Reference
- Pixel 0-click (Part 2): Escaping the mediacodec sandbox via the BigWave driver
- Project Zero issue 426567975 – BigWave BIGO timeout UAF
- CVE-2025-36934 entry (BigWave driver)
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.


