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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2019-11932 — Техническое описание и эксплойт-код для CVE-2019-11932, уязвимости двойного освобождения памяти в WhatsApp для Android, которая приводит к удаленному выполнению кода через специально созданный GIF-файл. | Kitploit
Инструменты/GitHubGitHub/infiniteloopers/cve-2019-11932
Безопасность AndroidАнализ уязвимостейЭксплуатацияМобильная безопасностьОбучение и ОбразованиеЭксплуатация Бинарных Файлов
GitHubinfiniteloopers/cve-2019-11932

CVE-2019-11932

Техническое описание и эксплойт-код для CVE-2019-11932, уязвимости двойного освобождения памяти в WhatsApp для Android, которая приводит к удаленному выполнению кода через специально созданный GIF-файл.

Популярное

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

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

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

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

Смотреть все инструменты →
Поделиться
Репозиторий
4296 лет назадЕщё не проверено

CVE-2019-11932

Как ошибка double-free в WhatsApp превращается в RCE

Я расскажу о двойном освобождении (double-free) уязвимости, которую я обнаружил в WhatsApp для Android, и о том, как я превратил её в RCE. Я сообщил об этом в Facebook. Facebook подтвердил и официально исправил её в версии WhatsApp 2.19.244. Facebook помог зарезервировать CVE-2019-11932 для этой проблемы.

Пользователи WhatsApp, пожалуйста, обновитесь до последней версии WhatsApp (2.19.244 или выше), чтобы защититься от этой ошибки.

Шаги следующие:

0:16 Злоумышленник отправляет GIF-файл пользователю по любому каналу

Одним из них может быть отправка через WhatsApp как Документ (т.е. нажать кнопку «Скрепка» и выбрать «Документ», чтобы отправить повреждённый GIF) Если злоумышленник находится в списке контактов пользователя (т.е. друг), повреждённый GIF загружается автоматически без какого-либо взаимодействия с пользователем.

0:24 Пользователь хочет отправить медиафайл одному из своих друзей в WhatsApp. Он нажимает кнопку «Скрепка» и открывает галерею WhatsApp, чтобы выбрать медиафайл для отправки другу.

Обратите внимание, что пользователю не нужно ничего отправлять, так как простое открытие галереи WhatsApp активирует ошибку. Никаких дополнительных действий после нажатия на галерею WhatsApp не требуется.

0:30 Поскольку WhatsApp показывает предварительный просмотр каждого медиафайла (включая полученный GIF), это вызовет ошибку двойного освобождения и наш эксплойт RCE.

Уязвимость двойного освобождения в DDGifSlurp в decoding.c в libpl_droidsonroids_gif

Когда пользователь WhatsApp открывает галерею в WhatsApp для отправки медиафайла, WhatsApp анализирует его с помощью нативной библиотеки libpl_droidsonroids_gif.so для создания предварительного просмотра GIF-файла. libpl_droidsonroids_gif.so — это библиотека с открытым исходным кодом, доступная по адресу https://github.com/koral–/android-gif-drawable/tree/dev/android-gif-drawable/src/main/c.

GIF-файл содержит несколько закодированных кадров. Для хранения декодированных кадров используется буфер с именем rasterBits. Если все кадры имеют одинаковый размер, rasterBits повторно используется для хранения декодированных кадров без перераспределения. Однако rasterBits будет перераспределён, если выполняется одно из трёх условий:

width * height > originalWidth * originalHeight

width - originalWidth > 0

height - originalHeight > 0

Перераспределение — это комбинация free и malloc. Если размер перераспределения равен 0, это просто free. Предположим, у нас есть GIF-файл, содержащий 3 кадра размером 100, 0 и 0.

После первого перераспределения у нас есть буфер info->rasterBits размером 100.

При втором перераспределении размером 0 буфер info->rasterBits освобождается.

При третьем перераспределении размером 0 info->rasterBits освобождается снова.

Это приводит к уязвимости двойного освобождения. Место срабатывания можно найти в decoding.c:

int_fast32_t widthOverflow = gifFilePtr->Image.Width - info->originalWidth; int_fast32_t heightOverflow = gifFilePtr->Image.Height - info->originalHeight; 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, <<-- double-free here sizeof(GifPixelType)); if (tmpRasterBits == NULL) { gifFilePtr->Error = D_GIF_ERR_NOT_ENOUGH_MEM; break; } info->rasterBits = tmpRasterBits; info->rasterSize = newRasterSize; }

Как ошибка double-free в WhatsApp превращается в RCE 14 минут чтения НА ЭТОЙ СТРАНИЦЕ ДЕМО УЯЗВИМОСТЬ ДВОЙНОГО ОСВОБОЖДЕНИЯ В DDGIFSLURP В DECODING.C В LIBPL_DROIDSONROIDS_GIF УПРАВЛЕНИЕ РЕГИСТРОМ PC РАБОТА С ASLR И W^X СБОРКА ВСЕГО ВМЕСТЕ ЗАТРОНУТЫЕ ВЕРСИИ ВЕКТОРЫ АТАКИ В этом посте я расскажу о двойном освобождении (double-free) уязвимости, которую я обнаружил в WhatsApp для Android, и о том, как я превратил её в RCE. Я сообщил об этом в Facebook. Facebook подтвердил и официально исправил её в версии WhatsApp 2.19.244. Facebook помог зарезервировать CVE-2019-11932 для этой проблемы.

Пользователи WhatsApp, пожалуйста, обновитесь до последней версии WhatsApp (2.19.244 или выше), чтобы защититься от этой ошибки.

Демо https://drive.google.com/file/d/1T-v5XG8yQuiPojeMpOAG6UGr2TYpocIj/view

Ссылка Google Drive для загрузки, если указанная выше ссылка недоступна https://drive.google.com/open?id=1X9nBlf5oj5ef2UoYGOfusjxAiow8nKEK

Шаги следующие:

0:16 Злоумышленник отправляет GIF-файл пользователю по любому каналу Одним из них может быть отправка через WhatsApp как Документ (т.е. нажать кнопку «Скрепка» и выбрать «Документ», чтобы отправить повреждённый GIF) Если злоумышленник находится в списке контактов пользователя (т.е. друг), повреждённый GIF загружается автоматически без какого-либо взаимодействия с пользователем. 0:24 Пользователь хочет отправить медиафайл одному из своих друзей в WhatsApp. Он нажимает кнопку «Скрепка» и открывает галерею WhatsApp, чтобы выбрать медиафайл для отправки другу. Обратите внимание, что пользователю не нужно ничего отправлять, так как простое открытие галереи WhatsApp активирует ошибку. Никаких дополнительных действий после нажатия на галерею WhatsApp не требуется. 0:30 Поскольку WhatsApp показывает предварительный просмотр каждого медиафайла (включая полученный GIF), это вызовет ошибку двойного освобождения и наш эксплойт RCE. Уязвимость двойного освобождения в DDGifSlurp в decoding.c в libpl_droidsonroids_gif Когда пользователь WhatsApp открывает галерею в WhatsApp для отправки медиафайла, WhatsApp анализирует его с помощью нативной библиотеки libpl_droidsonroids_gif.so для создания предварительного просмотра GIF-файла. libpl_droidsonroids_gif.so — это библиотека с открытым исходным кодом, доступная по адресу https://github.com/koral–/android-gif-drawable/tree/dev/android-gif-drawable/src/main/c.

GIF-файл содержит несколько закодированных кадров. Для хранения декодированных кадров используется буфер с именем rasterBits. Если все кадры имеют одинаковый размер, rasterBits повторно используется для хранения декодированных кадров без перераспределения. Однако rasterBits будет перераспределён, если выполняется одно из трёх условий:

width * height > originalWidth * originalHeight width - originalWidth > 0 height - originalHeight > 0 Перераспределение — это комбинация free и malloc. Если размер перераспределения равен 0, это просто free. Предположим, у нас есть GIF-файл, содержащий 3 кадра размером 100, 0 и 0.

После первого перераспределения у нас есть буфер info->rasterBits размером 100. При втором перераспределении размером 0 буфер info->rasterBits освобождается. При третьем перераспределении размером 0 info->rasterBits освобождается снова. Это приводит к уязвимости двойного освобождения. Место срабатывания можно найти в decoding.c:

int_fast32_t widthOverflow = gifFilePtr->Image.Width - info->originalWidth; int_fast32_t heightOverflow = gifFilePtr->Image.Height - info->originalHeight; 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, <<-- double-free here sizeof(GifPixelType)); if (tmpRasterBits == NULL) { gifFilePtr->Error = D_GIF_ERR_NOT_ENOUGH_MEM; break; } info->rasterBits = tmpRasterBits; info->rasterSize = newRasterSize; } В Android двойное освобождение памяти размером N приводит к тому, что два последующих выделения памяти размером N возвращают один и тот же адрес.

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