Report privately, through GitHub's Report a vulnerability button on the Security tab. It opens a private advisory that only the maintainers can read.
Please do not open a public issue for a vulnerability. A public report is a disclosure, and it happens before there is a version to upgrade to.
Useful in a report: the rustis version, the Redis version and topology (standalone, cluster, sentinel), whether TLS is in use, and the shortest input or sequence that reproduces it.
The crate is pre-1.0. Fixes go to the latest published version; there are no maintained release branches.
Everything arriving over the connection. A reply is parsed before anything else knows whether the server is the one you meant, so the RESP layer assumes an attacker-controlled byte stream:
#![forbid(unsafe_code)], so a malformed or hostile reply cannot become a memory-safety bug.- The explicit-panic lint family is denied crate-wide, and
indexing_slicinginresp/andnetwork/— the two zones where a panic ends the connection rather than one command. - Frame size, nesting depth and collection length are bounded and configurable
(
Config::limits), so a crafted reply cannot drive an unbounded allocation or a stack overflow. The defaults are 128 levels of nesting, 512 MiB per bulk string and 128 M elements per collection. - Four
cargo-fuzztargets exercise the frame parser, both deserializers and the chunked decode path, weekly in CI.
A report showing any of these failing — a panic, an unbounded allocation, a hang — on input a server can send is in scope, and so is anything that lets a connection read or write on behalf of another.
Out of scope: what a Redis server you have chosen to trust does with the data you send it, and configuration that disables the protections above.