
libarchive RAR v4 फ़िल्टर में हीप ओवर-रीड (CVE-2025-5915) के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जिसमें ASan पुनरुत्पादन, एनकोडर और ऑन-डिवाइस iOS 18.5 प्रदर्शन शामिल है।
libarchive के RAR v4 फ़िल्टर पथ (copy_from_lzss_window) में एक नियंत्रित हीप ओवर-रीड / मेमोरी-डिस्क्लोज़र। यह रिपो इसे शुरू से अंत तक रिप्रोड्यूस करता है: स्थानीय ASan, एक स्क्रैच-से-निर्मित RAR v4 एन्कोडर जो लीक आकार को डायल करता है, और iOS 18.5 पर एक ऑन-डिवाइस प्रदर्शन जो फ़ोन के अपने सिस्टम libarchive.2.dylib का उपयोग करता है।
parse_filter() एक फ़िल्टर blocklength (RAR-VM बाइटकोड, 32 बिट तक) पढ़ता है
और copy_from_lzss_window() memcpy के ज़रिए उतने बाइट्स LZSS विंडो से बाहर कॉपी करता है, बिना यह जाँचे कि वह dictionary_size में फिट बैठता है। विंडो साइज़ rar_fls(unp_size) << 1 है — हमलावर दोनों को नियंत्रित करता है। unp_size=16 घोषित करें → 32-बाइट विंडो, blocklength=0x3C000 माँगें → ~240 KB आसन्न हीप को डीकंप्रेस्ड आउटपुट में पढ़ा जाता है।a612bf62 (libarchive 3.8.0) if (blocklength > rar->dictionary_size) return 0; जोड़ता है
(copy_from_lzss_window में रैप-अराउंड फिक्स के साथ)।3.7.4 रिपोर्ट करते हैं — वर्जन स्ट्रिंग उनमें अंतर नहीं दिखाती (writeup §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 एक iOS ऐप है जो अपने हीप को स्प्रे करता है, सिस्टम libarchive को dlopen करता है, एक क्राफ्टेड RAR फीड करता है, और गिनता है कि उसका अपना कितना हीप आउटपुट में वापस आता है। अपनी साइनिंग टीम सेट करें और बिल्ड करें:
cd poc/RARLeak && ./build.sh <device-udid> # set DEVELOPMENT_TEAM first (see build.sh)
अपेक्षित: एक 16-बाइट-घोषित फ़ाइल ~196 KB आउटपुट देती है, जिसमें से ~150 KB प्लांट किया गया LK5915!! मार्कर आउट-ऑफ-बाउंड्स पढ़ा जाता है। परिणाम ऐप के Documents/ में लिखा जाता है।
Apple का libarchive.2.dylib (18.5 / 18.6) शामिल नहीं है (मालिकाना)। केवल उनके SHA-1s (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 |