zlib 1.4 закрывает уязвимости в распаковке и minizip

zlib

Разработчики zlib выпустили версию 1.4. Обновление закрывает уязвимости, которые позволяли выйти за границы буфера при сжатии, распаковке и разборе zip-архивов. Под риск попадают серверы и утилиты, принимающие сжатые данные извне, а также продукты со встроенной копией библиотеки. Патч нужен и им.

Что вошло в zlib 1.4

По сообщению о выпуске, в 1.4 закрыто 14 уязвимостей. Самая заметная связана с неблокирующей записью в gzip-поток. Если приложение продолжало писать после задержки, внутренний указатель на внешний буфер оставался устаревшим. Очередная порция данных уходила за границу массива. Уязвимость получила идентификатор CVE-2026-85091 и высокий уровень опасности, оценка CVSS 4.0 - 8,3 из 10.

Условия атаки: приложение работает с недоверенными данными, использует неблокирующий режим и вызывает форматированный вывод после застоя записи. Затронуты версии от 1.3.1.2 до 1.3.2. Демонстрационный эксплойт опубликован, но следов применения в реальных атаках нет. CISA в своей оценке отмечает только наличие эксплойта.

Другая уязвимость касается функции, которая отдаёт словарь при распаковке. Она могла записать до 8 МБ за пределы 32-килобайтного буфера вызывающей стороны. Чтобы это сработало, нужен zlib-заголовок с неверным размером окна, а затем сброс или синхронизация распаковки. Затронуты версии 1.3.1 и 1.3.2.

Рядом стоят ещё несколько уязвимостей распаковщика. Синхронизация до определения размера окна выделяла однобайтовое окно, которое позже переполнялось. Подкачка битов на входе могла заставить распаковщик читать до начала входных данных. Повторные вызовы подкачки на выходе писали за буфер отложенных данных. Обратный вызов не замечал слишком далёких расстояний и копировал в вывод неинициализированную память.

Часть правок закрывает утечки неинициализированной памяти: одна - при переводе позиции вперёд до первой записи, другая - при сбросе состояния посреди потока. Флаг close-on-exec для открытого дескриптора теперь ставится правильно. Открытие в эксклюзивном режиме на платформах без нужной поддержки больше не усекает существующий файл, а завершается ошибкой.

Критическая оценка

Критический уровень опасности присвоен CVE-2026-4738. Уязвимость находится во вспомогательном модуле infback9, который копируют в свои проекты сторонние продукты, в частности GDAL до версии 3.11.0. Запись уязвимости оценивает её в 9,4 по CVSS 4.0.

При этом разработчики zlib считают критическую оценку завышенной. Указатели возвращаются в границы до использования, и ни один известный компилятор не обрабатывает такую арифметику неверно. Исключение - оборудование с тегированием возможностей, например CHERI: там сбой может привести к аварийному завершению. CISA указывает, что эксплуатации не отмечено. В записи CVE исправленная версия не названа, исправление вошло в zlib 1.4.

Архивы и распаковка

В minizip закрыли двойное освобождение памяти при разборе центрального каталога. Убрали и разыменование пустого указателя при повторных проверках после испорченного каталога. Отдельная правка добавляет проверку размеров дополнительных полей и безопасное чтение с выравниванием.

Распаковщик больше не берёт значения Zip64 за пределами их записи. Локатор он использует только тот, что стоит непосредственно перед концом центрального каталога. Раньше из-за этого один и тот же архив мог показывать разным читателям разные списки файлов.

Утилита miniunz могла создавать каталоги вне каталога распаковки, а на Windows - записывать файлы в произвольные места. Теперь имена путей обрабатываются по компонентам. Обход через переходы вверх закрыт.

Совместимость сборки

Выпуск ломает часть сборочных сценариев. Минимальная версия CMake поднята до 3.15. На MSVC библиотеки переименованы: короткое имя заменено на вариант с префиксом lib. На Cygwin добавили тот же префикс.

Тип z_off_t снова стал long, как в 1.3.1. Приложения под Windows, собранные с заголовками 1.3.2, нужно пересобрать. Сброс состояния сжатия теперь очищает заданный ранее gzip-заголовок. Код, который рассчитывал на его сохранение, должен выставлять заголовок заново. Поток, завершившийся ровно на границе выходного буфера, возвращает признак конца потока, а не промежуточный код.

Чтение gzip теперь отдаёт распакованные данные, полученные до ошибки, и только потом сообщает о ней. Скрипты, которые останавливались на первом сбое, увидят больше данных, чем раньше.

В списке известных ограничений остался один пункт. Вспомогательная библиотека iostream2 не проверяет длину строки, взятую из сжатых данных. На недоверенном вводе она переполняет буфер приёмника, поэтому разработчики советуют перейти на iostream3. Тем, кто собирает zlib самостоятельно, стоит обновить и встроенную копию: замены системного пакета недостаточно, если продукт несёт собственную сборку.

Ссылки

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