Pixel BigWave BIGO timeout race UAF โ 2KB kernel write from mediacodec
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
TL;DR
- SELinux๋ก ์ ํ๋ mediacodec ์ปจํ
์คํธ์์
/dev/bigwave(Pixel AV1 ํ๋์จ์ด ๊ฐ์๊ธฐ)์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์์ ์ด ๋ฐ๋ ค ์์ด๋ฉดBIGO_IOCX_PROCESS๊ฐ **16s wait_for_completion_timeout()**์ ๊ฑธ๋ ค ๋ฐํ๋๊ณ , ๊ทธ ์ฌ์ด worker ์ค๋ ๋๋ ๋์ผํ ์ธ๋ผ์ธjob๊ตฌ์กฐ์ฒด๋ฅผ ๋์์ dequeueํ ์ ์์ต๋๋ค. - FD๋ฅผ ๋ซ์ผ๋ฉด ์ฆ์
struct bigo_inst(๋ด๋ถ์struct bigo_job๋ฅผ ํฌํจ)๋ฅผ ํด์ ํฉ๋๋ค. worker๋inst = container_of(job, ...)๋ฅผ ์ฌ๊ตฌ์ฑํ๊ณ ๋์ค์bigo_run_job()๋ด๋ถ์์ **job->regs**์ ๊ฐ์ ํด์ ๋ ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ผ์ธ job/inst์ ๋ํ Use-After-Free๋ฅผ ๋ฐ์์ํต๋๋ค. bigo_pull_regs(core, job->regs)๋memcpy_fromio(regs, core->base, core->regs_size)๋ฅผ ์ํํฉ๋๋ค. ํด์ ๋ slab๋ฅผ ์ฌํ ๋นํ๊ณjob->regs๋ฅผ ๋ฎ์ด์ฐ๋ฉด ๊ณต๊ฒฉ์๋ ~2144-byte ์์์ ์ปค๋ ์ฐ๊ธฐ๋ฅผ ์ ํํ ์ฃผ์๋ก ์ป์ ์ ์์ผ๋ฉฐ, ํ์์์ ์ ์ ๋ ์ง์คํฐ ๊ฐ์ ๋ฏธ๋ฆฌ ์ค์ ํจ์ผ๋ก์จ ๋ฐ์ดํธ์ ์ผ๋ถ๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค.
Attack surface mapping (SELinux โ /dev reachability)
- DriverCartographer ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด ์ฃผ์ด์ง SELinux ๋๋ฉ์ธ์์ ์ ๊ทผ ๊ฐ๋ฅํ ๋๋ฐ์ด์ค ๋
ธ๋๋ฅผ ์ด๊ฑฐํ์ธ์. mediacodec์ ์ ํ๋ ์ ์ฑ
์๋ ๋ถ๊ตฌํ๊ณ (์ํํธ์จ์ด ๋์ฝ๋๋ ๊ฒฉ๋ฆฌ๋ ์ปจํ
์คํธ์ ์์ด์ผ ํจ),
/dev/bigwave๋ ์ฌ์ ํ ์ ๊ทผ ๊ฐ๋ฅํ์ผ๋ฉฐ post-media-RCE ์ฝ๋์ ํฐ ๊ณต๊ฒฉ ํ๋ฉด์ ๋ ธ์ถํ์ต๋๋ค.
Vulnerability: BIGO_IOCX_PROCESS timeout vs worker
- Flow: ioctl์ ์ฌ์ฉ์ ๋ ์ง์คํฐ ๋ฒํผ๋ฅผ
job->regs๋ก ๋ณต์ฌํ๊ณ ์ธ๋ผ์ธjob์ ํ์ ๋ฃ์ ๋คwait_for_completion_timeout(..., 16s)๋ฅผ ํธ์ถํฉ๋๋ค. ํ์์์ ์์๋ dequeue/์ทจ์๋ฅผ ์๋ํ๊ณ ์ ์ ์คํ์ด์ค๋ก ๋ฐํํฉ๋๋ค. - ํํธ
bigo_worker_thread๋ ๋ฐฉ๊ธ ๋์ผํjob์ dequeueํ์ ์๋ ์์ต๋๋ค:
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;
- timeout ์ดํ userspace๊ฐ FD๋ฅผ closeํ๋ฉด,
inst/job๊ฐ ํด์ ๋ ์ํ์์ worker๊ฐ ๊ณ์ ์ฌ์ฉ โ UAF. FD์ ์๋ช ๊ณผ worker ์ค๋ ๋์ job ํฌ์ธํฐ๋ฅผ ์ฐ๊ฒฐํ๋ ๋๊ธฐํ๊ฐ ์์.
Exploitation outline
- Backlog + timeout: worker๊ฐ ์ง์ฐ๋๋๋ก ์ถฉ๋ถํ jobs๋ฅผ ํ์ ๋ฃ๊ณ ,
BIGO_IOCX_PROCESS๋ฅผ ์คํํด 16s timeout ๊ฒฝ๋ก์ ๊ฑธ๋ฆฌ๊ฒ ํ๋ค. - Free while in use: ioctl์ด ๋ฐํ๋์๋ง์
close(fd)๋ก worker๊ฐ ์์ง ์คํ ์ค์ธ dequeued job์inst/job๋ฅผ ํด์ ํ๋ค. - Reclaim + pointer control: Spray reclaimers(์: Unix domain socket message ํ ๋น)๋ฅผ ์ฌ์ฉํด ํด์ ๋ slab ์ฌ๋กฏ์ ์ฐจ์งํ๊ณ inline
job, ํนํjob->regs๋ฅผ ๋ฎ์ด์ด๋ค. - Arbitrary write:
bigo_pull_regs()๊ฐ ์คํ๋ ๋,memcpy_fromio()๊ฐ MMIO์์ **core->regs_size (~2144 bytes)**๋ฅผjob->regs์ ์๋ ๊ณต๊ฒฉ์๊ฐ ์ ๊ณตํ ์ฃผ์๋ก ์จ์ KASLR leak ์์ด ๋๊ท๋ชจ write-what-where๋ฅผ ๋ง๋ ๋ค. - Data shaping: ๋ ์ง์คํฐ๊ฐ ๋จผ์ user ๋ฐ์ดํฐ(
bigo_push_regs)๋ก ํ๋ก๊ทธ๋จ๋๋ฏ๋ก, ํ๋์จ์ด๊ฐ ์คํํ์ง ์๋๋ก ์ค์ ํด ๋ณต์ฌ๋ ๋ ์ง์คํฐ ์ด๋ฏธ์ง๊ฐ ๊ณต๊ฒฉ์๊ฐ ์ ์ดํ ๋ฐ์ดํธ์ ๊ฐ๊น๊ฒ ์ ์ง๋๋๋ก ํ๋ค.
Takeaways for driver reviewers
- Inline per-FD job structs enqueued to async workers๋ timeout/cancel ๊ฒฝ๋ก๋ฅผ ๊ฒฌ๋ ์ ์๋ ๋ ํผ๋ฐ์ค๋ฅผ ์ ์งํด์ผ ํ๋ค; FD๋ฅผ closeํ๋ ๋์์ worker์ ์๋น์ ๋๊ธฐํ๋์ด์ผ ํ๋ค.
- job์์ ์จ ๋ฒํผ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ MMIO ๋ณต์ฌ ํฌํผ(
memcpy_fromio/memcpy_toio)๋ UAFโwrite primitives๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด enqueueํ๊ธฐ ์ ์ ๊ฒ์ฆ๋๊ฑฐ๋ ๋ณต์ ๋์ด์ผ ํ๋ค.
References
- Pixel 0-click (Part 2): Escaping the mediacodec sandbox via the BigWave driver
- Project Zero issue 426567975 โ BigWave BIGO timeout UAF
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


