Vulnerability RUSTSEC-2026-0403

Unknown
UNKNOWN RISK
Vulnerabilities without an assigned CVSS score. Severity is not determinable from available data.
17 days ago
October 16, 2026 at 12:00 PM UTC
Uninitialized memory exposed when streaming decompression of a legacy frame fails
4.0.0+zstd.1.4.9 - 7.3.0 and 8.0.0 - 8.1.0
4.0.0+zstd.1.4.9 - 7.3.0 and 8.0.0 - 8.1.0

Summary

Uninitialized memory exposed when streaming decompression of a legacy frame fails

Details

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.

Impacted packages

Timeline

Published
17 days ago
October 16, 2026 at 12:00 PM UTC
Fixed (8.2.0)
16 days ago
October 16, 2026 at 04:59 PM UTC
Fixed (7.4.0)
1 day ago
November 01, 2026 at 02:11 PM UTC
Last Modified
4 hours ago
November 02, 2026 at 09:30 AM UTC