Description
`Signature::from_der` read a DER-encoded ECDSA signature leniently. It read as
the signature: the signature followed by other bytes; a sequence length
shorter than its contents, or longer with bytes after them (a length byte with
its high bit set among them); and an R or S preceded by a zero byte it did not
need. It read a lone-zero R or S as zero.
`messages::verify`, `compat::bsm::verify_message_der`,
`auth::Certificate::verify`, `auth::VerifiableCertificate::verify`,
`wallet::ProtoWallet::verify_signature` and
`kvstore::KVStoreInterpreter::verify_signature` read through it, and each
verified such a form of a valid signature. Given one signature a key holder
made, anyone could produce other byte strings that verify as that signature
over the same data. No form verifies over other data: an application that acts
on the verdict alone is not affected; one that compares, hashes or stores a
signature's bytes is.
0.8.6 refuses each form as `Error::InvalidSignature`. A signature's bytes are
still not unique after the patch: the same signature with S replaced by n - S
verifies, so an application that keys on the bytes also requires
`Signature::is_low_s()`.
Affected packages
| Ecosystem | Package | Affected | Fixed | Record |
|---|---|---|---|---|
| crates.io | bsv-rs | >= 0.0.0-0, < 0.8.6 · >= 0.9.0-beta.1, < 0.9.0-beta.7.0 | 0.8.6, 0.9.0-beta.7.0 | RUSTSEC-2026-0499 |