Android ๋ฏธ๋””์–ด ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ ์ด๋ฏธ์ง€ ํŒŒ์„œ ์•…์šฉ

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

์ „๋‹ฌ: ๋ฉ”์‹œ์ง• ์•ฑ โžœ MediaStore โžœ ํŠน๊ถŒ ํŒŒ์„œ

ํ˜„๋Œ€ OEM ๋นŒ๋“œ๋Š” โ€œAIโ€ ๋˜๋Š” ๊ณต์œ  ๊ธฐ๋Šฅ์„ ์œ„ํ•ด ์ •๊ธฐ์ ์œผ๋กœ MediaStore๋ฅผ ์žฌ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ถŒํ•œ ์žˆ๋Š” ๋ฏธ๋””์–ด ์ธ๋ฑ์„œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. 2025๋…„ 4์›” ํŒจ์น˜ ์ด์ „์˜ Samsung ํŽŒ์›จ์–ด์—์„œ com.samsung.ipservice๋Š” Quram (/system/lib64/libimagecodec.quram.so)์„ ๋กœ๋“œํ•˜๊ณ  WhatsApp(๋˜๋Š” ๋‹ค๋ฅธ ์•ฑ)์ด MediaStore์— ์ €์žฅํ•œ ๋ชจ๋“  ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๊ณต๊ฒฉ์ž๋Š” IMG-*.jpg๋กœ ์œ„์žฅํ•œ DNG๋ฅผ ์ „์†กํ•˜๊ณ  ํ”ผํ•ด์ž๊ฐ€ โ€œdownloadโ€ (1-click)๋ฅผ ๋ˆ„๋ฅด๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ, ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐค๋Ÿฌ๋ฆฌ๋ฅผ ์—ด์ง€ ์•Š์•„๋„ ๊ทธ ํŠน๊ถŒ ์„œ๋น„์Šค๊ฐ€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

$ file IMG-2025-02-10.jpeg
TIFF image data ...
$ exiftool IMG-2025-02-10.jpeg | grep "Opcode List"
Opcode List 1 : [opcode 23], [opcode 23], ...

ํ•ต์‹ฌ ์š”์ง€

  • ์ „๋‹ฌ์€ ์‹œ์Šคํ…œ ๋ฏธ๋””์–ด ์žฌํŒŒ์‹ฑ(์ฑ„ํŒ… ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ)์— ์˜์กดํ•˜๋ฏ€๋กœ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์˜ ๊ถŒํ•œ(๊ฐค๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์ „์ฒด ์ฝ๊ธฐ/์“ฐ๊ธฐ ์ ‘๊ทผ, ์ƒˆ ๋ฏธ๋””์–ด ์ถ”๊ฐ€ ๋Šฅ๋ ฅ ๋“ฑ)์„ ๊ณ„์Šนํ•œ๋‹ค.
  • ๊ณต๊ฒฉ์ž๊ฐ€ ๋Œ€์ƒ์—๊ฒŒ ๋ฏธ๋””์–ด ์ €์žฅ์„ ์œ ๋„ํ•˜๋ฉด MediaStore๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ด๋ฏธ์ง€ ํŒŒ์„œ(vision widgets, ๋ฐฐ๊ฒฝํ™”๋ฉด, AI ์ด๋ ฅ์„œ ๊ธฐ๋Šฅ ๋“ฑ)๊ฐ€ ์›๊ฒฉ์œผ๋กœ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

0-click DD+/EAC-3 ๋””์ฝ”๋”ฉ ๊ฒฝ๋กœ (Google Messages โžœ mediacodec sandbox)

ํ˜„๋Œ€ ๋ฉ”์‹œ์ง• ์Šคํƒ์€ ์ „์‚ฌ/๊ฒ€์ƒ‰์„ ์œ„ํ•ด audio๋ฅผ ์ž๋™ ๋””์ฝ”๋”ฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค. Pixel 9์—์„œ๋Š” Google Messages๊ฐ€ ์ˆ˜์‹ ๋œ RCS/SMS ์˜ค๋””์˜ค๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์—ด๊ธฐ ์ „์— /vendor/lib64/libcodec2_soft_ddpdec.so ๋‚ด๋ถ€์˜ **Dolby Unified Decoder (UDC)**์— ์ „๋‹ฌํ•˜์—ฌ 0-click ๊ณต๊ฒฉ ํ‘œ๋ฉด์„ ๋ฏธ๋””์–ด ์ฝ”๋ฑ์œผ๋กœ ํ™•์žฅํ•œ๋‹ค.

์ฃผ์š” ํŒŒ์‹ฑ ์ œ์•ฝ

  • ๊ฐ DD+ syncframe์€ ์ตœ๋Œ€ 6๊ฐœ์˜ ๋ธ”๋ก์„ ๊ฐ€์ง€๋ฉฐ; ๊ฐ ๋ธ”๋ก์€ ์ตœ๋Œ€ 0x1FF ๋ฐ”์ดํŠธ์˜ ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” skip data๋ฅผ skip buffer๋กœ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค(ํ”„๋ ˆ์ž„ ๋‹น โ‰ˆ 0x1FF * 6 ๋ฐ”์ดํŠธ).
  • skip buffer๋Š” EMDF๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์Šค์บ”๋œ๋‹ค: syncword (0xX8) + emdf_container_length (16๋น„ํŠธ) + ๊ฐ€๋ณ€ ๊ธธ์ด ํ•„๋“œ. emdf_payload_size๋Š” ์ œํ•œ ์—†๋Š” variable_bits(8) ๋ฃจํ”„๋กœ ํŒŒ์‹ฑ๋œ๋‹ค.
  • EMDF ํŽ˜์ด๋กœ๋“œ ๋ฐ”์ดํŠธ๋Š” ํ”„๋ ˆ์ž„๋ณ„ ์ปค์Šคํ…€ โ€œevo heapโ€ bump ํ• ๋‹น๊ธฐ์—์„œ ํ• ๋‹น๋œ ํ›„ emdf_container_length๋กœ ์ œํ•œ๋œ ๋น„ํŠธ ๋ฆฌ๋”๋กœ๋ถ€ํ„ฐ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋ณต์‚ฌ๋œ๋‹ค.

์ •์ˆ˜ ์˜ค๋ฒ„ํ”Œ๋กœ โ†’ ํž™ ์˜ค๋ฒ„ํ”Œ๋กœ ์›์‹œ(primitive) (CVE-2025-54957)

  • ddp_udc_int_evo_malloc๋Š” total_size += (8 - total_size) % total_size๋ฅผ ํ†ตํ•ด alloc_size+extra๋ฅผ 8๋ฐ”์ดํŠธ ์ •๋ ฌํ•˜์ง€๋งŒ wrap detection ์—†์ด ์ˆ˜ํ–‰๋œ๋‹ค. 0xFFFFFFFFFFFFFFF9..FF ๊ทผ์ฒ˜ ๊ฐ’๋“ค์€ AArch64์—์„œ ์ž‘์€ total_size๋กœ ์ถ•์†Œ๋œ๋‹ค.
  • ๋ณต์‚ฌ ๋ฃจํ”„๋Š” ์—ฌ์ „ํžˆ emdf_payload_size์—์„œ ์˜จ ๋…ผ๋ฆฌ์  payload_length๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ๊ณต๊ฒฉ์ž ๋ฐ”์ดํŠธ๊ฐ€ ์ถ•์†Œ๋œ ์ฒญํฌ๋ฅผ ๋„˜์–ด evo-heap ๋ฐ์ดํ„ฐ๋ฅผ ๋ฎ์–ด์“ด๋‹ค.
  • ์˜ค๋ฒ„ํ”Œ๋กœ ๊ธธ์ด๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์„ ํƒํ•œ emdf_container_length๋กœ ์ •ํ™•ํžˆ ์ œํ•œ๋˜๋ฉฐ; ์˜ค๋ฒ„ํ”Œ๋กœ ๋ฐ”์ดํŠธ๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” EMDF ํŽ˜์ด๋กœ๋“œ ๋ฐ์ดํ„ฐ๋‹ค. ์Šฌ๋žฉ ํ• ๋‹น๊ธฐ๋Š” ๊ฐ syncframe๋งˆ๋‹ค ๋ฆฌ์…‹๋˜์–ด ์ธ์ ‘์„ฑ(adjacency)์„ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

Secondary read primitive ๋งŒ์•ฝ emdf_container_length > skipl๋ผ๋ฉด EMDF ํŒŒ์‹ฑ์€ ์ดˆ๊ธฐํ™”๋œ skip ๋ฐ”์ดํŠธ๋ฅผ ๋„˜์–ด ์ฝ๋Š”๋‹ค(OOB read). ๋‹จ๋…์œผ๋กœ๋Š” zeros/known media๋ฅผ leaksํ•˜์ง€๋งŒ, ์ธ์ ‘ ํž™ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์†์ƒํ•œ ํ›„์—๋Š” ์†์ƒ๋œ ์˜์—ญ์„ ๋‹ค์‹œ ์ฝ์–ด ์ต์Šคํ”Œ๋กœ์ž‡์„ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

์ต์Šคํ”Œ๋กœ์ž‡ ๋ ˆ์‹œํ”ผ

  1. variable_bits(8)๋ฅผ ์ด์šฉํ•ด ๋งค์šฐ ํฐ emdf_payload_size๋ฅผ ๊ฐ–๋Š” EMDF๋ฅผ ์ œ์ž‘ํ•˜์—ฌ ํ• ๋‹น๊ธฐ ํŒจ๋”ฉ์ด ๋ž˜ํ•‘๋˜์–ด ์ž‘์€ ์ฒญํฌ๋กœ ๋“ค์–ด๊ฐ€๋„๋ก ํ•œ๋‹ค.
  2. emdf_container_length์„ ์›ํ•˜๋Š” ์˜ค๋ฒ„ํ”Œ๋กœ ๊ธธ์ด(โ‰ค ์ด skip ๋ฐ์ดํ„ฐ ์˜ˆ์‚ฐ)๋กœ ์„ค์ •ํ•˜๊ณ  ์˜ค๋ฒ„ํ”Œ๋กœ ๋ฐ”์ดํŠธ๋ฅผ EMDF ํŽ˜์ด๋กœ๋“œ์— ๋„ฃ๋Š”๋‹ค.
  3. ํ”„๋ ˆ์ž„๋ณ„ evo heap์„ ์กฐ์ž‘ํ•˜์—ฌ ์ž‘์€ ํ• ๋‹น์ด ๋””์ฝ”๋”์˜ static ๋ฒ„ํผ(โ‰ˆ693 KB) ๋˜๋Š” ๋””์ฝ”๋” ์ธ์Šคํ„ด์Šค ๋‹น ํ•œ ๋ฒˆ ํ• ๋‹น๋˜๋Š” dynamic ๋ฒ„ํผ(โ‰ˆ86 KB) ๋‚ด์˜ ๋ชฉํ‘œ ๊ตฌ์กฐ ์•ž์— ์œ„์น˜ํ•˜๋„๋ก ๋งŒ๋“ ๋‹ค.
  4. ์„ ํƒ์ ์œผ๋กœ emdf_container_length > skipl์„ ์„ ํƒํ•ด ์†์ƒ ํ›„ skip ๋ฒ„ํผ์—์„œ ๋ฎ์–ด์“ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

Quram์˜ DNG Opcode ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ฒ„๊ทธ

DNG ํŒŒ์ผ์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋””์ฝ”๋“œ ๋‹จ๊ณ„์—์„œ ์ ์šฉ๋˜๋Š” ์„ธ ๊ฐœ์˜ opcode ๋ฆฌ์ŠคํŠธ๋ฅผ ํฌํ•จํ•œ๋‹ค. Quram์€ Adobe์˜ API๋ฅผ ๋ณต์ œํ–ˆ์ง€๋งŒ, Stage-3์˜ DeltaPerColumn (opcode ID 11) ํ•ธ๋“ค๋Ÿฌ๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ๊ณตํ•œ plane ๊ฒฝ๊ณ„๋ฅผ ์‹ ๋ขฐํ•œ๋‹ค.

DeltaPerColumn์˜ ์‹คํŒจํ•œ plane ๊ฒฝ๊ณ„

  • ๊ณต๊ฒฉ์ž๋Š” Stage-3 ์ด๋ฏธ์ง€๊ฐ€ plane 0โ€“2(RGB)๋งŒ ๋…ธ์ถœํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  plane=5125์™€ planes=5123์„ ์„ค์ •ํ•œ๋‹ค.
  • Quram์€ opcode_last_plane = image_planes + opcode_planes๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉฐ plane + count ๋Œ€์‹  ์‚ฌ์šฉํ•˜๊ณ , ๊ฒฐ๊ณผ plane ๋ฒ”์œ„๊ฐ€ ์ด๋ฏธ์ง€ ์•ˆ์— ๋งž๋Š”์ง€ ๊ฒ€์‚ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋”ฐ๋ผ์„œ ๋ฃจํ”„๋Š” ์™„์ „ํžˆ ์ œ์–ด ๊ฐ€๋Šฅํ•œ ์˜คํ”„์…‹์œผ๋กœ raw_pixel_buffer[plane_index]์— ๋ธํƒ€๋ฅผ ์ž‘์„ฑํ•œ๋‹ค(์˜ˆ: plane 5125 โ‡’ ์˜คํ”„์…‹ 5125 * 2 bytes/pixel = 0x2800). ๊ฐ opcode๋Š” ๋Œ€์ƒ ์œ„์น˜์— 16๋น„ํŠธ ํ”Œ๋กœํŠธ ๊ฐ’(0x6666)์„ ๋”ํ•ด ์ •ํ™•ํ•œ ํž™ OOB add primitive๋ฅผ ๋งŒ๋“ ๋‹ค.

์ฆ๋ถ„์„ ์ž„์˜ ์“ฐ๊ธฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

  • ์ต์Šคํ”Œ๋กœ์ž‡์€ ๋จผ์ € 480๊ฐœ์˜ ์ž˜๋ชป๋œ DeltaPerColumn ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•ด Stage-3 QuramDngImage.bottom/right๋ฅผ ์†์ƒ์‹œ์ผœ ์ดํ›„ opcode๋“ค์ด ๊ฑฐ๋Œ€ํ•œ ์ขŒํ‘œ๋ฅผ in-bounds๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
  • MapTable opcode(opcode 7)๋Š” ๊ทธ๋Ÿฐ ๊ฐ€์งœ ๊ฒฝ๊ณ„๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์‚ผ๋Š”๋‹ค. ์ „์ฒด๊ฐ€ 0์ธ ์น˜ํ™˜ ํ…Œ์ด๋ธ” ๋˜๋Š” -Inf ๋ธํƒ€๋ฅผ ๊ฐ€์ง„ DeltaPerColumn์„ ์‚ฌ์šฉํ•ด ๊ณต๊ฒฉ์ž๋Š” ์ž„์˜ ์˜์—ญ์„ 0์œผ๋กœ ๋งŒ๋“  ๋‹ค์Œ ์ถ”๊ฐ€ ๋ธํƒ€๋ฅผ ์ ์šฉํ•ด ์ •ํ™•ํ•œ ๊ฐ’์„ ์“ด๋‹ค.
  • opcode ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ DNG ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋‚ด๋ถ€์— ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŽ˜์ด๋กœ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ง์ ‘ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ ๋„ ์ˆ˜์‹ญ๋งŒ ๊ฑด์˜ ์“ฐ๊ธฐ๋ฅผ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Scudo ํ•˜์˜ ํž™ ์…ฐ์ดํ•‘

Scudo๋Š” ํฌ๊ธฐ๋ณ„๋กœ ํ• ๋‹น์„ ๋ฒ„ํ‚ทํ™”ํ•œ๋‹ค. Quram์€ ์šฐ์—ฐํžˆ ๋‹ค์Œ ๊ฐ์ฒด๋“ค์„ ๋™์ผํ•œ 0x30๋ฐ”์ดํŠธ ์ฒญํฌ ํฌ๊ธฐ๋กœ ํ• ๋‹นํ•˜์—ฌ ๋™์ผ ์˜์—ญ์— ๋ฐฐ์น˜๋œ๋‹ค(ํž™ ์ƒ์—์„œ 0x40๋ฐ”์ดํŠธ ๊ฐ„๊ฒฉ):

  • QuramDngImage descriptors for Stage 1/2/3
  • QuramDngOpcodeTrimBounds and vendor Unknown opcodes (ID โ‰ฅ14, including ID 23)

์ต์Šคํ”Œ๋กœ์ž‡์€ ์ฒญํฌ๋ฅผ ๊ฒฐ์ •๋ก ์ ์œผ๋กœ ๋ฐฐ์น˜ํ•˜๊ธฐ ์œ„ํ•ด ํ• ๋‹น์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์กฐ์ž‘ํ•œ๋‹ค:

  1. Stage-1 Unknown(23) opcode(20,000๊ฐœ ํ•ญ๋ชฉ)๊ฐ€ 0x30 ์ฒญํฌ๋ฅผ ์Šคํ”„๋ ˆ์ดํ•˜๊ณ  ์ดํ›„ ํ•ด์ œ๋œ๋‹ค.
  2. Stage-2๋Š” ํ•ด๋‹น opcode๋“ค์„ ํ•ด์ œํ•˜๊ณ  ํ•ด์ œ๋œ ์˜์—ญ ์•ˆ์— ์ƒˆ๋กœ์šด QuramDngImage๋ฅผ ๋ฐฐ์น˜ํ•œ๋‹ค.
  3. 240๊ฐœ์˜ Stage-2 Unknown(23) ํ•ญ๋ชฉ์ด ํ•ด์ œ๋˜๊ณ , Stage-3๋Š” ์ฆ‰์‹œ ์ž์‹ ์˜ QuramDngImage์™€ ๋™์ผ ํฌ๊ธฐ์˜ ์ƒˆ๋กœ์šด raw pixel buffer๋ฅผ ํ• ๋‹นํ•ด ๊ทธ ์ž๋ฆฌ๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.
  4. ์กฐ์ž‘๋œ TrimBounds opcode๊ฐ€ ๋ฆฌ์ŠคํŠธ 3์—์„œ ๋จผ์ € ์‹คํ–‰๋˜์–ด Stage-2 ์ƒํƒœ๋ฅผ ํ•ด์ œํ•˜๊ธฐ ์ „์— ๋˜ ๋‹ค๋ฅธ raw pixel buffer๋ฅผ ํ• ๋‹นํ•จ์œผ๋กœ์จ โ€œraw pixel buffer โžœ QuramDngImageโ€œ์˜ ์ธ์ ‘์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.
  5. ์ถ”๊ฐ€ 640๊ฐœ์˜ TrimBounds ํ•ญ๋ชฉ์€ minVersion=1.4.0.1๋กœ ํ‘œ์‹œ๋˜์–ด dispatcher๊ฐ€ ๊ฑด๋„ˆ๋›ฐ์ง€๋งŒ, ํ•ด๋‹น ๊ฐ์ฒด๋“ค์˜ ์‹ค์ œ ํ• ๋‹น์€ ์œ ์ง€๋˜์–ด ๋‚˜์ค‘์— primitive ๋Œ€์ƒ์ด ๋œ๋‹ค.

์ด ์—ฐ์ถœ์€ Stage-3 raw ๋ฒ„ํผ๋ฅผ Stage-3 QuramDngImage ๋ฐ”๋กœ ์•ž์— ๋ฐฐ์น˜ํ•˜๋ฏ€๋กœ, plane ๊ธฐ๋ฐ˜ ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ๋ฌด์ž‘์œ„ ์ƒํƒœ๋ฅผ ์ถฉ๋Œ์‹œํ‚ค์ง€ ์•Š๊ณ  ๋””์Šคํฌ๋ฆฝํ„ฐ ๋‚ด๋ถ€์˜ ํ•„๋“œ๋ฅผ ๋’ค์ง‘๋Š”๋‹ค.

Vendor โ€œUnknownโ€ Opcode๋ฅผ ๋ฐ์ดํ„ฐ ๋ธ”๋กญ์œผ๋กœ ์žฌ์‚ฌ์šฉ

Samsung์€ ๊ณต๊ธ‰์—…์ฒด ์ „์šฉ opcode ID(์˜ˆ: ID 23)์—์„œ ์ƒ์œ„ ๋น„ํŠธ๋ฅผ ์„ค์ •ํ•ด ์ธํ„ฐํ”„๋ฆฌํ„ฐ์—๊ฒŒ ๊ตฌ์กฐ์ฒด๋ฅผ allocateํ•˜๋˜ ์‹คํ–‰์€ ๊ฑด๋„ˆ๋›ฐ๋„๋ก ํ•œ๋‹ค. ์ต์Šคํ”Œ๋กœ์ž‡์€ ๊ทธ๋Ÿฐ ํœด๋ฉด ๊ฐ์ฒด๋“ค์„ ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” ํž™์œผ๋กœ ์•…์šฉํ•œ๋‹ค:

  • Opcode ๋ฆฌ์ŠคํŠธ 1๊ณผ 2์˜ Unknown(23) ํ•ญ๋ชฉ๋“ค์€ ํŽ˜์ด๋กœ๋“œ ๋ฐ”์ดํŠธ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ์—ฐ์† ์Šคํฌ๋ž˜์น˜ํŒจ๋“œ๋กœ ์‚ฌ์šฉ๋œ๋‹ค(raw ๋ฒ„ํผ ๊ธฐ์ค€ ์˜คํ”„์…‹ 0xf000์˜ JOP ์ฒด์ธ๊ณผ 0x10000์˜ ์‰˜ ๋ช…๋ น ๋“ฑ).
  • ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” ๋ฆฌ์ŠคํŠธ 3 ์ฒ˜๋ฆฌ ์‹œ์—๋„ ๊ฐ ๊ฐ์ฒด๋ฅผ opcode๋กœ ์ทจ๊ธ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‚˜์ค‘์— ํ•œ ๊ฐ์ฒด์˜ vtable์„ ์žฅ์•…ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ๊ณต๊ฒฉ์ž ๋ฐ์ดํ„ฐ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€์งœ MapTable ๊ฐ์ฒด ์ œ์ž‘ ๋ฐ ASLR ์šฐํšŒ

MapTable ๊ฐ์ฒด๋Š” TrimBounds๋ณด๋‹ค ํฌ์ง€๋งŒ, ๋ ˆ์ด์•„์›ƒ ์†์ƒ์ด ์ผ์–ด๋‚˜๋ฉด ํŒŒ์„œ๊ฐ€ ์ถ”๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ OOB๋กœ ๊ธฐ๊บผ์ด ์ฝ๋Š”๋‹ค:

  1. ์„ ํ˜• ์“ฐ๊ธฐ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•ด TrimBounds์˜ vtable ํฌ์ธํ„ฐ ์ผ๋ถ€๋ฅผ ์ด์›ƒํ•œ TrimBounds vtable์˜ ํ•˜์œ„ 2๋ฐ”์ดํŠธ๋ฅผ MapTable vtable๋กœ ๋งคํ•‘ํ•˜๋Š” ์กฐ์ž‘๋œ MapTable ์น˜ํ™˜ ํ…Œ์ด๋ธ”๋กœ ๋ฎ์–ด์“ด๋‹ค. ์ง€์›๋˜๋Š” Quram ๋นŒ๋“œ ๊ฐ„์—๋Š” ํ•˜์œ„ ๋ฐ”์ดํŠธ๋งŒ ๋‹ค๋ฅด๋ฏ€๋กœ ๋‹จ์ผ 64K ๋ฃฉ์—… ํ…Œ์ด๋ธ”๋กœ 7๊ฐœ ํŽŒ์›จ์–ด ๋ฒ„์ „๊ณผ ๋ชจ๋“  4 KB ASLR ์Šฌ๋ผ์ด๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. TrimBounds ํ•„๋“œ ๋‚˜๋จธ์ง€(top/left/width/planes)๋ฅผ ํŒจ์น˜ํ•ด ๊ฐ์ฒด๊ฐ€ ๋‚˜์ค‘์— ์‹คํ–‰๋  ๋•Œ ์œ ํšจํ•œ MapTable์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ฒŒ ํ•œ๋‹ค.
  3. ์ œ๋กœ ์ฒ˜๋ฆฌ๋œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ€์งœ opcode๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์น˜ํ™˜ ํ…Œ์ด๋ธ” ํฌ์ธํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ ๋‹ค๋ฅธ opcode์˜ vtable์„ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถœ๋ ฅ ๋ฐ”์ดํŠธ๋Š” libimagecodec.quram.so ๋˜๋Š” ๊ทธ GOT์˜ ์ €์ฐจ ์ฃผ์†Œ๋“ค์ด leaked ๋œ๋‹ค.
  4. ์ถ”๊ฐ€ MapTable ํŒจ์Šค๋ฅผ ์ ์šฉํ•ด ๊ทธ 2๋ฐ”์ดํŠธ leaks๋ฅผ __ink_jpeg_enc_process_image+64, QURAMWINK_Read_IO2+124, qpng_check_IHDR+624, libc์˜ __system_property_get ์ง„์ž…์  ๊ฐ™์€ ๊ฐ€์ ฏ์„ ํ–ฅํ•œ ์˜คํ”„์…‹์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”๋ชจ๋ฆฌ ์œ ์ถœ API ์—†์ด๋„ ์Šคํ”„๋ ˆ์ด๋œ opcode ์˜์—ญ ์•ˆ์—์„œ ์ „์ฒด ์ฃผ์†Œ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์žฌ๊ตฌ์„ฑํ•œ๋‹ค.

JOP โžœ system() ์ „ํ™˜ ํŠธ๋ฆฌ๊ฑฐ

๊ฐ€์ ฏ ํฌ์ธํ„ฐ์™€ ์‰˜ ๋ช…๋ น์ด opcode ์Šคํ”„๋ ˆ์ด ๋‚ด๋ถ€์— ์ค€๋น„๋˜๋ฉด:

  1. ๋งˆ์ง€๋ง‰ DeltaPerColumn ์“ฐ๊ธฐ ๋ฌผ๊ฒฐ์ด Stage-3 QuramDngImage์˜ ์˜คํ”„์…‹ 0x22์— 0x0100์„ ๋”ํ•˜์—ฌ raw ๋ฒ„ํผ ํฌ์ธํ„ฐ๋ฅผ 0x10000๋งŒํผ ์ด๋™์‹œํ‚ค๊ณ  ์ด์ œ ๊ณต๊ฒฉ์ž ๋ช…๋ น ๋ฌธ์ž์—ด์„ ์ฐธ์กฐํ•˜๊ฒŒ ํ•œ๋‹ค.
  2. ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” 1040๊ฐœ์˜ Unknown(23) opcode์˜ ๊ผฌ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์†์ƒ๋œ ํ•ญ๋ชฉ์€ vtable์ด ์˜คํ”„์…‹ 0xf000์˜ ์œ„์กฐ ํ…Œ์ด๋ธ”๋กœ ๊ต์ฒด๋˜์–ด QuramDngOpcode::aboutToApply๊ฐ€ ๊ฐ€์งœ ํ…Œ์ด๋ธ”์˜ 4๋ฒˆ์งธ ํ•ญ๋ชฉ์ธ qpng_read_data๋ฅผ ํ•ด์„ํ•œ๋‹ค.
  3. ์—ฐ๊ฒฐ๋œ ๊ฐ€์ ฏ๋“ค์€ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค: QuramDngImage ํฌ์ธํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๊ณ  raw ๋ฒ„ํผ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก 0x20์„ ๋”ํ•˜๊ณ , ์—ญ์ฐธ์กฐํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ x19/x0์— ๋ณต์‚ฌํ•œ ๋‹ค์Œ system์œผ๋กœ ์žฌ์ž‘์„ฑ๋œ GOT ์Šฌ๋กฏ์„ ํ†ตํ•ด ์ ํ”„ํ•œ๋‹ค. raw ๋ฒ„ํผ ํฌ์ธํ„ฐ๊ฐ€ ์ด์ œ ๊ณต๊ฒฉ์ž ๋ฌธ์ž์—ด๊ณผ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ข… ๊ฐ€์ ฏ์€ com.samsung.ipservice ๋‚ด์—์„œ system(<shell command>)๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

ํ• ๋‹น๊ธฐ(allocator) ๋ณ€ํ˜•์— ๋Œ€ํ•œ ์ฃผ์„

๋‘ ๊ฐ€์ง€ ํŽ˜์ด๋กœ๋“œ ๊ณ„์—ด์ด ์กด์žฌํ•œ๋‹ค: jemalloc์šฉ์œผ๋กœ ์กฐ์ •๋œ ๊ฒƒ๊ณผ scudo์šฉ. ์ด๋“ค์€ ์ธ์ ‘์„ฑ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด opcode ๋ธ”๋ก์˜ ์ˆœ์„œ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•˜์ง€๋งŒ ๋™์ผํ•œ ๋…ผ๋ฆฌ์  ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ(DeltaPerColumn ๋ฒ„๊ทธ โžœ MapTable zero/write โžœ bogus vtable โžœ JOP)๋ฅผ ๊ณต์œ ํ•œ๋‹ค. Scudo์˜ quarantine ๋น„ํ™œ์„ฑํ™”๋Š” 0x30๋ฐ”์ดํŠธ freelist ์žฌ์‚ฌ์šฉ์„ ๊ฒฐ์ •๋ก ์ ์œผ๋กœ ๋งŒ๋“ค๊ณ , jemalloc์€ tile/subIFD ํฌ๊ธฐ ์กฐ์ •์œผ๋กœ size-class๋ฅผ ์ œ์–ดํ•œ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

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