構造的ファイルフォーマットエクスプロイト検出 (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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
このページは、バイトシグネチャに頼る代わりにフォーマットの構造的不変量を検証することで 0‑click モバイルエクスプロイトファイルを検出する実践的手法を要約します。 このアプローチはサンプル間、ポリモーフィックな変種、そして同じパーサロジックを悪用する将来のエクスプロイトにも一般化します。
キーアイデア: 脆弱なデコーダ/パーサ状態に到達したときにのみ現れる構造上の不可能性やフィールド間の不整合をエンコードすること。
参照:
なぜシグネチャでなく構造か
weaponized samples が利用できずペイロードのバイトが変異すると、従来の IOC/YARA パターンは失敗します。構造的検出は、コンテナが宣言したレイアウトとフォーマット実装で数学的または意味論的に可能な範囲を比較検査します。
典型的なチェック:
- 仕様や安全な実装から導出されるテーブルサイズや境界の検証
- 埋め込み bytecode における違法/未文書の opcodes や状態遷移の検出
- メタデータと実際にエンコードされたストリーム要素の相互検査
- パーサの混乱や整数オーバーフローの仕掛けを示す矛盾するフィールドの検出
以下は、複数の高影響チェーンに対するフィールドテスト済みの具体的パターンです。
PDF/JBIG2 – FORCEDENTRY (CVE‑2021‑30860)
対象: PDF 内に埋め込まれた JBIG2 シンボル辞書(しばしばモバイルの MMS 解析で使用される)。
構造的シグナル:
- 正常なコンテンツでは発生し得ない矛盾した辞書状態。これは算術デコードでのオーバーフローを引き起こすために必要とされる。
- 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 specに従っているか検証する
注意:
- 埋め込まれた payload 署名がなくても動作する
- 実務上、FPは低い。フラグ付けされた状態が数学的に矛盾しているため
WebP/VP8L – BLASTPASS (CVE‑2023‑4863)
対象: WebP lossless (VP8L) Huffman prefix‑code tables.
構造的シグナル:
- 構築された Huffman テーブルの総サイズが reference/patched implementations が想定する安全上限を超えており、オーバーフローの前提条件を示唆する。
擬似ロジック:
# 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を解析し、実際に割り当てられたテーブルサイズを計算する
備考:
- payloadのbyte‑level polymorphismに対して堅牢
- 上限は上流の制限/パッチ解析から導出
TrueType – TRIANGULATION (CVE‑2023‑41990)
対象: fpgm/prep/glyf programs 内の TrueType bytecode.
構造的シグナル:
- exploit chainで使用されるAppleのinterpreter内に、未文書/禁止のopcodesが存在する。
擬似ロジック:
# Flag undocumented TrueType bytecode leveraged by TRIANGULATION
switch opcode:
case 0x8F, 0x90:
mark_malicious("Undocumented TrueType bytecode")
default:
continue
実用的トリアージ:
- フォントテーブルをダンプする(例: fontTools/ttx を使用)および fpgm/prep/glyf プログラムをスキャンする
- 存在チェックの目的ならインタプリタを完全にエミュレートする必要はない
注意:
- 非標準フォントが未知の opcodes を含む場合、稀に偽陽性 (FPs) を生じる可能性がある;二次的なツールで検証すること
DNG/TIFF – CVE‑2025‑43300
Target: DNG/TIFF image metadata VS actual component count in encoded stream (e.g., JPEG‑Lossless SOF3).
Structural signals:
- パイプラインで使用されるイメージストリームヘッダから解析されたコンポーネント数と、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")
Practical triage:
- 主要な IFD と EXIF タグを解析する
- 埋め込まれた JPEG‑Lossless ヘッダ (SOF3) を検出・解析し、コンポーネント数を比較する
Notes:
- 実際に悪用が報告されている。構造的一貫性チェックの優れた候補
DNG/TIFF – Samsung libimagecodec.quram.so (CVE‑2025‑21042) + 末尾に追加された ZIP ペイロード (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*\x00orMM\x00*) but filename mimics JPEG (e.g.,.jpg/.jpegWhatsApp naming). - Presence of a ZIP Local File Header or EOCD magic near EOF (
PK\x03\x04orPK\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)")
Practical triage:
- 形式と名前を識別する:
- file sample; exiftool -s -FileType -MIMEType sample
- Locate ZIP footer/header near EOF and 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’
- Verify
max(offset+length) << zip_off - One‑shot carving (coarse): binwalk -eM sample.dng
Notes:
- 実際にSamsung’s libimagecodec.quram.so (CVE‑2025‑21042) に対して野外で悪用された。付加されたZIPにはネイティブモジュール(例: loader + SELinux policy editor)が含まれ、RCE後に抽出/実行された。
HEIF/AVIF – libheif & libde265 (CVE‑2024‑41311, CVE‑2025‑29482, CVE‑2025‑65586)
Target: HEIF/AVIF containers parsed by libheif (and ImageIO/OpenImageIO builds that bundle it).
構造上のシグナル:
- Overlay items (iloc/iref) whose source rectangles exceed the base image dimensions or whose offsets are negative/overflowing → triggers ImageOverlay::parse out‑of‑bounds (CVE‑2024‑41311).
- Grid items referencing non‑existent item IDs (ImageItem_Grid::get_decoder NULL deref, CVE‑2025‑43967) – 簡単な構造チェックで済み、デコードは不要。
- SAO/loop‑filter parameters or tile counts that force table allocations larger than the max allowed by libde265 (CVE‑2025‑29482): 過度に大きなバンド数やスライス寸法。
- Box length/extent sizes that point past EOF (typical in CVE‑2025‑65586 PoCs discovered via fuzzing).
Pseudo‑logic:
# HEIF overlay bounds check
for overlay in heif_overlays:
if overlay.x < 0 or overlay.y < 0: mark_malicious("HEIF overlay negative offset")
if overlay.x + overlay.w > base.w or overlay.y + overlay.h > base.h:
mark_malicious("HEIF overlay exceeds base image (CVE‑2024‑41311 pattern)")
# Grid item reference validation
for grid in heif_grids:
if any(ref_id not in item_ids):
mark_malicious("HEIF grid references missing item (CVE‑2025‑43967 pattern)")
# SAO / slice allocation guard
if sao_band_count > 32 or (tile_cols * tile_rows) > MAX_TILES or sao_eo_class not in {0..3}:
mark_malicious("HEIF SAO/tiling exceeds safe bounds (CVE‑2025‑29482 pattern)")
Practical triage:
- 完全にデコードせずにメタデータの簡易チェック:
- heif-info sample.heic
- oiiotool –info –stats sample.heic
- extents とファイルサイズの整合性検証:
- heif-convert –verbose sample.heic /dev/null | grep -i extent
- 手動検査のために疑わしい boxes を抽出:
- dd if=sample.heic bs=1 skip=$((box_off)) count=$((box_len)) of=box.bin
Notes:
- これらのチェックは重いデコードを行う前に構造の不正を検出します。許可/拒否の判断のみが必要な mail/MMS ゲートウェイで有用です。
- libheif の制限はバージョン間で変化するため、上流が変更されたら定数を再ベースライン化してください(1.18.x → 1.21.x で overlay と grid の検証が厳格化されました)。
実装パターンとパフォーマンス
実用的なスキャナーは次を行うべきです:
- ファイルタイプを自動検出し、関連するアナライザのみを呼び出す (PDF/JBIG2, WebP/VP8L, TTF, DNG/TIFF, HEIF/AVIF)
- 割り当てを最小化し早期終了を可能にするためにストリーム/部分パースを行う
- 大量トリアージのため分析を並列(thread‑pool)で実行する
Example workflow with 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 テーブルサイズ)
Related tools
- ElegantBouncer – 上記の検出向けの構造スキャナ
- pdfid/pdf-parser/peepdf – PDF オブジェクトの抽出と静的解析
- pdfcpu – PDF のリンター/サニタイズツール
- fontTools/ttx – TrueType テーブルとバイトコードをダンプ
- exiftool – TIFF/DNG/EXIF メタデータを読み取る
- dwebp/webpmux – WebP のメタデータとチャンクを解析
- heif-info/heif-convert (libheif) – HEIF/AVIF 構造の検査
- oiiotool – OpenImageIO 経由で HEIF/AVIF を検証
References
- ELEGANTBOUNCER: When You Can’t Get the Samples but Still Need to Catch the Threat
- ElegantBouncer project (GitHub)
- Researching FORCEDENTRY: Detecting the exploit with no samples
- Researching BLASTPASS – Detecting the exploit inside a WebP file (Part 1)
- Researching BLASTPASS – Analysing the Apple & Google WebP PoC file (Part 2)
- Researching TRIANGULATION – Detecting CVE‑2023‑41990 with single‑byte signatures
- CVE‑2025‑43300: Critical vulnerability found in Apple’s DNG image processing
- LANDFALL: New Commercial-Grade Android Spyware in Exploit Chain Targeting Samsung Devices
- CVE‑2024‑41311 analysis (libheif overlay OOB)
- CVE‑2025‑65586 libheif metadata iterator flaw
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。


