R3n3r0/cve-2025-5915

GitHub: R3n3r0/cve-2025-5915

该仓库复现并详细分析了 libarchive RAR v4 过滤器路径中因 blocklength 未做边界检查导致的堆越界读取漏洞(CVE-2025-5915),提供本地 ASan 验证和 iOS 18.5 真机演示。

Stars: 0 | Forks: 0

# CVE-2025-5915 — libarchive RAR v4 堆越界读取(附 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` 中的环绕修复)。 - **iOS**:18.5 (22F76) 自带 libarchive 3.7.4 且存在漏洞;18.6 (22G86) 已经 移植了修复。两者都显示为 `3.7.4` —— 版本字符串无法区分它们(见报告 §7–8)。 查看完整报告:[`writeup/cve-2025-5915.en.md`](writeup/cve-2025-5915.en.md) (意大利语:[`writeup/cve-2025-5915.it.md`](writeup/cve-2025-5915.it.md))。 ## 一次 memcpy,两个 CVE 同一个未校验的 `blocklength` 是一次 `memcpy` 两端的长度: | 方向 | 缺失的边界检查 | 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 | 在 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) ``` ## 复现(本地,macOS/Linux) ``` 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 读取大小为 262112 ``` 自定义构建:`python3 poc/build_encoder.py out.rar [e8e9]`。 ## 复现(真机,iOS ≤ 18.5) `poc/RARLeak` 是一个 iOS 应用,它会喷射其堆内存,`dlopen` 系统 libarchive,输入一个 构造好的 RAR 文件,并计算其自身堆中有多少数据出现在输出中。设置你的签名 团队并进行构建: ``` cd poc/RARLeak && ./build.sh # set DEVELOPMENT_TEAM first (see build.sh) ``` 预期结果:一个声明为 16 字节的文件会产生约 196 KB 的输出,其中约 150 KB 是被越界读取的、植入的 `LK5915!!` 标记。结果将写入应用的 `Documents/` 目录中。 ## 关于 iOS 二进制文件的说明 苹果的 `libarchive.2.dylib`(18.5 / 18.6)**不**包含在内(专有)。仅包含它们的 SHA-1(`analysis/SHA1SUMS.ios-dylibs`)和相关的反汇编片段。你可以使用 `ipsw dyld extract 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 完成。仅供研究和防御用途。
标签:Bash脚本, CVE复现, iOS安全, libarchive, Web报告查看器, XXE攻击, 内存破坏, 客户端加密, 逆向工具