Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
Ferramentas/GitHubGitHub/devrodt2/cve-2026-28609-matroska-pcm-oob
Segurança AndroidForensia de MemóriaAnálise de VulnerabilidadesExploraçãoEngenharia ReversaFuzzingSegurança MóvelExploração de Binários

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
GitHub
devrodt2/cve-2026-28609-matroska-pcm-oob

CVE-2026-28609-matroska-pcm-oob

Prova de conceito e harness de reprodução instrumentado para CVE-2026-28609, uma escrita fora dos limites no MatroskaExtractor do Android, alcançável por meio de um arquivo WebM criado com uma faixa de áudio PCM big-endian.

Ver Repositório
8188há 1 mêsAinda não revisado

CVE-2026-28609 — Gravação fora dos limites em PCM do Matroska

Prova de conceito, harness de reprodução instrumentado e análise técnica para CVE-2026-28609, uma gravação fora dos limites no MatroskaExtractor do Android, alcançável por meio de um arquivo WebM especialmente construído com uma faixa de áudio PCM big-endian.

Visão geral

  • ID CVE: CVE-2026-28609
  • Fornecedor: Google / Android
  • Componente: frameworks/av/media/module/extractors/mkv/MatroskaExtractor.cpp
  • Problema: Gravação fora dos limites causada por conversão de tipo inadequada
  • CWE: CWE-787 / CWE-704
  • Afetados: Android 14, 15, 16, 16 QPR2
  • Severidade: Alta
  • Impacto: Potencial execução remota de código
  • Issue do AOSP: A-485377744
  • Correção: Tratada na atualização de segurança do Android de setembro de 2026

1. Resumo

MatroskaSource::read() no MatroskaExtractor do Android contém um loop de troca de bytes PCM big-endian que converte um ponteiro de dados de frame para uint16_t * antes de adicionar frame->range_offset(), um deslocamento em bytes. Como a aritmética de ponteiros em C sobre um uint16_t * escala o deslocamento por sizeof(uint16_t) = 2, o ponteiro resultante fica 2 * range_offset bytes além do início do buffer, e não range_offset bytes.

Quando range_offset > 0, o loop lê e grava um ou mais bytes além do fim do MediaBuffer do frame. Em um dispositivo sem ASan, a leitura excessiva é bem-sucedida silenciosamente e a gravação excessiva corrompe o byte imediatamente após o buffer.

A linha vulnerável:

// 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]);
}

A correção upstream converte o ponteiro para uint8_t * antes de aplicar o deslocamento:

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. O que este repositório demonstra

Um gatilho funcional e reproduzível para a CVE-2026-28609, verificado sob AddressSanitizer em um dispositivo Android 14 real. O repositório inclui:

  1. Um gerador em Python que produz um arquivo WebM que leva o extrator ao ramo vulnerável com um range_offset diferente de zero.
  2. Um harness de ABI em C que carrega o plugin do extrator via dlopen, invoca GETEXTRACTORDEF e lê frames do arquivo.
  3. Um conjunto de scripts de build que compilam uma cópia instrumentada com ASan do extrator vulnerável do AOSP e a vinculam às bibliotecas do framework de mídia do dispositivo.
  4. Uma configuração de build com descoberta automática de diretórios de include, para que o build se adapte a qualquer checkout do AOSP.

O resultado, em um dispositivo vulnerável:

==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 disparo

O ramo vulnerável exige que todas as condições a seguir sejam verdadeiras:

CondiçãoOrigem
A faixa é PCMmType == PCM
Big-endianAMEDIAFORMAT_KEY_PCM_BIG_ENDIAN == 1
Amostras de 16 bitsAMEDIAFORMAT_KEY_BITS_PER_SAMPLE == 16
O frame tem range_offset diferente de zeroDefinido por set_range(offset, ...)

As três primeiras são satisfeitas ao declarar a faixa com o ID de codec A_PCM/INT/BIG e profundidade de bits 16. A quarta é a interessante.

range_offset é definido com um valor diferente de zero apenas em MatroskaSource::setWebmBlockCryptoInfo(), que é chamado a partir de readBlock() sob a condição:

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

Portanto, o arquivo de gatilho deve satisfazer:

  • mIsWebm — o elemento EBML DocType deve ser "webm", não "matroska".
  • mEncrypted — a faixa deve declarar ContentEncodings com ContentEncodingType = 1 (Encryption) e um ContentEncKeyID.
  • Quadros não criptografados — o primeiro byte de cada quadro deve ser um byte de sinal cujo bit menos significativo (0x1) seja 0, indicando que o quadro não está criptografado, mas possui codificação de conteúdo. Isso segue o ramo else em setWebmBlockCryptoInfo, que chama set_range(1, len - 1).

Após a remoção, range_offset = 1 para cada quadro. O ramo vulnerável então calcula (uint16_t *)data + 1, o que avança 2 bytes, e o loop lê/escreve os bytes [2, 2 + range_length) — um byte além do fim da alocação de 65 bytes (quadro de 64 bytes + 1 byte de sinal).

Layout de bytes de um quadro de gatilho

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

O byte de sinal 0x00 é removido por set_range(1, 64), deixando um frame de 64 bytes dentro de uma alocação de 65 bytes. A aritmética de ponteiro vulnerável então escreve no deslocamento de byte 2 até 65.


4. Estrutura do repositório

.
├── 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

Dependências upstream, clonadas pelo usuário antes da compilação:

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. Pré-requisitos

  • Host: Linux ou WSL2 com bash, python3, make
  • NDK: Android NDK r27+, definido via $ANDROID_NDK_HOME
  • Dispositivo: Android 14, 15, 16 ou 16-QPR2 com nível de patch de segurança anterior a setembro de 2026
  • ADB: adb no PATH (Linux, ou adb.exe do WSL)
  • Disco: ~1,5 GB para os clones do AOSP

6. Compilação

6.1 Clonar dependências 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 ../..

Se sua árvore AOSP usa o layout modular do extrator (av/media/module/extractors/mkv/), nenhum ajuste adicional é necessário. Se ela usa o layout mais antigo (av/media/libstagefright/matroska/), consulte os scripts de build para a variável MKV.

Baixar ferramenta