Skip to content

RUSTSEC-2026-0403: Uninitialized memory exposed when streaming decompression of a legacy frame fails #58

Open

Description

@github-actions

Uninitialized memory exposed when streaming decompression of a legacy frame fails

Details
Package zstd-safe
Version 7.2.4
URL gyscos/zstd-rs@006e1d1
Date 2026-10-16
Patched versions ^7.4.0,>=8.2.0
Unaffected versions <4.0.0

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&lt;u8&gt; 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.

See advisory page for additional details.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions