Библиотека zip для языка Rust содержит уязвимость, из-за которой один и тот же архив показывает разное содержимое в зависимости от способа чтения. При просмотре списка файлов видны безобидные документы или изображения, а при потоковой распаковке на диск записываются другие файлы, выбранные злоумышленником. Затронуты выпуски библиотеки до 9.0.4 включительно. Код набирает около 10 млн загрузок в неделю и встречается в микросервисах, платформах SaaS (сервисы по подписке) и системах контейнерной изоляции, которые принимают архивы от пользователей.
Два заголовка одного файла в CVE-2026-115905
В формате ZIP каждая запись описана дважды. Локальный заголовок стоит прямо перед содержимым файла, а центральный каталог (Central Directory) - это общий индекс в конце архива, где перечислены все записи. Компонент ZipArchive для произвольного доступа берёт имя файла из центрального каталога, а потоковый ZipStreamReader при извлечении доверяет локальному заголовку. Сверки между двумя описаниями нет, поэтому расхождение остаётся незамеченным. По шкале CVSS v4 (общая система оценки уязвимостей) проблема получает 10 из 10.
Атака идёт по сети, учётные данные не нужны, участие пользователя не требуется. Достаточно, чтобы сервис принял архив от внешнего отправителя и распаковал его. Проверяющая система смотрит в центральный каталог и видит документ, набор стилей или картинку. Распаковщик в это время берёт имя из локального заголовка и записывает служебный скрипт или исполняемый файл, часто поверх уже существующего.
Затронуты конвейеры, где проверка архива и его распаковка разнесены по разным компонентам. В микросервисах приёма загрузок, на платформах SaaS и в фоновых обработчиках такие схемы встречаются часто. В контейнерных средах перезапись скрипта обслуживания или файла конфигурации останавливает сервис либо открывает путь к выполнению чужого кода. Почтовые фильтры, антивирусные сканеры и системы проверки загружаемых файлов обходятся тем же способом: они разбирают индекс архива отдельно от извлечения данных.
Исправление вышло в версии 9.0.5. Правка приводит два описания файла к согласованному виду, поэтому извлечь запись под чужим именем больше нельзя. Уведомление GHSA-m665-v7pm-7grj называет затронутыми выпуски до 9.0.4 включительно и указывает 9.0.5 как исправленную. Обходных мер, кроме обновления, уведомление не приводит.
Отдельно расходятся сроки в дистрибутивах. В Debian пакет rust-zip остаётся уязвимым в выпусках bookworm, trixie, forky и sid, исправленной версии в unstable пока нет. Отслеживание идёт по ошибке 1152227. Администраторам таких систем важно смотреть не только на версию библиотеки в проекте, но и на состояние самого пакета.
Сведений об использовании уязвимости в реальных атаках уведомление не содержит. Публикация описания и проверочного примера означает, что техника стала доступна, а не то, что её уже применяют. При этом собрать архив с расходящимися заголовками может любой, у кого установлена уязвимая версия: в библиотеке есть готовый программный интерфейс для такой сборки.
Практический шаг один - обновить зависимость до 9.0.5 и пересобрать сервисы, которые разбирают чужие архивы. Дополнительно проверьте, что проверка и распаковка используют один и тот же разбор ZIP. Если сканер читает центральный каталог, а распаковщик берёт локальные заголовки, расхождение сохранится даже после обновления одной из сторон. Для Debian остаётся ждать исправленного пакета и следить за ошибкой 1152227.
Уязвимость проявляется уже после проверки архива. Файл проходит сканер, попадает в очередь обработки и только там раскрывает второе имя записи. Закрывает проблему обновление до 9.0.5.