RUSTSEC-2026-0452

Source
https://rustsec.org/advisories/RUSTSEC-2026-0452
Import Source
https://github.com/rustsec/advisory-db/blob/osv/crates/RUSTSEC-2026-0452.json
JSON Data
https://api.osv.dev/v1/vulns/RUSTSEC-2026-0452
Aliases
  • GHSA-9fm9-c4h4-8g93
Published
2026-11-03T12:00:00Z
Modified
2026-11-06T15:45:02Z
Severity
  • 7.9 (High) CVSS_V3 - CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:L CVSS Calculator
Summary
Out-of-bounds read when decoding internal keys shorter than 16 bytes
Details

InternalKeyRef::from_encoded is a safe constructor whose only length check is debug_assert!(encoded.len() >= 16), which is compiled out in release builds. Its accessors perform unchecked length arithmetic on the slice: user_key() slices &encoded[..len - 16], trailer()/seq_num() pass len - 16 and timestamp() passes len - 8 to read_u64_be, which computes buffer.as_ptr().add(offset) and performs an 8-byte load. For a short slice the subtraction underflows usize, the pointer wraps below the allocation and eight bytes before the buffer are read (undefined behavior; confirmed with AddressSanitizer as a heap-buffer-overflow). In debug builds the same call panics instead.

The same invariant is missing at the on-disk decode boundary: BlockIterator::seek_next_entry rebuilds the current key from block bytes with upper-bound checks only, and BlockIterator::key() wraps it in InternalKeyRef, which surrealdb's kv-surrealkv backend then reads through key_ref.timestamp(). A crafted or corrupted SSTable therefore reaches the same unchecked subtraction without any unsafe at the call site.

1.2.0 rejects internal keys shorter than their 8-byte trailer before any accessor computes an offset and makes the accessors bounds-checked (fix in commit ac642f9, surrealdb 4.0.0 ships surrealkv 1.2.0).

Database specific
{
    "license": "CC0-1.0"
}
References

Affected packages

crates.io / surrealkv

Package

Name
surrealkv
View open source insights on deps.dev
Purl
pkg:cargo/surrealkv

Affected ranges

Type
SEMVER
Events
Introduced
0.0.0-0
Fixed
1.2.0

Ecosystem specific

{
    "affected_functions": null,
    "affects": {
        "arch": [],
        "functions": [],
        "os": []
    }
}

Database specific

categories
[
    "memory-exposure"
]
cvss
"CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:L"
informational
null
source
"https://github.com/rustsec/advisory-db/blob/osv/crates/RUSTSEC-2026-0452.json"