Structural File‑Format Exploit Detection (0‑Click Chains)
Reading time: 6 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 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
이 페이지는 바이트 시그니처에 의존하지 않고 포맷의 구조적 불변성을 검증하여 0‑click 모바일 exploit 파일을 탐지하는 실무 기법을 요약합니다. 이 접근법은 샘플, polymorphic 변종, 및 동일한 parser 로직을 악용하는 향후 exploits에 대해 일반화됩니다.
Key idea: 취약한 decoder/parser 상태에 도달했을 때에만 나타나는 구조적 불가능성과 필드 간 불일치를 인코딩하는 것.
See also:
왜 구조를 사용하는가, 시그니처가 아닌가
무기화된 샘플을 구할 수 없고 payload 바이트가 변형되면 전통적인 IOC/YARA 패턴은 실패합니다. 구조 기반 탐지는 컨테이너가 선언한 레이아웃을 해당 포맷 구현에서 수학적·의미론적으로 가능한 것과 비교합니다.
Typical checks:
- 스펙(spec)과 안전한 구현에서 파생된 테이블 크기 및 경계값을 검증
- 임베디드 bytecode에서 불법/문서화되지 않은 opcodes나 상태 전환을 플래그
- metadata와 실제 인코딩된 스트림 구성 요소를 교차 검증
- parser의 혼란이나 integer overflow 설정을 나타내는 모순된 필드를 탐지
Below are concrete, field‑tested patterns for multiple high‑impact chains.
PDF/JBIG2 – FORCEDENTRY (CVE‑2021‑30860)
Target: JBIG2 symbol dictionaries embedded inside PDFs (often used in mobile MMS parsing).
Structural signals:
- 정상 콘텐츠에서는 발생할 수 없지만 arithmetic decoding에서 오버플로우를 유발하기 위해 필요한 모순된 dictionary 상태
- refinement coding 동안 비정상적인 symbol 개수와 결합된 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에 따라 산술 부호화 플래그(arithmetic coding flags)와 심볼 사전 매개변수(symbol dictionary parameters) 검증
참고:
- 임베디드 payload 서명 없이 동작
- 실무에서 오탐률이 낮음 — 플래그된 상태가 수학적으로 일관되지 않기 때문
WebP/VP8L – BLASTPASS (CVE‑2023‑4863)
대상: WebP lossless (VP8L) Huffman prefix‑code tables.
구조적 신호:
- 구성된 Huffman 테이블의 전체 크기가 참조/패치된 구현들이 기대하는 안전 상한을 초과하여, 오버플로우 발생 전제를 시사함.
의사 로직:
# 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 프리픽스 코드를 파싱하고 실제 할당된 테이블 크기 계산
참고:
- payload의 바이트 수준 다형성에 대해 강건함
- 경계는 upstream의 제한/패치 분석에서 도출됨
TrueType – TRIANGULATION (CVE‑2023‑41990)
대상: fpgm/prep/glyf 프로그램 내부의 TrueType bytecode.
구조적 신호:
- 문서화되지 않았거나 금지된 opcodes가 exploit chain에서 사용되는 Apple의 interpreter에 존재함.
의사 로직:
# Flag undocumented TrueType opcodes leveraged by TRIANGULATION
switch opcode:
case 0x8F, 0x90:
mark_malicious("Undocumented TrueType bytecode")
default:
continue
실무 트리아지:
- 폰트 테이블을 덤프(예: fontTools/ttx 사용)하고 fpgm/prep/glyf 프로그램을 스캔
- presence checks만으로도 가치를 얻을 수 있으므로 인터프리터를 완전히 에뮬레이트할 필요 없음
참고:
- 비표준 폰트가 알 수 없는 opcodes를 포함하면 드물게 오탐(FP)을 발생시킬 수 있음; 보조 툴로 검증
DNG/TIFF – CVE‑2025‑43300
대상: DNG/TIFF 이미지 메타데이터 VS 인코딩된 스트림의 실제 컴포넌트 수(예: JPEG‑Lossless SOF3).
구조적 신호:
- 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:
- 실전에서 악용 사례 보고됨; 구조적 일관성 검사에 매우 적합
Implementation patterns and performance
실무용 스캐너는:
- 파일 유형을 자동 감지하고 관련 분석기(PDF/JBIG2, WebP/VP8L, TTF, DNG/TIFF)만 실행
- 할당을 최소화하고 조기 종료를 가능하게 하기 위해 스트리밍/부분 파싱 수행
- 대량 triage를 위해 분석을 스레드 풀(thread‑pool)로 병렬 실행
Example workflow with ElegantBouncer (이 검사들의 오픈소스 Rust 구현):
# 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
- Decompression safety: 할당 전에 테이블/버퍼를 하드 제한하는 라이브러리 사용
- False positives: 규칙을 보수적으로 유지하고, 스펙상 불가능한 모순을 우선시
- Version drift: 업스트림 파서가 제한을 변경할 때 경계값(예: VP8L table sizes)을 재기준화
Related tools
- ElegantBouncer – 위의 탐지에 대한 구조적 스캐너
- pdfid/pdf-parser/peepdf – PDF object extraction and static analysis
- pdfcpu – PDF linter/sanitizer
- fontTools/ttx – dump TrueType tables and bytecode
- exiftool – read TIFF/DNG/EXIF metadata
- dwebp/webpmux – parse WebP metadata and chunks
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
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 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.