RUSTSEC-2026-0403 Uninitialized memory exposed when streaming decompression of a legacy frame fails
- Exploited in the wild
- Not known
- Fix
- Available
What is RUSTSEC-2026-0403?
RUSTSEC-2026-0403 is a vulnerability in zstd-safe, published on 16 Oct 2026.
Official 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.
Which versions are affected by RUSTSEC-2026-0403?
1 open source package ship an affected version, including zstd-safe.
| Package | Affected | Fixed in |
|---|---|---|
zstd-safe crates.io | From 4.0.0 | 8.2.0 |
How do I fix RUSTSEC-2026-0403?
Upgrade zstd-safe to 8.2.0 or later.
Is RUSTSEC-2026-0403 being exploited?
There is no known exploitation of RUSTSEC-2026-0403 in the wild and no public exploit code.