Аудит 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