Structural File‑Format Exploit Detection (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 モバイル exploit ファイルを検出する実践的手法を要約します。このアプローチはサンプルやポリモーフィックな変種、同じパーサロジックを悪用する将来のexploitに対して一般化できます。
重要な考え方: 脆弱な decoder/parser の状態に到達したときにのみ現れる構造的に不可能な事象やフィールド間の不整合をエンコードすること。
参照:
なぜ構造であり、シグネチャではないのか
weaponized サンプルが利用できずペイロードのバイトが変異する場合、従来の IOC/YARA パターンは失敗します。構造的検出は、コンテナが宣言するレイアウトと、フォーマット実装に対して数学的または意味論的に可能な範囲を照らし合わせて検査します。
典型的なチェック:
- 仕様および安全な実装から導出されるテーブルサイズと境界を検証する
- 埋め込みバイトコード内の違法/未文書化のオペコードや状態遷移を検出する
- メタデータと実際にエンコードされたストリーム構成要素をクロスチェックする
- パーサの混乱や整数オーバーフローの仕込みを示す矛盾するフィールドを検出する
以下は、複数の高インパクトなチェーンに対して現場で検証された具体的なパターンです。
PDF/JBIG2 – FORCEDENTRY (CVE‑2021‑30860)
Target: JBIG2 symbol dictionaries embedded inside PDFs (often used in mobile MMS parsing).
構造的シグナル:
- 通常のコンテンツでは発生しないが、算術デコーディングでオーバーフローを引き起こすために必要な矛盾した辞書状態。
- refinement coding 中の異常なシンボル数と組み合わさったグローバルセグメントの疑わしい使用。
擬似ロジック:
# 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 spec と照合して確認する
Notes:
- 埋め込み payload 署名がなくても動作する
- 実運用での FP は低い。フラグ付けされた状態が数学的に矛盾しているため
WebP/VP8L – BLASTPASS (CVE‑2023‑4863)
Target: WebP lossless (VP8L) Huffman prefix‑code tables.
Structural signals:
- 構築された Huffman テーブルの合計サイズが、reference/patched implementations が想定する安全な上限を超えており、オーバーフローの前提条件を満たしていることを示す。
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:
- ペイロードのバイトレベルのポリモーフィズムに対して堅牢
- 境界は upstream の制限/パッチ解析から導出される
TrueType – TRIANGULATION (CVE‑2023‑41990)
Target: fpgm/prep/glyf プログラム内の TrueType bytecode。
Structural signals:
- exploit chain で使用される Apple の interpreter において、undocumented/forbidden opcodes が存在すること。
Pseudo‑logic:
# Flag undocumented TrueType opcodes leveraged by TRIANGULATION
switch opcode:
case 0x8F, 0x90:
mark_malicious("Undocumented TrueType bytecode")
default:
continue
Practical triage:
- フォントテーブルをダンプする(例: fontTools/ttx を使用)および fpgm/prep/glyf プログラムをスキャンする
- 存在チェックから有用な情報を得るためにインタプリタを完全にエミュレートする必要はない
Notes:
- 非標準フォントが不明なオペコードを含む場合、稀に FPs が発生する可能性がある; 別のツールで検証する
DNG/TIFF – CVE‑2025‑43300
Target: DNG/TIFF image metadata とエンコードされたストリーム内の実際のコンポーネント数(例: JPEG‑Lossless SOF3)
Structural signals:
- EXIF/IFD フィールド(SamplesPerPixel、PhotometricInterpretation)と、パイプラインで使用される画像ストリームヘッダから解析されたコンポーネント数との不一致
Pseudo‑logic:
# 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) + Appended ZIP payload (LANDFALL)
Target: DNG (TIFF‑derived) 画像で、EOF に追記された埋め込みの ZIP アーカイブを含み、parser RCE 後にネイティブペイロードをステージするもの。
Structural signals:
- ファイルマジックが TIFF/DNG (
II*\x00またはMM\x00*) を示すが、ファイル名は JPEG を模している(例:.jpg/.jpeg、WhatsApp の命名)。 - EOF 付近に ZIP の Local File Header または EOCD マジック (
PK\x03\x04またはPK\x05\x06) が存在するが、それが TIFF のいかなる IFD データ領域(strips/tiles/JPEGInterchangeFormat)からも参照されていない。 - 最後に参照された IFD データブロックの先に、異常に大きな追尾データ(数百KB〜MB)が存在し、.so モジュールのバンドルされたアーカイブと一致する。
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:
- Identify format vs name:
- 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
- Sanity‑check TIFF data regions don’t overlap the carved ZIP region:
- 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 の libimagecodec.quram.so に対して実際に悪用された事例あり (CVE‑2025‑21042)。末尾に追加された ZIP には native module(例: loader + SELinux policy editor)が含まれており、RCE 後に抽出/実行された。
Implementation patterns and performance
A practical scanner should:
- Auto‑detect file type and dispatch only relevant analyzers (PDF/JBIG2, WebP/VP8L, TTF, DNG/TIFF)
- Stream/partial‑parse to minimize allocations and enable early termination
- Run analyses in parallel (thread‑pool) for bulk triage
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 のヒントとエッジケース
- Embedded objects: PDFs may embed images (JBIG2) and fonts (TrueType); extract and recursively scan
- 展開の安全性: 確保前にテーブル/バッファのサイズを厳格に上限指定するライブラリを使用する
- 誤検知: ルールは保守的に保ち、仕様上ありえない矛盾を優先する
- バージョンドリフト: 上流のパーサが制限を変更した場合は、境界値(例: VP8L テーブルサイズ)を再ベースライン化する
関連ツール
- ElegantBouncer – 上記検出のための構造スキャナ
- pdfid/pdf-parser/peepdf – PDF オブジェクトの抽出と静的解析
- pdfcpu – PDF のリンター/サニタイザ
- fontTools/ttx – TrueType テーブルとバイトコードをダンプする
- exiftool – TIFF/DNG/EXIF メタデータを読み取る
- dwebp/webpmux – WebP のメタデータとチャンクを解析する
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
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を提出してハッキングトリックを共有してください。
HackTricks

