Аудит zstd: 16 бюллетеней RustSec — утечки памяти, use-after-free и переполнения буферов
16.10.2026Одновременно опубликованы шестнадцать бюллетеней RustSec, затрагивающих семейство крейтов сжатия zstd: сами крейты zstd и zstd-sys, а также обёртка низкого уровня zstd-safe. Восемь из них относятся к zstd-safe и описывают ошибки в unsafe-коде, который пропускает данные в библиотеку C.
Что сломано
Среди проблем — use-after-free при работе со словарями (init_using_cdict, init_using_ddict, а также освобождение словаря при открытом потоке), выход за границы буфера при клонировании контекста в многопоточном режиме и при обучении словаря на переполняющихся размерах выборки, утечка неинициализированной памяти в буфер при сбое распаковки старых кадров, а также двойное освобождение памяти в DCtx::try_clone.
Отдельная группа ошибок связана с классом Seekable: он не помнил, был ли инициализирован, и в ряде случаев заставлял библиотеку C читать нулевой или выходящий за границы seek-таблицу. В zstd-sys под WebAssembly нашли повреждение памяти при неудачном выделении: шим поверх аллокатора Rust не проверял отказ и записывал заголовок по адресу 0.
Что делать
Рекомендуется обновить zstd-safe до версии 8.2.0 и новее — она закрывает подавляющее большинство бюллетеней. Для самого крейта zstd исправления вышли в 0.14.3 (распаковка потоком), 0.8.0 (устаревшие кадры) и 0.4.10 (обучение словаря), а для zstd-sys — в 2.1.2.
Оригинал
Bulletins RUSTSEC-2026-0391 — RUSTSEC-2026-0406 и RUSTSEC-2026-0410
Упоминаний: 0 · Просмотров: 4