Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-28609-matroska-pcm-oob — Prueba de concepto y arnés de reproducción instrumentado para CVE-2026-28609, una escritura fuera de límites en MatroskaExtractor de Android, alcanzable mediante un archivo WebM manipulado con una pista de audio PCM big-endian. | Kitploit
Herramientas/GitHubGitHub/devrodt2/cve-2026-28609-matroska-pcm-oob
Seguridad AndroidForensia de MemoriaAnálisis de VulnerabilidadesExplotaciónIngeniería InversaFuzzingSeguridad MóvilExplotación de Binarios

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
GitHub
devrodt2/cve-2026-28609-matroska-pcm-oob

CVE-2026-28609-matroska-pcm-oob

Prueba de concepto y arnés de reproducción instrumentado para CVE-2026-28609, una escritura fuera de límites en MatroskaExtractor de Android, alcanzable mediante un archivo WebM manipulado con una pista de audio PCM big-endian.

Ver Repositorio
8188hace 1 mesAún no revisado

CVE-2026-28609 — Escritura fuera de límites en PCM de Matroska

Prueba de concepto, arnés de reproducción instrumentado y análisis técnico para CVE-2026-28609, una escritura fuera de límites en el MatroskaExtractor de Android, alcanzable mediante un archivo WebM manipulado con una pista de audio PCM big-endian.

De un vistazo

  • ID de CVE: CVE-2026-28609
  • Proveedor: Google / Android
  • Componente: frameworks/av/media/module/extractors/mkv/MatroskaExtractor.cpp
  • Problema: Escritura fuera de límites causada por un casting incorrecto
  • CWE: CWE-787 / CWE-704
  • Afecta a: Android 14, 15, 16, 16 QPR2
  • Gravedad: Alta
  • Impacto: Posible ejecución remota de código
  • Incidencia de AOSP: A-485377744
  • Parche: Corregido en la actualización de seguridad de Android de septiembre de 2026

1. Resumen

MatroskaSource::read() en el MatroskaExtractor de Android contiene un bucle de intercambio de bytes PCM big-endian que convierte un puntero a datos de trama en uint16_t * antes de sumar frame->range_offset(), un desplazamiento en bytes. Dado que la aritmética de punteros de C sobre un uint16_t * escala el desplazamiento por sizeof(uint16_t) = 2, el puntero resultante queda 2 * range_offset bytes más allá del inicio del búfer, y no range_offset bytes.

Cuando range_offset > 0, el bucle lee y escribe uno o más bytes más allá del final del MediaBuffer de la trama. En un dispositivo sin ASan, la lectura excesiva se realiza sin errores de forma silenciosa y la escritura excesiva corrompe el byte inmediatamente posterior al búfer.

La línea vulnerable:

// MatroskaExtractor.cpp:1105 (pre-fix)
uint16_t *dstData = (uint16_t *)frame->data() + frame->range_offset();
uint16_t *srcData = (uint16_t *)frame->data() + frame->range_offset();
for (size_t i = 0; i < frame->range_length() / 2; i++) {
    dstData[i] = ntohs(srcData[i]);
}

La corrección upstream convierte el puntero a uint8_t * antes de aplicar el desplazamiento:

uint16_t *data = (uint16_t *)((uint8_t *)frame->data() + frame->range_offset());
for (size_t i = 0; i < frame->range_length() / 2; i++) {
    data[i] = ntohs(data[i]);
}

2. Qué demuestra este repositorio

Un disparador funcional y reproducible para CVE-2026-28609, verificado bajo AddressSanitizer en un dispositivo Android 14 real. El repositorio incluye:

  1. Un generador en Python que produce un archivo WebM que lleva al extractor a la rama vulnerable con un range_offset distinto de cero.
  2. Un arnés de ABI de C que carga el plugin del extractor mediante dlopen, invoca GETEXTRACTORDEF y lee fotogramas del archivo.
  3. Un conjunto de scripts de compilación que compilan una copia instrumentada con ASan del extractor vulnerable de AOSP y la enlazan contra las bibliotecas del framework multimedia del dispositivo.
  4. Una configuración de compilación con autodescubrimiento de directorios de inclusión, de modo que la compilación se adapta a cualquier checkout de AOSP.

El resultado, en un dispositivo vulnerable:

==14927==ERROR: AddressSanitizer: heap-buffer-overflow
READ of size 2 at 0x003c61ab3960 thread T0
    #0 ... MatroskaSource::read(...) MatroskaExtractor.cpp:1113
0x003c61ab3961 is located 0 bytes after 65-byte region

3. Mecánica de activación

La rama vulnerable requiere que se cumplan todas las siguientes condiciones:

CondiciónOrigen
La pista es PCMmType == PCM
Big-endianAMEDIAFORMAT_KEY_PCM_BIG_ENDIAN == 1
Muestras de 16 bitsAMEDIAFORMAT_KEY_BITS_PER_SAMPLE == 16
El frame tiene range_offset distinto de ceroEstablecido por set_range(offset, ...)

Las tres primeras se satisfacen declarando la pista con el ID de códec A_PCM/INT/BIG y una profundidad de bits de 16. La cuarta es la interesante.

range_offset se establece a un valor distinto de cero solo en MatroskaSource::setWebmBlockCryptoInfo(), que se invoca desde readBlock() bajo la condición:

if (err == OK && mExtractor->mIsWebm && trackInfo->mEncrypted) {
    err = setWebmBlockCryptoInfo(mbuf);
}

Por lo tanto, el archivo desencadenante debe cumplir:

  • mIsWebm — el elemento DocType de EBML debe ser "webm", no "matroska".
  • mEncrypted — la pista debe declarar ContentEncodings con ContentEncodingType = 1 (Encryption) y un ContentEncKeyID.
  • Tramas no cifradas — el primer byte de cada trama debe ser un byte de señal cuyo bit bajo (0x1) sea 0, lo que indica que la trama no está cifrada pero sí codificada en contenido. Esto toma la rama else en setWebmBlockCryptoInfo, que llama a set_range(1, len - 1).

Tras el strip, range_offset = 1 para cada trama. La rama vulnerable entonces calcula (uint16_t *)data + 1, lo que avanza 2 bytes, y el bucle lee/escribe los bytes [2, 2 + range_length) — un byte más allá del final de la asignación de 65 bytes (trama de 64 bytes + 1 byte de señal).

Disposición de bytes de una trama desencadenante

+---------+------------------------------------+
| 0x00    | 64 bytes of frame data (0xAA...)   |
+---------+------------------------------------+
  signal               PCM payload

El byte de señal 0x00 es eliminado por set_range(1, 64), dejando una trama de 64 bytes dentro de una asignación de 65 bytes. La aritmética de punteros vulnerable entonces escribe en el desplazamiento de byte 2 hasta 65.


4. Estructura del repositorio

.
├── README.md
├── LICENSE
├── .gitignore
│
├── exploit/
│   └── generator.py             WebM generator + verifier
│
├── harness/
│   └── harness_c_abi.cpp        dlopen-based trigger harness
│
└── scripts/
    ├── build.conf               API level, sanitizer, RTTI flags
    ├── include_dirs.conf.sample Include roots template
    ├── build_foundation.sh      Build the foundation archive
    ├── build_plugin.sh          Build the extractor plugin
    ├── build_harness.sh         Build the harness
    └── run.sh                   End-to-end build + push + run

Dependencias upstream, clonadas por el usuario antes de la compilación:

av/                    frameworks/av (AOSP)
libwebm/               external/libwebm (mkvparser)
flac/                  external/flac
aosp-includes/         system/core, system/logging, system/libbase,
                       frameworks/native — header trees only
aosp-includes/libs/    libstagefright_foundation.so, libmedia.so,
                       libutils.so, libbinder.so, libcutils.so,
                       libbase.so, libmediandk.so, libstagefright_flacdec.so
                       — pulled from the target device

5. Requisitos previos

  • Host: Linux o WSL2 con bash, python3, make
  • NDK: Android NDK r27+, configurado mediante $ANDROID_NDK_HOME
  • Dispositivo: Android 14, 15, 16 o 16-QPR2 con un nivel de parche de seguridad anterior a septiembre de 2026
  • ADB: adb en PATH (Linux, o adb.exe desde WSL)
  • Disco: ~1.5 GB para los clones de AOSP

6. Compilación

6.1 Clonar las dependencias upstream

mkdir -p deps && cd deps

# AOSP frameworks/av (contains the vulnerable extractor)
git clone --depth 1 -b android-14.0.0_r1 \
    https://android.googlesource.com/platform/frameworks/av av

# libwebm (mkvparser)
git clone --depth 1 \
    https://android.googlesource.com/platform/external/libwebm libwebm

# libFLAC
git clone --depth 1 \
    https://android.googlesource.com/platform/external/flac flac

# AOSP header trees (no full checkout required)
mkdir -p aosp-includes
cd aosp-includes
for m in core libbase logging native; do
    git clone --depth 1 \
        "https://android.googlesource.com/platform/system/$m" "$m" 2>/dev/null || true
done
cd ../..
Descargar herramienta