Yapısal Dosya Biçimi İstismar Tespiti (0‑Click Chains)

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Bu sayfa, bayt imzalarına dayanmak yerine formatların yapısal değişmezliklerini doğrulayarak 0‑click mobil istismar dosyalarını tespit etmeye yönelik pratik teknikleri özetler. Yaklaşım; örnekler, polimorfik varyantlar ve aynı parser mantığını kötüye kullanan gelecekteki exploit’ler arasında genelleştirilebilir.

Temel fikir: yalnızca savunmasız bir decoder/parser durumu oluştuğunda ortaya çıkan yapısal imkansızlıkları ve alanlar arası tutarsızlıkları kodlamak.

Ayrıca bakınız:

PDF File analysis

Neden yapı, imzalar değil

Silahlandırılmış örnekler mevcut olmadığında ve payload baytları değiştiğinde, geleneksel IOC/YARA desenleri başarısız olur. Yapısal tespit, konteynerin beyan edilen düzenini, format uygulaması için matematiksel veya semantik olarak mümkün olanla karşılaştırır.

Tipik kontroller:

  • Spesifikasyon ve güvenli uygulamalardan türetilen tablo boyutları ve sınırlarını doğrulayın
  • Gömülü bytecode içindeki yasadışı/dökümante edilmemiş opcode’ları veya durum geçişlerini işaretleyin
  • Meta veriyi gerçek kodlanmış akış bileşenleriyle çapraz kontrol edin
  • Parser karışıklığına veya tamsayı taşması hazırlıklarına işaret eden çelişkili alanları tespit edin

Aşağıda, birden fazla yüksek etkili zincir için saha testli somut desenler yer almaktadır.


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

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

Yapısal sinyaller:

  • Benign içerikte oluşamayacak, ancak aritmetik dekodlamada taşmayı tetiklemek için gereken çelişkili sözlük durumu.
  • Refinement coding sırasında anormal sembol sayılarıyla birleşen global segmentlerin şüpheli kullanımı.

Sözde‑mantık:

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

Pratik triyaj:

  • PDF’den JBIG2 stream’lerini tespit et ve çıkar
  • pdfid/pdf-parser/peepdf ile stream’leri bulup dök
  • Aritmetik kodlama bayraklarını ve sembol sözlüğü parametrelerini JBIG2 spesifikasyonuna göre doğrula

Notlar:

  • Gömülü payload imzaları olmadan çalışır
  • Pratikte FP düşüktür çünkü işaretlenen durum matematiksel olarak tutarsızdır

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

Hedef: WebP kayıpsız (VP8L) Huffman prefix‑code tabloları.

Yapısal sinyaller:

  • Oluşturulan Huffman tablolarının toplam boyutu, referans/düzeltilmiş implementasyonların beklediği güvenli üst sınırı aşıyor; bu da taşma önkoşulunu ima eder.

Sözde-mantik:

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

Practical triage:

  • WebP container chunk’larını kontrol et: VP8X + VP8L
  • VP8L prefix kodlarını parse et ve gerçek tahsis edilmiş tablo boyutlarını hesapla

Notes:

  • Payload’ın byte‑level polymorphism’ine karşı sağlam
  • Sınır, upstream limitleri ve yama analizinden türetilir

TrueType – TRIANGULATION (CVE‑2023‑41990)

Target: fpgm/prep/glyf programları içindeki TrueType bytecode.

Structural signals:

  • Exploit chain tarafından kullanılan Apple’ın interpreter’ında belgelenmemiş/yasaklı opcodes’ın varlığı.

Sözde mantık:

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

Practical triage:

  • Yazı tipi tablolarını dök (örn., fontTools/ttx ile) ve fpgm/prep/glyf programlarını tara
  • Varlık kontrollerinden değer elde etmek için yorumlayıcıyı tamamen emüle etmeye gerek yok

Notes:

  • Standart dışı fontlar bilinmeyen opcodes içeriyorsa nadir FP’lere yol açabilir; ikincil araçlarla doğrulayın

DNG/TIFF – CVE‑2025‑43300

Target: DNG/TIFF image metadata VS kodlanmış akış içindeki gerçek bileşen sayısı (örn., JPEG‑Lossless SOF3).

Structural signals:

  • EXIF/IFD fields (SamplesPerPixel, PhotometricInterpretation) ile pipeline tarafından kullanılan görüntü akışı başlığından ayrıştırılan bileşen sayısı arasındaki tutarsızlık.

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

Pratik triage:

  • Birincil IFD ve EXIF etiketlerini parse et
  • Gömülü JPEG‑Lossless header (SOF3) bulun ve parse et, bileşen sayılarını karşılaştır

Notlar:

  • Gerçek dünyada istismar edildiği rapor edildi; yapısal tutarlılık kontrolleri için mükemmel aday

DNG/TIFF – Samsung libimagecodec.quram.so (CVE‑2025‑21042) + Eklenmiş ZIP payload (LANDFALL)

Hedef: EOF’e eklenmiş gömülü bir ZIP arşivi taşıyan DNG (TIFF‑türevi) görüntüler; parser RCE’den sonra native payloads konuşlandırmak için kullanılıyor.

Yapısal sinyaller:

  • File magic TIFF/DNG olduğunu gösterir (II*\x00 veya MM\x00*) ancak dosya adı JPEG’yi taklit eder (ör. .jpg/.jpeg — WhatsApp isimlendirmesi).
  • EOF yakınında herhangi bir TIFF IFD veri bölgesi (strips/tiles/JPEGInterchangeFormat) tarafından referans verilmeyen bir ZIP Local File Header veya EOCD magic (PK\x03\x04 veya PK\x05\x06) bulunması.
  • Son referans verilen IFD veri bloğunun ötesinde sıra dışı şekilde büyük ek veri (yüzlerce KB ila MB), .so modüllerinden oluşan paketlenmiş bir arşivle tutarlı.

Kaba mantık:

# 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:

  • Exploited in the wild against Samsung’s libimagecodec.quram.so (CVE‑2025‑21042). The appended ZIP contained native modules (e.g., loader + SELinux policy editor) extracted/executed post‑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).

Structural signals:

  • 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) – easy structural check, no decoding required.
  • SAO/loop‑filter parameters or tile counts that force table allocations larger than the max allowed by libde265 (CVE‑2025‑29482): overly large band counts or slice dimensions.
  • 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:

  • Hızlı meta veri doğrulaması (tam çözümleme olmadan):
  • heif-info sample.heic
  • oiiotool –info –stats sample.heic
  • Extent’leri dosya boyutuna göre doğrulayın:
  • heif-convert –verbose sample.heic /dev/null | grep -i extent
  • Elle inceleme için şüpheli box’ları carve edin:
  • dd if=sample.heic bs=1 skip=$((box_off)) count=$((box_len)) of=box.bin

Notes:

  • Bu kontroller, ağır çözümleme öncesinde bozuk yapıyı yakalar; sadece izin/red kararları gerektiren mail/MMS gateway’leri için kullanışlıdır.
  • libheif limitleri sürümler arasında değişir; upstream değiştiğinde sabitleri yeniden baz alın (1.18.x → 1.21.x overlay ve grid doğrulamasını sıkılaştırdı).

Implementation patterns and performance

A practical scanner should:

  • Dosya türünü otomatik algılayıp yalnızca ilgili analizörleri başlatmalı (PDF/JBIG2, WebP/VP8L, TTF, DNG/TIFF, HEIF/AVIF)
  • Tahsisleri en aza indirmek ve erken sonlandırmaya izin vermek için stream/partial‑parse yapmalı
  • Toplu triyaj için analizleri paralel çalıştırmalı (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 ipuçları ve uç durumlar

  • Embedded objects: PDFs may embed images (JBIG2) and fonts (TrueType); extract and recursively scan
  • Dekompresyon güvenliği: tahsisten önce tabloları/bellek arabelleklerini kesin sınırlarla sınırlayan kütüphaneleri kullanın
  • Yanlış pozitifler: kuralları muhafazakâr tutun, spesifikasyon gereği imkansız olan çelişkileri tercih edin
  • Sürüm kayması: üst akış ayrıştırıcılar sınırları değiştirdiğinde sınırları yeniden temel alın (ör. VP8L tablo boyutları)

  • ElegantBouncer – yukarıdaki tespitler için yapısal tarayıcı
  • pdfid/pdf-parser/peepdf – PDF nesne çıkarımı ve statik analiz
  • pdfcpu – PDF linter/temizleyici
  • fontTools/ttx – TrueType tablolarını ve bytecode’u çıkar
  • exiftool – TIFF/DNG/EXIF metaverisini okuyun
  • dwebp/webpmux – WebP metaverisini ve chunk’ları ayrıştırın
  • heif-info/heif-convert (libheif) – HEIF/AVIF yapı incelemesi
  • oiiotool – OpenImageIO ile HEIF/AVIF doğrulama

References

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin