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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2019-11933 — Heap corruption in WhatsApp's media picker | Kitploit
Инструменты/GitHubGitHub/natleoj/cve-2019-11933
Android SecurityMemory ForensicsVulnerability AnalysisExploitationMobile SecurityBinary Exploitation
GitHubnatleoj/cve-2019-11933

CVE-2019-11933

Heap corruption in WhatsApp's media picker

Репозиторий
6 лет назадЕщё не проверено

Популярное

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

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

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

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

Смотреть все инструменты →
Поделиться

CVE-2019-11933

Коррупция кучи в медиа-браузере WhatsApp, затрагивающая WhatsApp для Android до версии 2.19.291

Предыстория

GIF-файл делится на сегменты, помеченные определённым байтом:

  • Image (0x2C)
    • Секция изображения описывает один кадр в GIF-файле и содержит такую информацию, как высота, ширина, а также само сжатое изображение. GIF может содержать несколько кадров и, следовательно, несколько секций изображения.
  • Extension (0x21)
    • Секция расширения содержит данные, используемые для модификации изображения.
  • Terminate (0x3B)
    • Отмечает конец GIF-файла

Согласно исходному коду, renderFrame вызывает DDGifSlurp для разбора GIF и getBitmap для его отображения. Буфер rasterBits выделяется функцией, а его размер вычисляется умножением ширины на высоту обрабатываемого изображения. Возможно, для экономии памяти и времени, один и тот же буфер rasterBits используется для всех кадров/изображений в GIF. Поэтому требуется, чтобы буфер мог вместить самое большое изображение, описанное в файле. Соответственно, буфер перераспределяется, если другая секция изображения в том же GIF описывает большее изображение (требуется больше места).

Уязвимость

DDGifSlurp разбирает GIF-файл в цикле, обрабатывая каждое изображение/кадр в файле, и завершается при обнаружении записи завершения. Когда DGifGetImageDesc возвращает GIF_ERROR (a), это приводит к преждевременному завершению (в операторе switch), в результате чего код, перераспределяющий буфер rasterBits, пропускается. Фрагмент DDGifSlurp показан ниже:

root@kitploit:~
void DDGifSlurp(GifInfo *info, bool decode, bool exitAfterFrame) {
    ...
    do {
        ...
        switch (RecordType) {
            case IMAGE_DESC_RECORD_TYPE:
             
                if (DGifGetImageDesc(gifFilePtr, isInitialPass) == GIF_ERROR) {   <-- [a]
                    break;
                }
                ...
                if (decode) {
                    ...
                    const uint_fast32_t newRasterSize = gifFilePtr->Image.Width * gifFilePtr->Image.Height;
                    if (newRasterSize > info->rasterSize || widthOverflow > 0 || heightOverflow > 0) {
                        void *tmpRasterBits = reallocarray(info->rasterBits, newRasterSize, sizeof(GifPixelType));
                        ...
                    }
    }while (RecordType != TERMINATE_RECORD_TYPE);
}

GIF-изображение, имеющее следующий формат, приведёт к сбою:

  • Допустимое изображение (10 x 10)
  • Более крупное изображение (10000 x 10000) с неправильным дескриптором изображения

Этапы, ведущие к сбою

  1. Фаза разбора
    1. Разбор первого изображения (маленького)
    2. Выделение буфера rasterBits размером (маленькая высота * маленькая ширина)
    3. Разбор второго изображения (большого)
    4. DGifSetupDecompress/DGifGetImageDesc возвращает GIF_ERROR
    5. Пропуск перераспределения
  2. Фаза рендеринга
    1. Рендеринг первого изображения (успешно)
    2. Рендеринг второго изображения (выход за границы)
Скачать инструмент