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 ์ง€์›ํ•˜๊ธฐ

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

  1. Backlog + timeout: worker๊ฐ€ ์ง€์—ฐ๋˜๋„๋ก ์ถฉ๋ถ„ํ•œ jobs๋ฅผ ํ์— ๋„ฃ๊ณ , BIGO_IOCX_PROCESS๋ฅผ ์‹คํ–‰ํ•ด 16s timeout ๊ฒฝ๋กœ์— ๊ฑธ๋ฆฌ๊ฒŒ ํ•œ๋‹ค.
  2. Free while in use: ioctl์ด ๋ฐ˜ํ™˜๋˜์ž๋งˆ์ž close(fd)๋กœ worker๊ฐ€ ์•„์ง ์‹คํ–‰ ์ค‘์ธ dequeued job์˜ inst/job๋ฅผ ํ•ด์ œํ•œ๋‹ค.
  3. Reclaim + pointer control: Spray reclaimers(์˜ˆ: Unix domain socket message ํ• ๋‹น)๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด์ œ๋œ slab ์Šฌ๋กฏ์„ ์ฐจ์ง€ํ•˜๊ณ  inline job, ํŠนํžˆ job->regs๋ฅผ ๋ฎ์–ด์“ด๋‹ค.
  4. Arbitrary write: bigo_pull_regs()๊ฐ€ ์‹คํ–‰๋  ๋•Œ, memcpy_fromio()๊ฐ€ MMIO์—์„œ **core->regs_size (~2144 bytes)**๋ฅผ job->regs์— ์žˆ๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ๊ณตํ•œ ์ฃผ์†Œ๋กœ ์จ์„œ KASLR leak ์—†์ด ๋Œ€๊ทœ๋ชจ write-what-where๋ฅผ ๋งŒ๋“ ๋‹ค.
  5. 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

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 ์ง€์›ํ•˜๊ธฐ