Pixel BigWave BIGO timeout race UAF → 2KB kernel write from mediacodec
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
TL;DR
- З SELinux-confined контексту mediacodec
/dev/bigwave(Pixel AV1 hardware accelerator) доступний. Накопичення черги завдань змушуєBIGO_IOCX_PROCESSдосягти свого 16s wait_for_completion_timeout() і повернутися, поки робочий потік одночасно знімає з черги той самий inlinejobstructure. - Закриття FD негайно звільняє
struct bigo_inst(який міститьstruct bigo_job). Робітник реконструюєinst = container_of(job, ...)і пізніше використовує звільнені поля, такі якjob->regsвсерединіbigo_run_job(), спричиняючи Use-After-Free on the inline job/inst. bigo_pull_regs(core, job->regs)виконуєmemcpy_fromio(regs, core->base, core->regs_size). Повернувши у користування звільнений slab і перезаписавшиjob->regs, зловмисник отримує ~2144-byte arbitrary kernel write на обрану адресу, з частковим контролем байтів шляхом попереднього програмування значень регістрів перед тайм-аутом.
Attack surface mapping (SELinux → /dev reachability)
- Використовуйте інструменти на кшталт DriverCartographer для перерахунку device nodes, доступних з певного SELinux домену. Незважаючи на обмежену політику mediacodec (software decoders повинні залишатися в ізольованому контексті),
/dev/bigwaveзалишався доступним, відкриваючи велику поверхню атаки для post-media-RCE коду.
Vulnerability: BIGO_IOCX_PROCESS timeout vs worker
- Потік: ioctl копіює буфер регістрів з користувача в
job->regs, ставить inlinejobу чергу, потім викликаєwait_for_completion_timeout(..., 16s). При тайм-ауті він намагається dequeue/cancel і повертається в userspace. - Тим часом
bigo_worker_threadміг щойно зняти з черги той самийjob:
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;
- Якщо користувацький простір закриває FD після таймауту,
inst/jobзвільняються, поки робочий потік продовжує їх використовувати → UAF. Немає синхронізації, що пов’язує життя FD з вказівникомjobробочого потоку.
Схема експлуатації
- Накопичення черги + таймаут: Помістіть у чергу достатньо задач, щоб воркер затримався, потім викличте
BIGO_IOCX_PROCESSі дозвольте потрапити на шлях таймауту 16s. - Звільнення під час використання: Як тільки ioctl повертається, викличте
close(fd), щоб звільнитиinst/job, поки робочий потік все ще виконує витягнуту задачу. - Перехоплення + контроль вказівника: Розпиліть reclaimers (наприклад, Unix domain socket message allocations), щоб зайняти звільнений слот slab і перезаписати inline
job, особливоjob->regs. - Довільний запис: Коли виконується
bigo_pull_regs(),memcpy_fromio()записує core->regs_size (~2144 bytes) з MMIO у адресу, вказану вjob->regs, створюючи великий write-what-where без KASLR leak. - Формування даних: Оскільки регістри спочатку програмуються з даних користувача (
bigo_push_regs), встановіть їх так, щоб апаратура не виконувала інструкцій, зберігаючи скопійоване назад зображення регістрів максимально близьким до байтів, контрольованих атакуючим.
Висновки для рев’юверів драйверів
- Inline структури job на FD, які ставляться в чергу асинхронним воркерам, повинні зберігати посилання, що переживуть шляхи таймауту/скасування; закриття FD має синхронізуватися зі споживанням воркером.
- Будь-які помічники копіювання MMIO (
memcpy_fromio/memcpy_toio), які використовують вказівники на буфери з job, повинні бути перевірені або продубльовані перед постановкою в чергу, щоб уникнути UAF→write примітивів.
Посилання
- Pixel 0-click (Part 2): Escaping the mediacodec sandbox via the BigWave driver
- Project Zero issue 426567975 – BigWave BIGO timeout UAF
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.


