Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-28609-matroska-pcm-oob — Эксплойт-доказательство концепции и инструментированный стенд для воспроизведения CVE-2026-28609 — записи за пределами границ в MatroskaExtractor Android, достижимой через специально сформированный файл WebM с аудиодорожкой PCM с прямым порядком байтов. | Kitploit
Инструменты/GitHubGitHub/devrodt2/cve-2026-28609-matroska-pcm-oob
Безопасность AndroidКриминалистика памятиАнализ уязвимостейЭксплуатацияОбратная инженерияФаззингМобильная безопасностьЭксплуатация Бинарных Файлов

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
GitHub
devrodt2/cve-2026-28609-matroska-pcm-oob

CVE-2026-28609-matroska-pcm-oob

Эксплойт-доказательство концепции и инструментированный стенд для воспроизведения CVE-2026-28609 — записи за пределами границ в MatroskaExtractor Android, достижимой через специально сформированный файл WebM с аудиодорожкой PCM с прямым порядком байтов.

Репозиторий
81881 месяц назадЕщё не проверено

CVE-2026-28609 — запись за границами буфера в Matroska PCM

Proof-of-concept, инструментированный стенд для воспроизведения и техническое описание CVE-2026-28609 — записи за границами буфера в Android-компоненте MatroskaExtractor, достижимой через специально сформированный файл WebM с аудиодорожкой PCM в формате big-endian.

Краткий обзор

  • CVE ID: CVE-2026-28609
  • Производитель: Google / Android
  • Компонент: frameworks/av/media/module/extractors/mkv/MatroskaExtractor.cpp
  • Проблема: запись за границами буфера из-за некорректного приведения типов
  • CWE: CWE-787 / CWE-704
  • Затронуто: Android 14, 15, 16, 16 QPR2
  • Уровень опасности: высокий
  • Воздействие: потенциальное удалённое выполнение кода
  • Проблема AOSP: A-485377744
  • Патч: исправлено в обновлении безопасности Android за сентябрь 2026 года

1. Краткое описание

MatroskaSource::read() в Android-компоненте MatroskaExtractor содержит цикл побайтовой перестановки для PCM big-endian, который приводит указатель на данные кадра к типу uint16_t * до прибавления frame->range_offset() — смещения в байтах. Поскольку арифметика указателей в C для типа uint16_t * масштабирует смещение на sizeof(uint16_t) = 2, результирующий указатель оказывается на 2 * range_offset байт дальше начала буфера, а не на range_offset байт.

Когда range_offset > 0, цикл читает и записывает один или несколько байт за концом MediaBuffer кадра. На устройстве без ASan чтение за границами проходит незаметно, а запись за границами повреждает байт, непосредственно следующий за буфером.

Уязвимая строка:

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

Исправление в upstream приводит указатель к uint8_t * перед применением смещения:

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. Что демонстрирует этот репозиторий

Рабочий, воспроизводимый триггер для CVE-2026-28609, проверенный под AddressSanitizer на реальном устройстве Android 14. Репозиторий включает:

  1. Генератор на Python, который создаёт файл WebM, направляющий экстрактор в уязвимую ветку с ненулевым range_offset.
  2. Обвязку C-ABI, которая загружает плагин экстрактора через dlopen, вызывает GETEXTRACTORDEF и читает кадры из файла.
  3. Набор скриптов сборки, которые компилируют инструментированную ASan копию уязвимого экстрактора AOSP и линкуют её с библиотеками медиафреймворка устройства.
  4. Конфигурацию сборки с автообнаружением каталогов include, чтобы сборка адаптировалась к любому чекауту AOSP.

Результат на уязвимом устройстве:

==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. Механика срабатывания

Уязвимая ветка требует одновременного выполнения всех следующих условий:

УсловиеИсточник
Дорожка имеет формат PCMmType == PCM
Big-endianAMEDIAFORMAT_KEY_PCM_BIG_ENDIAN == 1
16-битные сэмплыAMEDIAFORMAT_KEY_BITS_PER_SAMPLE == 16
У фрейма ненулевой range_offsetУстанавливается через set_range(offset, ...)

Первые три условия выполняются объявлением дорожки с кодеком A_PCM/INT/BIG и глубиной 16 бит. Четвёртое — самое интересное.

range_offset устанавливается в ненулевое значение только в MatroskaSource::setWebmBlockCryptoInfo(), которая вызывается из readBlock() при условии:

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

Следовательно, файл-триггер должен удовлетворять условиям:

  • mIsWebm — элемент EBML DocType должен быть "webm", а не "matroska".
  • mEncrypted — дорожка должна объявлять ContentEncodings с ContentEncodingType = 1 (шифрование) и ContentEncKeyID.
  • Незашифрованные кадры — первый байт каждого кадра должен быть сигнальным байтом, младший бит которого (0x1) равен 0, что указывает на то, что кадр не зашифрован, но имеет кодирование содержимого. Это приводит к ветке else в setWebmBlockCryptoInfo, которая вызывает set_range(1, len - 1).

После удаления сигнального байта range_offset = 1 для каждого кадра. Уязвимая ветка затем вычисляет (uint16_t *)data + 1, что сдвигает указатель на 2 байта, и цикл читает/записывает байты [2, 2 + range_length) — на один байт за пределами 65-байтового выделения (64-байтовый кадр + 1-байтовый сигнальный байт).

Байтовая раскладка кадра-триггера

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

Байт сигнала 0x00 удаляется с помощью set_range(1, 64), оставляя 64-байтовый фрейм внутри 65-байтового выделения. Уязвимая арифметика указателей затем выполняет запись по байтовым смещениям со 2 по 65.


4. Структура репозитория

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

Зависимости вышестоящего уровня, клонируемые пользователем перед сборкой:

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. Предварительные требования

  • Хост: Linux или WSL2 с bash, python3, make
  • NDK: Android NDK r27+, задаётся через $ANDROID_NDK_HOME
  • Устройство: Android 14, 15, 16 или 16-QPR2 с уровнем безопасности до сентября 2026
  • ADB: adb в PATH (Linux или adb.exe из WSL)
  • Диск: ~1,5 ГБ для клонов AOSP

6. Сборка

6.1 Клонирование вышестоящих зависимостей

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 ../..

Если ваше дерево AOSP использует модульную структуру извлечения (av/media/module/extractors/mkv/), дополнительная настройка не требуется. Если используется более старая структура (av/media/libstagefright/matroska/), см. скрипты сборки для переменной MKV.

Скачать инструмент