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
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
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:
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*\x00veyaMM\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\x04veyaPK\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ı)
Related tools
- 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
- 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 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
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.


