๊ตฌ์กฐ์  ํŒŒ์ผ ํฌ๋งท ์ต์Šคํ”Œ๋กœ์ž‡ ํƒ์ง€ (0โ€‘Click Chains)

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

์ด ํŽ˜์ด์ง€๋Š” ํฌ๋งท์˜ ๊ตฌ์กฐ์  ๋ถˆ๋ณ€์„ฑ(structural invariants)์„ ๊ฒ€์ฆํ•˜์—ฌ byte signatures์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  0โ€‘click ๋ชจ๋ฐ”์ผ exploit ํŒŒ์ผ์„ ํƒ์ง€ํ•˜๋Š” ์‹ค๋ฌด ๊ธฐ๋ฒ•๋“ค์„ ์š”์•ฝํ•ฉ๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ๋ฒ•์€ ๋™์ผํ•œ parser logic์„ ์•…์šฉํ•˜๋Š” ์ƒ˜ํ”Œ, polymorphic ๋ณ€ํ˜• ๋ฐ ํ–ฅํ›„ exploit ์ „๋ฐ˜์— ๊ฑธ์ณ ์ผ๋ฐ˜ํ™”๋ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์•„์ด๋””์–ด: ์ทจ์•ฝํ•œ decoder/parser ์ƒํƒœ์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ์—๋งŒ ๋‚˜ํƒ€๋‚˜๋Š” ๊ตฌ์กฐ์  ๋ถˆ๊ฐ€๋Šฅ์„ฑ(structural impossibilities)๊ณผ ํ•„๋“œ ๊ฐ„ ๋ถˆ์ผ์น˜(crossโ€‘field inconsistencies)๋ฅผ ์ธ์ฝ”๋”ฉํ•ฉ๋‹ˆ๋‹ค.

See also:

PDF File analysis

์™œ ๊ตฌ์กฐ์ธ๊ฐ€, ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ์•„๋‹Œ๊ฐ€

๋ฌด๊ธฐํ™”๋œ ์ƒ˜ํ”Œ์„ ๊ตฌํ•  ์ˆ˜ ์—†๊ณ  payload bytes๊ฐ€ ๋ณ€์ดํ•  ๋•Œ ์ „ํ†ต์ ์ธ IOC/YARA ํŒจํ„ด์€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ์  ํƒ์ง€๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์„ ์–ธํ•œ ๋ ˆ์ด์•„์›ƒ๊ณผ ํฌ๋งท ๊ตฌํ˜„์—์„œ ์ˆ˜ํ•™์  ๋˜๋Š” ์˜๋ฏธ๋ก ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ์‚ฌ์ด๋ฅผ ๋น„๊ต ๊ฒ€์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๊ฒ€์‚ฌ:

  • ์ŠคํŽ™๊ณผ ์•ˆ์ „ํ•œ ๊ตฌํ˜„์—์„œ ๋„์ถœ๋œ ํ…Œ์ด๋ธ” ํฌ๊ธฐ์™€ ๊ฒฝ๊ณ„ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ
  • ์ž„๋ฒ ๋””๋“œ bytecode์—์„œ ๋ถˆ๋ฒ•/๋ฌธ์„œํ™”๋˜์ง€ ์•Š์€ opcodes๋‚˜ ์ƒํƒœ ์ „ํ™˜ ํ”Œ๋ž˜๊ทธ
  • metadata์™€ ์‹ค์ œ ์ธ์ฝ”๋”ฉ๋œ ์ŠคํŠธ๋ฆผ ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„ ๊ต์ฐจ ๊ฒ€์ฆ
  • parser ํ˜ผ๋ž€์ด๋‚˜ integer overflow ์„ค์ •์„ ์‹œ์‚ฌํ•˜๋Š” ๋ชจ์ˆœ๋œ ํ•„๋“œ ํƒ์ง€

์•„๋ž˜์—๋Š” ์—ฌ๋Ÿฌ ๊ณ ์˜ํ–ฅ ์ฒด์ธ์— ๋Œ€ํ•ด ํ˜„์žฅ์—์„œ ๊ฒ€์ฆ๋œ ๊ตฌ์ฒด์  ํŒจํ„ด๋“ค์ด ์ •๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


PDF/JBIG2 โ€“ FORCEDENTRY (CVEโ€‘2021โ€‘30860)

Target: PDFs ๋‚ด๋ถ€์— ์ž„๋ฒ ๋””๋“œ๋œ JBIG2 symbol dictionaries (์ข…์ข… ๋ชจ๋ฐ”์ผ MMS ํŒŒ์‹ฑ์—์„œ ์‚ฌ์šฉ).

๊ตฌ์กฐ์  ์‹ ํ˜ธ:

  • arithmetic decoding์—์„œ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ์œ ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ, ์ •์ƒ ์ฝ˜ํ…์ธ ์—์„œ๋Š” ๋ฐœ์ƒํ•  ์ˆ˜ ์—†๋Š” ๋ชจ์ˆœ๋œ dictionary ์ƒํƒœ
  • refinement coding ๋™์•ˆ ๋น„์ •์ƒ์ ์ธ ์‹ฌ๋ณผ ๊ฐœ์ˆ˜์™€ ๊ฒฐํ•ฉ๋œ global segments์˜ ์˜์‹ฌ์Šค๋Ÿฌ์šด ์‚ฌ์šฉ

Pseudoโ€‘logic:

# Detecting impossible dictionary state used by FORCEDENTRY
if input_symbols_count == 0 and (ex_syms > 0 and ex_syms < 4):
mark_malicious("JBIG2 impossible symbol dictionary state")

์‹ค๋ฌด ํŠธ๋ฆฌ์•„์ง€:

  • PDF์—์„œ JBIG2 ์ŠคํŠธ๋ฆผ์„ ์‹๋ณ„ํ•˜๊ณ  ์ถ”์ถœ
  • pdfid/pdf-parser/peepdf๋ฅผ ์‚ฌ์šฉํ•ด ์ŠคํŠธ๋ฆผ์„ ์ฐพ์•„ ๋คํ”„
  • ์‚ฐ์ˆ  ๋ถ€ํ˜ธํ™” ํ”Œ๋ž˜๊ทธ์™€ ์‹ฌ๋ณผ ์‚ฌ์ „ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ JBIG2 ์ŠคํŽ™์— ๋Œ€ํ•ด ๊ฒ€์ฆ

Notes:

  • ์ž„๋ฒ ๋””๋“œ payload ์„œ๋ช… ์—†์ด ๋™์ž‘
  • ํ”Œ๋ž˜๊ทธ๋œ ์ƒํƒœ๊ฐ€ ์ˆ˜ํ•™์ ์œผ๋กœ ๋ถˆ์ผ์น˜ํ•˜๋ฏ€๋กœ ์‹ค์ œ๋กœ FP๊ฐ€ ๋‚ฎ์Œ

WebP/VP8L โ€“ BLASTPASS (CVEโ€‘2023โ€‘4863)

Target: WebP lossless (VP8L) Huffman prefixโ€‘code tables.

Structural signals:

  • ๊ตฌ์„ฑ๋œ Huffman ํ…Œ์ด๋ธ”์˜ ์ด ํฌ๊ธฐ๊ฐ€ ์ฐธ์กฐ/ํŒจ์น˜๋œ ๊ตฌํ˜„์—์„œ ๊ธฐ๋Œ€๋˜๋Š” ์•ˆ์ „ํ•œ ์ƒํ•œ์„ ์ดˆ๊ณผํ•˜์—ฌ overflow ์ „์ œ์กฐ๊ฑด์„ ์˜๋ฏธํ•จ.

Pseudoโ€‘logic:

# Detect malformed Huffman table construction triggering overflow
let total_size = sum(table_sizes)
if total_size > 2954:   # example bound: FIXED_TABLE_SIZE + MAX_TABLE_SIZE
mark_malicious("VP8L oversized Huffman tables")

์‹ค๋ฌด์  ๋ถ„๋ฅ˜:

  • WebP ์ปจํ…Œ์ด๋„ˆ ์ฒญํฌ ํ™•์ธ: VP8X + VP8L
  • VP8L prefix codes๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ  ์‹ค์ œ ํ• ๋‹น๋œ ํ…Œ์ด๋ธ” ํฌ๊ธฐ๋ฅผ ๊ณ„์‚ฐ

Notes:

  • payload์˜ ๋ฐ”์ดํŠธ ์ˆ˜์ค€ ๋‹คํ˜•์„ฑ์— ๋Œ€ํ•ด ๊ฐ•๊ฑดํ•จ
  • ๊ฒฝ๊ณ„๋Š” upstream ์ œํ•œ/ํŒจ์น˜ ๋ถ„์„์—์„œ ๋„์ถœ๋จ

TrueType โ€“ TRIANGULATION (CVEโ€‘2023โ€‘41990)

Target: fpgm/prep/glyf programs ๋‚ด๋ถ€์˜ TrueType bytecode.

Structural signals:

  • ์ต์Šคํ”Œ๋กœ์ž‡ ์ฒด์ธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” Apple์˜ ์ธํ„ฐํ”„๋ฆฌํ„ฐ์— ๋ฌธ์„œํ™”๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ๊ธˆ์ง€๋œ opcodes์˜ ์กด์žฌ.

Pseudoโ€‘logic:

# Flag undocumented TrueType opcodes leveraged by TRIANGULATION
switch opcode:
case 0x8F, 0x90:
mark_malicious("Undocumented TrueType bytecode")
default:
continue

์‹ค๋ฌด ํŠธ๋ฆฌ์•„์ง€:

  • ํฐํŠธ ํ…Œ์ด๋ธ” ๋คํ”„(์˜ˆ: fontTools/ttx ์‚ฌ์šฉ) ๋ฐ fpgm/prep/glyf ํ”„๋กœ๊ทธ๋žจ ์Šค์บ”
  • ์กด์žฌ ์—ฌ๋ถ€ ๊ฒ€์‚ฌ๋งŒ์œผ๋กœ๋„ ๊ฐ€์น˜ ํ™•๋ณด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์™„์ „ ์—๋ฎฌ๋ ˆ์ดํŠธํ•  ํ•„์š” ์—†์Œ

์ฐธ๊ณ :

  • ๋น„ํ‘œ์ค€ ํฐํŠธ์— ์•Œ ์ˆ˜ ์—†๋Š” opcodes๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ ๋“œ๋ฌผ๊ฒŒ FP๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ; ๋ณด์กฐ ํˆด๋กœ ๊ฒ€์ฆ

DNG/TIFF โ€“ CVEโ€‘2025โ€‘43300

๋Œ€์ƒ: DNG/TIFF ์ด๋ฏธ์ง€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ์ธ์ฝ”๋”ฉ๋œ ์ŠคํŠธ๋ฆผ์˜ ์‹ค์ œ ์ปดํฌ๋„ŒํŠธ ์ˆ˜(์˜ˆ: JPEGโ€‘Lossless SOF3) ๊ฐ„ ๋ถˆ์ผ์น˜

๊ตฌ์กฐ์  ์‹ ํ˜ธ:

  • EXIF/IFD ํ•„๋“œ(SamplesPerPixel, PhotometricInterpretation)์™€ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ด๋ฏธ์ง€ ์ŠคํŠธ๋ฆผ ํ—ค๋”์—์„œ ํŒŒ์‹ฑ๋œ ์ปดํฌ๋„ŒํŠธ ์ˆ˜ ๊ฐ„ ๋ถˆ์ผ์น˜

์˜์‚ฌ ๋กœ์ง:

# Metadata claims 2 samples per pixel but stream header exposes only 1 component
if samples_per_pixel == 2 and sof3_components == 1:
mark_malicious("DNG/TIFF metadata vs. stream mismatch")

์‹ค์ „ ์„ ๋ณ„:

  • ์ฃผ์š” IFD ๋ฐ EXIF ํƒœ๊ทธ๋ฅผ ํŒŒ์‹ฑ
  • ์ž„๋ฒ ๋””๋“œ JPEGโ€‘Lossless ํ—ค๋”(SOF3)๋ฅผ ์ฐพ์•„ ํŒŒ์‹ฑํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ ์ˆ˜๋ฅผ ๋น„๊ต

์ฐธ๊ณ :

  • ์‹ค์ œ๋กœ ์•…์šฉ ์‚ฌ๋ก€๊ฐ€ ๋ณด๊ณ ๋จ; ๊ตฌ์กฐ์  ์ผ๊ด€์„ฑ ๊ฒ€์‚ฌ์— ๋งค์šฐ ์ ํ•ฉ

DNG/TIFF โ€“ Samsung libimagecodec.quram.so (CVEโ€‘2025โ€‘21042) + Appended ZIP payload (LANDFALL)

Target: DNG (TIFFโ€‘derived) images carrying an embedded ZIP archive appended at EOF to stage native payloads after parser RCE.

Structural signals:

  • File magic indicates TIFF/DNG (II*\x00 or MM\x00*) but filename mimics JPEG (e.g., .jpg/.jpeg WhatsApp naming).
  • Presence of a ZIP Local File Header or EOCD magic near EOF (PK\x03\x04 or PK\x05\x06) that is not referenced by any TIFF IFD data region (strips/tiles/JPEGInterchangeFormat).
  • Unusually large trailing data beyond the last referenced IFD data block (hundreds of KB to MB), consistent with a bundled archive of .so modules.

Pseudoโ€‘logic:

# Detect appended ZIP payload hidden after DNG/TIFF data (Samsung chain)
if is_tiff_dng(magic):
ext = file_extension()
if ext in {".jpg", ".jpeg"}: mark_suspicious("Extension/magic mismatch: DNG vs JPEG")

zip_off = rfind_any(["PK\x05\x06", "PK\x03\x04"], search_window_last_n_bytes=8*1024*1024)
if zip_off >= 0:
end_dng = approx_end_of_tiff_data()  # max(end of Strip/Tile/JPEGInterchangeFormat regions)
if zip_off > end_dng + 0x200:
mark_malicious("DNG with appended ZIP payload (LANDFALLโ€‘style)")

์‹ค๋ฌด ํŠธ๋ฆฌ์•„์ง€:

  • ํ˜•์‹๊ณผ ์ด๋ฆ„ ๊ตฌ๋ถ„:
  • ํŒŒ์ผ ์ƒ˜ํ”Œ; exiftool -s -FileType -MIMEType sample
  • EOF ๊ทผ์ฒ˜์˜ ZIP footer/header ์ฐพ๊ธฐ ๋ฐ carve:
  • off=$(grep -aboa -E $โ€˜PK\x05\x06|PK\x03\x04โ€™ sample.dng | tail -n1 | cut -d: -f1)
  • dd if=sample.dng of=payload.zip bs=1 skip=โ€œ$offโ€
  • zipdetails -v payload.zip; unzip -l payload.zip
  • TIFF ๋ฐ์ดํ„ฐ ์˜์—ญ์ด ์บ๋น™ํ•œ ZIP ์˜์—ญ๊ณผ ๊ฒน์น˜์ง€ ์•Š๋Š”์ง€ ์ •ํ•ฉ์„ฑ ๊ฒ€์‚ฌ:
  • tiffdump -D sample.dng | egrep โ€˜StripOffsets|TileOffsets|JPEGInterchangeFormat|StripByteCounts|TileByteCounts|JPEGInterchangeFormatLengthโ€™
  • max(offset+length) << zip_off ๊ฒ€์ฆ
  • ์ผ๊ด„ ์นด๋น™(๋Œ€๋žต): binwalk -eM sample.dng

Notes:

  • ์‹ค์ œ ๊ณต๊ฒฉ์—์„œ Samsungโ€™s libimagecodec.quram.so (CVEโ€‘2025โ€‘21042)๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์•…์šฉ๋จ. ์ฒจ๋ถ€๋œ ZIP์—๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ(์˜ˆ: loader + SELinux policy editor)์ด ํฌํ•จ๋˜์–ด RCE ์ดํ›„ ์ถ”์ถœ/์‹คํ–‰๋จ.

Implementation patterns and performance

์‹ค์šฉ์ ์ธ ์Šค์บ๋„ˆ๋Š” ๋‹ค์Œ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  • ํŒŒ์ผ ํƒ€์ž…์„ ์ž๋™ ๊ฐ์ง€ํ•˜๊ณ  ๊ด€๋ จ๋œ ๋ถ„์„๊ธฐ(PDF/JBIG2, WebP/VP8L, TTF, DNG/TIFF)๋งŒ ์‹คํ–‰ํ•˜๋„๋ก ๋ถ„๊ธฐ
  • ํ• ๋‹น์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์กฐ๊ธฐ ์ข…๋ฃŒ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ŠคํŠธ๋ฆฌ๋ฐ/๋ถ€๋ถ„ ํŒŒ์‹ฑ ์‚ฌ์šฉ
  • ๋Œ€๋Ÿ‰ ํŠธ๋ฆฌ์•„์ง€๋ฅผ ์œ„ํ•ด ๋ถ„์„์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰(์Šค๋ ˆ๋“œ ํ’€ ์‚ฌ์šฉ)

ElegantBouncer (openโ€‘source Rust implementation of these checks)๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ ์›Œํฌํ”Œ๋กœ์šฐ:

# Scan a path recursively with structural detectors
$ elegant-bouncer --scan /path/to/directory

# Optional TUI for parallel scanning and realโ€‘time alerts
$ elegant-bouncer --tui --scan /path/to/samples

DFIR ํŒ ๋ฐ ์˜ˆ์™ธ ์‚ฌ๋ก€

  • ์ž„๋ฒ ๋””๋“œ ๊ฐ์ฒด: PDFs๋Š” ์ด๋ฏธ์ง€ (JBIG2) ๋ฐ ํฐํŠธ (TrueType)๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ถ”์ถœํ•˜์—ฌ ์žฌ๊ท€์ ์œผ๋กœ ์Šค์บ”ํ•˜์„ธ์š”
  • ์••์ถ• ํ•ด์ œ ์•ˆ์ „์„ฑ: ํ• ๋‹น ์ „์— ํ…Œ์ด๋ธ”/๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ์—„๊ฒฉํžˆ ์ œํ•œํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”
  • ์˜คํƒ์ง€: ๊ทœ์น™์„ ๋ณด์ˆ˜์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ณ , ์ŠคํŽ™์ƒ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ชจ์ˆœ์„ ์šฐ์„ ์‹œํ•˜์„ธ์š”
  • ๋ฒ„์ „ ๋“œ๋ฆฌํ”„ํŠธ: ์ƒ์œ„ ํŒŒ์„œ๊ฐ€ ์ œํ•œ์„ ๋ณ€๊ฒฝํ•  ๋•Œ ๊ฒฝ๊ณ„๊ฐ’(์˜ˆ: VP8L table sizes)์„ ์žฌ๊ธฐ์ค€ํ™”ํ•˜์„ธ์š”

  • ElegantBouncer โ€“ ์œ„์˜ ํƒ์ง€๋“ค์„ ์œ„ํ•œ ๊ตฌ์กฐ์  ์Šค์บ๋„ˆ
  • pdfid/pdf-parser/peepdf โ€“ PDF ๊ฐ์ฒด ์ถ”์ถœ ๋ฐ ์ •์  ๋ถ„์„
  • pdfcpu โ€“ PDF ๋ฆฐํ„ฐ/๋ฌดํ•ดํ™” ๋„๊ตฌ
  • fontTools/ttx โ€“ TrueType ํ…Œ์ด๋ธ” ๋ฐ ๋ฐ”์ดํŠธ์ฝ”๋“œ ๋คํ”„
  • exiftool โ€“ TIFF/DNG/EXIF ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฝ๊ธฐ
  • dwebp/webpmux โ€“ WebP ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฐ ์ฒญํฌ ํŒŒ์‹ฑ

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