Pixel BigWave BIGO timeout race UAF → écriture noyau 2KB depuis mediacodec
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
TL;DR
- Depuis le contexte SELinux-confiné mediacodec,
/dev/bigwave(accélérateur matériel Pixel AV1) est accessible. Un arriéré de jobs fait queBIGO_IOCX_PROCESSatteint son 16s wait_for_completion_timeout() et retourne tandis que le thread worker désenfile simultanément la même structure inlinejob. - La fermeture du FD libère immédiatement
struct bigo_inst(qui inclutstruct bigo_job). Le worker reconstruitinst = container_of(job, ...)et utilise ensuite des champs libérés tels quejob->regsdansbigo_run_job(), entraînant un Use-After-Free sur le job/inst inline. bigo_pull_regs(core, job->regs)exécutememcpy_fromio(regs, core->base, core->regs_size). En récupérant le slab libéré et en écrasantjob->regs, un attaquant obtient une écriture arbitraire vers le noyau d’environ 2144 octets à une adresse choisie, avec contrôle partiel des octets en préprogrammant les valeurs des registres avant le timeout.
Attack surface mapping (SELinux → /dev reachability)
- Utilisez des outils comme DriverCartographer pour énumérer les nœuds de périphériques accessibles depuis un domaine SELinux donné. Malgré la politique restreinte de mediacodec (les décodeurs logiciels doivent rester dans un contexte isolé),
/dev/bigwaverestait accessible, exposant une large surface d’attaque au code post-media-RCE.
Vulnerability: BIGO_IOCX_PROCESS timeout vs worker
- Flux : ioctl copie le buffer de registres utilisateur dans
job->regs, met en file lejobinline, puiswait_for_completion_timeout(..., 16s). En cas de timeout il tente de désenfiler/annuler et retourne en espace utilisateur. - Pendant ce temps
bigo_worker_threadpeut avoir juste désenfilé le mêmejob:
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;
- Si l’espace utilisateur ferme le FD après le timeout,
inst/jobsont libérés alors que le worker continue à les utiliser → UAF. Il n’y a aucune synchronisation liant la durée de vie du FD au pointeur job du thread worker.
Plan d’exploitation
- Backlog + timeout : Mettre en file suffisamment de jobs pour retarder le worker, puis appeler
BIGO_IOCX_PROCESSet laisser atteindre le chemin de timeout de 16s. - Free while in use : Dès que l’ioctl retourne, appeler
close(fd)pour libérerinst/jobalors que le worker exécute encore le job retiré de la file. - Reclaim + pointer control : Effectuer un spray de reclaimers (p.ex., allocations Unix domain socket message) pour occuper la case de slab libérée et écraser le
jobinline, en particulierjob->regs. - Arbitrary write : Quand
bigo_pull_regs()s’exécute,memcpy_fromio()écrit core->regs_size (~2144 bytes) depuis le MMIO vers l’adresse fournie par l’attaquant dansjob->regs, produisant un large write-what-where sans KASLR leak. - Data shaping : Comme les registres sont d’abord programmés depuis des données utilisateur (
bigo_push_regs), configurez-les pour que le matériel n’exécute pas, en gardant l’image des registres copiée proche des octets contrôlés par l’attaquant.
Points à retenir pour les réviseurs de pilotes
- Les structs de job inline par-FD mis en file pour des workers asynchrones doivent conserver des références qui survivent aux chemins de timeout/annulation ; fermer un FD doit se synchroniser avec la consommation par le worker.
- Tout helper de copie MMIO (
memcpy_fromio/memcpy_toio) qui utilise des pointeurs de buffer provenant de jobs doit être validé ou dupliqué avant l’enqueue pour éviter des primitives UAF→write.
References
- Pixel 0-click (Part 2): Escaping the mediacodec sandbox via the BigWave driver
- Project Zero issue 426567975 – BigWave BIGO timeout UAF
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
HackTricks

