结构化文件格式漏洞检测 (0‑Click Chains)

Reading time: 9 minutes

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

本页总结了通过验证格式的结构不变量来检测 0‑click 移动利用文件的实用技术,而不是依赖字节签名。该方法可推广到不同样本、多态变体以及滥用相同解析器逻辑的未来漏洞利用。

关键思想:编码那些只有在到达易受攻击的解码器/解析器状态时才会出现的结构不可能性和跨字段不一致。

See also:

PDF File analysis

为什么用结构,而不是签名

当武器化样本不可用且载荷字节发生变化时,传统的 IOC/YARA 策略会失效。结构检测检查容器声明的布局与格式实现从数学或语义上可能的情况之间的差异。

常见检查:

  • 验证由规范和安全实现推导出的表大小和边界
  • 标记嵌入字节码中非法/未记录的操作码或状态转换
  • 交叉校验元数据 VS 实际编码流组件
  • 检测表明解析器混淆或整数溢出设置的矛盾字段

下面是针对多个高影响链的具体、经过实战验证的模式。


PDF/JBIG2 – FORCEDENTRY (CVE‑2021‑30860)

Target: JBIG2 symbol dictionaries embedded inside PDFs (often used in mobile MMS parsing).

结构性信号:

  • 会在正常内容中不可能出现的矛盾字典状态,而该状态是触发算术解码溢出的必要条件。
  • 在细化编码期间,可疑地使用全局段并伴随异常的符号计数。

伪逻辑:

pseudo
# 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")

Practical triage:

  • 识别并提取 PDF 中的 JBIG2 流
  • 使用 pdfid/pdf-parser/peepdf 定位并转储流
  • 根据 JBIG2 规范验证算术编码标志和符号字典参数

Notes:

  • 在没有嵌入 payload 签名的情况下也有效
  • 实际中误报率低,因为被标记的状态在数学上不一致

WebP/VP8L – BLASTPASS (CVE‑2023‑4863)

Target: WebP lossless (VP8L) Huffman prefix‑code tables.

Structural signals:

  • 构建后的 Huffman 表总大小超过参考/已修补实现期望的安全上限,暗示溢出前置条件。

Pseudo‑logic:

pseudo
# 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 容器的 chunks:VP8X + VP8L
  • 解析 VP8L 前缀码并计算实际分配的表大小

注:

  • 对 payload 的字节级多态性具有鲁棒性
  • 界限来源于上游限制/补丁分析

TrueType – TRIANGULATION (CVE‑2023‑41990)

目标:位于 fpgm/prep/glyf 程序内的 TrueType 字节码。

结构信号:

  • 利用链使用的 Apple 解释器中存在未记录/禁止的 opcode。

伪逻辑:

pseudo
# 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,可能会产生少见的误报;使用辅助工具进行验证

DNG/TIFF – CVE‑2025‑43300

Target: DNG/TIFF image metadata VS actual component count in encoded stream (e.g., JPEG‑Lossless SOF3).

结构性信号:

  • EXIF/IFD 字段(SamplesPerPixel, PhotometricInterpretation)与从用于流水线的图像流头解析出的分量计数不一致。

伪逻辑:

pseudo
# 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")

Practical triage:

  • 解析主 IFD 和 EXIF 标签
  • 定位并解析嵌入的 JPEG‑Lossless 头(SOF3),并比较组件数量

Notes:

  • 现实环境中已被报导被利用;非常适合进行结构一致性检查

Implementation patterns and performance

A practical scanner should:

  • 自动检测文件类型并只派发相关分析器(PDF/JBIG2, WebP/VP8L, TTF, DNG/TIFF)
  • 采用流式/部分解析以最小化内存分配并支持早期终止
  • 并行运行分析(线程池)以进行批量分流

Example workflow with ElegantBouncer (open‑source Rust implementation of these checks):

bash
# 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 提示与边缘情况

  • 嵌入对象:PDF 可能嵌入图像 (JBIG2) 和字体 (TrueType);提取并递归扫描
  • 解压安全:使用在分配前对表/缓冲区进行硬性限制的库
  • 误报:保持规则保守,优先标记在规范下不可能出现的矛盾
  • 版本漂移:当上游解析器更改限制时,重新基准化边界(例如 VP8L 表大小)

相关工具

  • ElegantBouncer – 用于上述检测的结构化扫描器
  • pdfid/pdf-parser/peepdf – PDF 对象提取和静态分析
  • pdfcpu – PDF linter/清理器
  • 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