Критические уязвимости в libpng угрожают безопасности приложений, обрабатывающих изображения

vulnerability

Исследователи в области кибербезопасности обнародовали информацию о двух опасных уязвимостях в библиотеке libpng, которая является стандартом де-факто для обработки изображений в формате PNG. Обнаруженные недостатки позволяют удалённым злоумышленникам вызывать аварийное завершение процессов, утечку конфиденциальных данных из оперативной памяти и, в некоторых случаях, выполнение произвольного кода. Для этого достаточно заставить приложение обработать специально созданное, но при этом технически корректное изображение PNG. Эксперты настаивают на немедленном устранении этих проблем, так как библиотека libpng встроена в огромное количество программного обеспечения по всему миру, от веб-браузеров и офисных пакетов до серверных приложений и операционных систем.

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

Первая уязвимость, зарегистрированная под идентификатором CVE-2026-33416 с высокой оценкой по шкале CVSS - 8.1, представляет собой классическую ошибку типа "использование после освобождения". Она возникает в коде, ответственном за работу с палитрой цветов и прозрачностью изображения. Проблема кроется в функциях "png_set_tRNS" и "png_set_PLTE", которые некорректно обращаются с областью памяти, выделенной в куче. Один и тот же буфер памяти ошибочно используется одновременно двумя независимыми структурами данных - "png_struct" и "png_info", которые имеют разные жизненные циклы. Когда приложение освобождает память через одну структуру, вторая продолжает хранить указатель на уже несуществующий участок памяти, так называемый "висячий указатель".

В ходе последующей обработки строк изображения программа пытается получить доступ по этому недействительному адресу. Поскольку злоумышленник полностью контролирует значения данных о прозрачности в своём вредоносном PNG-файле, он может детерминированно влиять на информацию, которая будет записана в освобождённый блок памяти. Это приводит к двум опасным сценариям. Во-первых, возникает ситуация чтения после освобождения, что может спровоцировать утечку чувствительных данных из памяти атакуемого приложения. Во-вторых, возможна запись после освобождения, вызывающая серьёзное повреждение структуры кучи. В определённых условиях, например, на встраиваемых системах или устаревших серверах без современных механизмов рандомизации памяти, такое повреждение было успешно использовано для демонстрации выполнения произвольного кода. Данная уязвимость затрагивает версии libpng с 1.2.1 по 1.6.55 включительно.

Вторая проблема, получившая идентификатор CVE-2026-33636 с оценкой CVSS 7.1, является ошибкой чтения и записи за пределами выделенного буфера. Она локализована в оптимизированных под архитектуру ARM/AArch64 подпрограммах, использующих набор инструкций Neon для расширения палитры. При преобразовании строк изображения с 8-битной палитрой в стандартные цветовые форматы аппаратно-оптимизированный цикл обработки некорректно работает с последними фрагментами данных. Цикл, обрабатывающий строку с конца, на последней итерации обращается к памяти далеко за пределами начала буфера изображения.

Это архитектурное упущение приводит к тому, что система записывает данные, управляемые злоумышленником, по отрицательным смещениям относительно буфера строки, что напрямую вызывает повреждение кучи. Хотя выполнение произвольного кода для этой конкретной ошибки доказано не было, она гарантированно приводит к аварийному завершению процесса, вызывая высокоэффективную атаку типа "отказ в обслуживании". Кроме того, уязвимость позволяет осуществлять чтение за границами буфера, что может привести к утечке содержимого кучи через декодированные пиксели выходного изображения. Важно отметить, что эта проблема строго ограничена окружениями на архитектуре ARM/AArch64, скомпилированными с включёнными оптимизациями Neon, и затрагивает версии с 1.6.36 по 1.6.55.

Обе уязвимости подчёркивают критическую важность корректного управления памятью и проверки границ, особенно в низкоуровневых библиотеках, которые служат фундаментом для бесчисленного множества приложений. Для устранения этих рисков безопасности организациям необходимо в срочном порядке обновить libpng до версии 1.6.56 или до актуальной ветки разработки 1.8.0. В новых версиях жизненные циклы памяти для структур "png_struct" и "png_info" были окончательно разделены, а также внедрены строгие проверки границ в циклах обработки. Для окружений, где немедленное обновление для устранения CVE-2026-33636 невозможно, администраторы могут применить временное решение. Необходимо отключить аппаратные оптимизации ARM Neon, установив флаг компилятора "-DPNG_ARM_NEON_OPT=0" в процессе сборки библиотеки. Это позволит полностью избежать выполнения уязвимого участка кода, хотя и может незначительно снизить производительность обработки изображений на ARM-архитектуре.

Ссылки

Комментарии: 0