From: sashiko-bot@kernel.org
To: alistair23@gmail.com
Cc: linux-pci@vger.kernel.org, ojeda@kernel.org, linux-cxl@vger.kernel.org
Subject: Re: [PATCH v2 17/21] lib: rspdm: Support SPDM get_digests
Date: Tue, 23 Jun 2026 05:17:16 +0000 [thread overview]
Message-ID: <20260623051717.1F2AA1F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260623045406.2589547-18-alistair.francis@wdc.com>
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
New issues:
- [High] Buffer allocation for `GetDigestsRsp` does not account for SPDM 1.3 additional fields, causing legitimate responses to exceed the buffer size.
- [High] The returned digest payload is ignored, failing to invalidate stale cached certificates if a device updates its certificate.
Pre-existing issues:
- [High] Rebuilding `KVec` from a raw pointer infers the wrong generic type parameter, causing the global allocator to deallocate a massively oversized layout.
--
commit 464cef22c054f846ef1b297c22ac00c94da2dd17
Author: Alistair Francis <alistair@alistair23.me>
lib: rspdm: Support SPDM get_digests
Support the GET_DIGESTS SPDM command.
> diff --git a/lib/rspdm/state.rs b/lib/rspdm/state.rs
> index e4eb009a977c3..055f37289c8b5 100644
> --- a/lib/rspdm/state.rs
> +++ b/lib/rspdm/state.rs
> @@ -608,4 +626,64 @@ pub(crate) fn negotiate_algs(&mut self) -> Result<(), Error> {
>
> Ok(())
> }
> +
> + pub(crate) fn get_digests(&mut self) -> Result<(), Error> {
> + let mut request = GetDigestsReq::default();
> + request.version = self.version;
> +
> + let req_sz = core::mem::size_of::<GetDigestsReq>();
> + let rsp_sz = core::mem::size_of::<GetDigestsRsp>() + SPDM_SLOTS * self.hash_len;
> +
> + // SAFETY: `request` is repr(C) and packed, so we can convert it to a slice
> + let request_buf = unsafe { from_raw_parts_mut(&mut request as *mut _ as *mut u8, req_sz) };
> +
> + let mut response_vec: KVec<u8> = KVec::from_elem(0u8, rsp_sz, GFP_KERNEL)?;
[Severity: High]
Does this correctly calculate the required buffer size for an SPDM 1.3
responder?
If the responder negotiates SPDM 1.3+, the GET_DIGESTS response appends extra
fields (like KeyPairIDs, CertificateInfo, or KeyUsageMask) after the digests.
Because rsp_sz strictly allocates only enough for the headers and the hash
lengths, the transport may truncate the response or fail the bounds check
when it returns a length larger than response_vec.len().
> +
> + let len = self.spdm_exchange(request_buf, response_vec.as_mut_slice())? as usize;
> +
> + // The transport must report a length within the buffer we provided.
> + if len > response_vec.len() {
> + pr_err!("Overflowed digests response\n");
> + return Err(EIO);
> + }
[ ... ]
> + let mut deprovisioned_slots = self.provisioned_slots & !response.param2;
> + while (deprovisioned_slots.trailing_zeros() as usize) < SPDM_SLOTS {
> + let slot = deprovisioned_slots.trailing_zeros() as usize;
> + self.certs[slot].clear();
> + deprovisioned_slots &= !(1 << slot);
> + }
[Severity: High]
Does this logic correctly invalidate stale cached certificates if a device
updates its certificate in an existing provisioned slot?
While this clears completely deprovisioned slots, it appears to ignore the
returned digest payload itself. If the responder rotated its certificate in
an existing slot, the digest would change. By not comparing the returned
digests against the cached certificates and clearing mismatches, later
validation of CHALLENGE_AUTH could fail cryptographically because it
verifies against the stale cached certificate.
[ ... ]
> let desc_len = core::mem::size_of::<bindings::shash_desc>()
> + unsafe { bindings::crypto_shash_descsize(self.shash) } as usize;
>
> // SAFETY: `desc` was allocated and converted to a raw pointer with
> // into_raw_parts()
> let desc_vec = unsafe { KVec::from_raw_parts(desc, desc_len, desc_len) };
> drop(desc_vec);
[Severity: High]
This isn't a bug introduced by this patch, but can this type inference
deallocate a massively oversized layout?
When rebuilding KVec from the raw pointer desc in SpdmState::drop() and
update_response_algs(), the generic type T is implicitly inferred as
bindings::shash_desc instead of u8.
Since desc_len represents the original allocation length in bytes, the
reconstructed KVec<bindings::shash_desc> incorrectly assumes it owns desc_len
elements of type bindings::shash_desc. When this vector is dropped, it
passes a layout to the global allocator with an extremely large size of
(desc_len * size_of::<bindings::shash_desc>()) bytes instead of desc_len
bytes.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260623045406.2589547-1-alistair.francis@wdc.com?part=17
next prev parent reply other threads:[~2026-06-23 5:17 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-23 4:53 [PATCH v2 00/21] lib: Rust implementation of SPDM alistair23
2026-06-23 4:53 ` [PATCH v2 01/21] rust: transmute: add `cast_slice[_mut]` functions alistair23
2026-06-23 5:05 ` sashiko-bot
2026-06-23 4:53 ` [PATCH v2 02/21] rust: create basic untrusted data API alistair23
2026-06-23 5:09 ` sashiko-bot
2026-06-23 4:53 ` [PATCH v2 03/21] rust: validate: add `Validate` trait alistair23
2026-06-23 5:10 ` sashiko-bot
2026-06-23 4:53 ` [PATCH v2 04/21] X.509: Make certificate parser public alistair23
2026-06-23 5:03 ` sashiko-bot
2026-06-23 4:53 ` [PATCH v2 05/21] X.509: Parse Subject Alternative Name in certificates alistair23
2026-06-23 5:07 ` sashiko-bot
2026-06-23 4:53 ` [PATCH v2 06/21] X.509: Move certificate length retrieval into new helper alistair23
2026-06-23 5:02 ` sashiko-bot
2026-06-23 4:53 ` [PATCH v2 07/21] rust: add bindings for hash.h alistair23
2026-06-23 7:01 ` sashiko-bot
2026-06-23 4:53 ` [PATCH v2 08/21] rust: error: impl From<FromBytesWithNulError> for Kernel Error alistair23
2026-06-23 5:01 ` sashiko-bot
2026-06-23 4:53 ` [PATCH v2 09/21] lib: rspdm: Initial commit of Rust SPDM alistair23
2026-06-23 5:09 ` sashiko-bot
2026-06-23 4:53 ` [PATCH v2 10/21] PCI/TSM: Rename pf0 to host alistair23
2026-06-23 5:12 ` sashiko-bot
2026-06-23 4:53 ` [PATCH v2 11/21] PCI/TSM: Support connecting to PCIe CMA devices alistair23
2026-06-23 5:16 ` sashiko-bot
2026-06-23 4:53 ` [PATCH v2 12/21] PCI/CMA: Add a PCI TSM CMA driver using SPDM alistair23
2026-06-23 5:07 ` sashiko-bot
2026-06-23 4:53 ` [PATCH v2 13/21] PCI/CMA: Validate Subject Alternative Name in certificates alistair23
2026-06-23 5:07 ` sashiko-bot
2026-06-23 4:53 ` [PATCH v2 14/21] lib: rspdm: Support SPDM get_version alistair23
2026-06-23 5:10 ` sashiko-bot
2026-06-23 4:54 ` [PATCH v2 15/21] lib: rspdm: Support SPDM get_capabilities alistair23
2026-06-23 5:09 ` sashiko-bot
2026-06-23 4:54 ` [PATCH v2 16/21] lib: rspdm: Support SPDM negotiate_algorithms alistair23
2026-06-23 5:17 ` sashiko-bot
2026-06-23 4:54 ` [PATCH v2 17/21] lib: rspdm: Support SPDM get_digests alistair23
2026-06-23 5:17 ` sashiko-bot [this message]
2026-06-23 4:54 ` [PATCH v2 18/21] lib: rspdm: Support SPDM get_certificate alistair23
2026-06-23 5:20 ` sashiko-bot
2026-06-23 4:54 ` [PATCH v2 19/21] lib: rspdm: Support SPDM certificate validation alistair23
2026-06-23 5:19 ` sashiko-bot
2026-06-23 4:54 ` [PATCH v2 20/21] rust: allow extracting the buffer from a CString alistair23
2026-06-23 5:13 ` sashiko-bot
2026-06-23 4:54 ` [PATCH v2 21/21] lib: rspdm: Support SPDM challenge alistair23
2026-06-23 5:21 ` sashiko-bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260623051717.1F2AA1F000E9@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=alistair23@gmail.com \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=ojeda@kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox