RustSec logo

History ⋅ Edit ⋅ JSON (OSV)

RUSTSEC-2026-0529

KVStoreInterpreter::verify_signature_legacy answers true for every token and every key

Reported
Issued
Package
bsv-rs (crates.io)
Type
Vulnerability
Categories
Keywords
#bitcoin #kvstore #signature #verification #pushdrop
Aliases
References
CVSS Score
7.5 HIGH
CVSS Details
Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality Impact
None
Integrity Impact
High
Availability Impact
None
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N
Patched
  • >=0.8.9, <0.9.0-beta.1
  • >0.9.0-beta.7
Affected Functions
Version
bsv_rs::kvstore::KVStoreInterpreter::verify_signature_legacy
  • >=0.2.0, <0.8.9
  • >=0.9.0-beta.1, <=0.9.0-beta.7

Description

KVStoreInterpreter::verify_signature_legacy(&PushDrop, &PublicKey), public and deprecated since 0.2.0 (the crate's first release), read neither argument and answered true. A KVStore token signed by nobody, a signed token checked against a key other than its controller's, and a PushDrop with no fields each passed. Its documentation said it delegated to the KVStoreFields-based verifier; it did not.

An application that checks, with this function, a KVStore token it did not write (an overlay lookup's answer, or a transaction output a peer hands it) and acts on true accepts a value no controller signed, attributed to whatever controller the token names. No caller in the crate itself uses the function. This was run on 0.2.0, 0.5.0, 0.8.0, 0.8.7, 0.8.8, 0.9.0-beta.1 and 0.9.0-beta.7 as crates.io serves them, and the source of all 63 published versions carries the same constant body (the yanked 0.3.21 included).

0.8.9 answers true only for a token whose controller field is the given key and whose last field is that key's signature over the others (the 0.9 line's next prerelease carries the same fix). There is no workaround: upgrade to 0.8.9, or, on the 0.9 line, to its next prerelease.

Advisory available under CC0-1.0 license.