sec: replace two allow-list reasons with what the call sites actually say #486

Merged
dcharlot merged 1 commit from sec/allow-reasons-verified into main 2026-10-26 08:35:43 -04:00

View file

@ -71,22 +71,49 @@ ALLOW = {
"RUSTSEC-2026-0368": "zip: extract-only; nothing here extracts an archive",
"RUSTSEC-2026-0369": "zip: extract-only; nothing here extracts an archive",
"RUSTSEC-2025-0168": "zip: extract-only path canonicalization; nothing here extracts",
# The Marvin attack recovers an RSA key from the timing of private-key
# decryption. There is no fixed release of `rsa` at all. It reaches
# sandbox-rs and wai-rs transitively and neither holds an RSA private key
# nor decrypts: openpay's unused direct dependency was removed outright.
"RUSTSEC-2023-0071": "rsa: no fixed release; no private-key decryption here",
# The Marvin attack recovers an RSA key from the timing of **private-key
# decryption** (PKCS#1 v1.5). There is no fixed release of `rsa` at all, so
# this one cannot be bumped away and the reason has to carry it. Both
# remaining copies were checked by call site, not by assumption:
#
# sandbox-rs: `sandbox-tee/src/amd_kds.rs` is the only direct user in the
# tree. It verifies AMD's KDS chain (ARK -> ASK -> VCEK, RSASSA-PSS /
# SHA-384) with `RsaPublicKey` + `pss::VerifyingKey` + `Verifier`.
# Public-key verification only; there is no decryption anywhere, and
# `RsaPrivateKey` appears solely inside `#[cfg(test)] mod tests`, which
# mints throwaway keys to build a synthetic chain.
# wai-rs: reaches it only through `c2pa`, which is an optional dependency
# behind the `c2pa_emit` feature and off by default, so a default build
# does not compile it. WAI's own signing is Ed25519 (`ed25519_dalek`),
# which uses neither `rsa` nor `crypto-bigint`.
#
# openpay's copy is gone: the dependency was declared and never used, so it
# was removed outright rather than excused.
"RUSTSEC-2023-0071": "rsa: no fixed release; verification only, no decryption, private keys test-only",
# ── Pinned by a dependency; needs an upstream release ──────────────────
# Secret-dependent branches in operations meant to be constant-time
# (subtraction, zero counting, division, Montgomery multiplication), so
# timing can leak intermediate arithmetic on secret integers. Fixed in
# >=0.7.6, and smart-byte's 0.7.x copy is patched. The 0.5.5 line is pinned
# by elliptic-curve 0.13, so reaching it means moving the whole
# p256/elliptic-curve stack — a real upgrade, not a bump, and this entry is
# that debt, recorded on paths that sign and derive keys. Version-pinned on
# purpose: a 0.7.x copy must never be excused by it.
# timing can leak intermediate arithmetic on a secret integer. Fixed in
# >=0.7.6, and smart-byte's 0.7.x copy is patched.
#
# Every remaining 0.5.5 copy arrives under `elliptic-curve` — it is the only
# dependent in all five lockfiles — which pins the 0.5 line, so reaching
# >=0.7.6 means moving the whole p256/elliptic-curve stack. That is an
# upgrade, not a bump, and this entry is that debt.
#
# What bounds it: a timing attack of this class recovers a key by observing
# many operations under the *same* secret, and none of our own signing runs
# through this crate. WAI, sandbox and jouleclaw sign with Ed25519
# (`ed25519_dalek` / curve25519-dalek, which does not use crypto-bigint);
# in wai-rs the elliptic-curve path arrives under `c2pa`, optional and off
# by default, where production callers supply their own signer and the
# in-tree `EphemeralSigner` holds a per-call key that reaches
# `ValidationState::Valid` and never `Trusted`. So the debt is real but it
# is not sitting under a long-lived key of ours.
#
# Version-pinned on purpose: a 0.7.x copy must never be excused by it.
"RUSTSEC-2026-0387": {
"why": "crypto-bigint 0.5.5 is pinned by elliptic-curve 0.13; 0.7.x is patched",
"why": "crypto-bigint 0.5.5 pinned by elliptic-curve 0.13; our signing is Ed25519; 0.7.x is patched",
"only": ("crypto-bigint 0.5.5",),
},
# hpke-rs-libcrux pins `=0.7.0`, which pins libcrux-kem 0.0.9. Both are