
libarchive RAR v4 필터의 힙 오버리드(heap over-read) 취약점(CVE-2025-5915)에 대한 개념 증명 익스플로잇으로, ASan 재현, 인코더, iOS 18.5 기기 내 시연을 포함합니다.
libarchive의 RAR v4 필터 경로(copy_from_lzss_window)에서 통제된 힙 오버리드 / 메모리 노출 취약점. 이 저장소는 이를 처음부터 끝까지 재현합니다: 로컬 ASan, 누출 크기를 조절하는 처음부터 작성한 RAR v4 인코더, 그리고 휴대폰 자체 시스템 libarchive.2.dylib을 사용하는 iOS 18.5 실기기 데모.
parse_filter()가 필터 blocklength(RAR-VM 바이트코드, 최대 32비트)를 읽고 copy_from_lzss_window()가 이 크기만큼 LZSS 창 밖에서 memcpy를 수행하며, dictionary_size에 맞는지 확인하지 않습니다. 창 크기는 rar_fls(unp_size) << 1이며 공격자가 둘 다 제어합니다. unp_size=16을 선언하면 32바이트 창, blocklength=0x3C000을 요청하면 인접 힙 약 240KB를 압축 해제 출력으로 읽습니다.a612bf62(libarchive 3.8.0)이 if (blocklength > rar->dictionary_size) return 0;을 추가합니다 (copy_from_lzss_window의 랩어라운드 수정 포함).3.7.4로 보고되어 버전 문자열로 구분할 수 없습니다 (라이트업 §7–8 참조).전체 라이트업 보기: writeup/cve-2025-5915.en.md
(이탈리아어: writeup/cve-2025-5915.it.md).
검사되지 않은 동일한 blocklength는 양쪽 끝이 있는 하나의 memcpy 길이입니다:
iOS 18.5에서는 쓰기 측 상한(26256)이 이미 백포트되었지만 읽기 측 가드(5915)는 백포트되지 않았습니다 — 따라서 iOS에서는 이 취약점은 읽기 전용입니다 (analysis/two_cve_unification.md).
writeup/ full technical article (EN + IT)
poc/
build_bigleak.py shrink unp_size in a real archive + repair header CRC-16
build_encoder.py from-scratch RAR v4 encoder; dials blocklength (leak size)
plant.c macOS realloc interpose to plant a secret after the window
*.rar proof-of-concept archives (see poc/README.md)
RARLeak/ on-device iOS harness (Xcode project)
analysis/ ASan logs, iOS patch-diff (disassembly), notes, isolated guard patch
device-proof/ output of the on-device run (iPhone, iOS 18.5)
git clone https://github.com/libarchive/libarchive && cd libarchive && git checkout v3.7.4
CC=clang CFLAGS="-fsanitize=address -g -O1" LDFLAGS="-fsanitize=address" \
cmake -B build-asan -DENABLE_TEST=OFF . && cmake --build build-asan --target bsdtar
ASAN_OPTIONS=detect_leaks=0 build-asan/bin/bsdtar -xOf poc/enc_0x40000.rar >/dev/null
# -> AddressSanitizer: heap-buffer-overflow READ of size 262112
직접 제작: python3 poc/build_encoder.py out.rar <unp_size> <blocklength> [e8e9].
poc/RARLeak은 힙을 스프레이하고 시스템 libarchive를 dlopen한 뒤 제작된 RAR을 입력으로 넣고 출력에서 자신의 힙이 얼마나 돌아오는지 세는 iOS 앱입니다. 서명 팀을 설정하고 빌드하세요:
cd poc/RARLeak && ./build.sh <device-udid> # set DEVELOPMENT_TEAM first (see build.sh)
예상 결과: 16바이트로 선언된 파일은 약 196KB의 출력을 생성하며, 그중 약 150KB는 경계를 벗어나 읽힌 심어진 LK5915!! 마커입니다. 결과는 앱의 Documents/에 기록됩니다.
Apple의 libarchive.2.dylib(18.5 / 18.6)은 (독점이라) 포함되어 있지 않습니다. SHA-1 값(analysis/SHA1SUMS.ios-dylibs)과 관련 디스어셈블리 발췌만 포함됩니다. 직접 추출하려면 ipsw dyld extract <dyld_shared_cache> libarchive.2.dylib를 사용하세요.
N-day, libarchive 3.8.0 / iOS 18.6에서 수정됨. 모든 테스트는 작성자 자신의 하드웨어에서 수행되었습니다. 버그는 JJLeo(libarchive issue #2565)가 보고했고, 연구는 Yifan Zhang(PLL, Peking University), 수정은 Tobias Stoeckmann과 Tim Kientzle이 했습니다. CVE-2024-26256 수정은 Tobias Stoeckmann. 연구 및 방어적 용도로만 사용하세요.
| 측 | 누락된 경계 | CVE | 수정 |
|---|
| 출처 (LZSS 창) | blocklength ≤ dictionary_size | CVE-2025-5915 (읽기) | a612bf62, v3.8.0 |
대상 (vm->memory, 0x40000) | blocklength ≤ VM_MEMORY_SIZE | CVE-2024-26256 (쓰기) | b7b0c7c4, v3.7.5 |