Zstd safe: Uninitialized memory exposed when streaming decompression of a legacy frame fails
Affects zstd-safeSource GCVE Database
Rated by Threat Radar
- Patch
- Available – fixed in 8.2.0
Data as of 26 Oct 2026, 16:13 UTC
What to do
Upgrade zstd-safe to 8.2.0.
Affected software
| Product | Affected | Fixed in |
|---|---|---|
crates.iozstd-safepkg:cargo/zstd-safeOther threats | Affected
| Fixed in
|
Check your own hosts for these packages with threat-finder (opens in a new tab), our free open-source scanner.
Description
When decompression fails inside a legacy (zstd v0.4 to v0.7) frame, the bundled zstd library reports the output buffer as fully written although nothing was written. `DCtx::decompress_stream` committed that position even on error, and for a `Vec<u8>` destination this extended the vector's length over uninitialized memory. Legacy support is enabled by default. A 5- or 6-byte corrupt legacy frame is enough: through `zstd::stream::write::Decoder`, up to 32 KiB of stale heap memory is then passed to the wrapped writer on the next `write()` or `flush()`, or when an `auto_flush()`/`on_flush()` decoder is dropped. Whether this reaches an attacker depends on where the application sends the decompressed output. `zstd::stream::read::Decoder`, `zstd::decode_all` and the bulk API are not affected. Before zstd-safe 4.0.0, output buffers could only be initialized slices. The zstd crate's own writer had the same flaw from 0.4.22 to 0.7.x, which is covered by a separate advisory. The flaw was corrected by only committing the buffer positions of a successful call.