[PATCH v5 0/2] tpm: bounds-check device-reported response lengths

Shahriyar Jalayeri <[email protected]>
Newsgroups gmane.comp.boot-loaders.u-boot.general,gmane.comp.boot-loaders.u-boot
Message-ID <[email protected]>
A TPM reply's length is taken from the device and only upper-capped, then
several callers use it unchecked: the TPM1 OIAP helpers and the TPM2
GetCapability parser subtract a fixed header length from it, so a reply too
short underflows the subtraction into a huge memcpy; the GetCapability
parser then copies that many bytes into the caller's buffer, so a reply
longer than the buffer overruns it. Because a TPM sits on a physically
accessible bus, a cheap bus interposer (the kind used to sniff
disk-encryption keys) can inject such a reply, and on the TPM2 path this
parsing runs during measured boot, which is exactly the physical attacker
that measured boot is meant to resist.

Patch 1 checks the reported length once in tpm_sendrecv_command(), so every
command that reads a reply rejects a too-short response, and passes the
caller's buffer size to tpm2_get_capability() so its copy cannot overrun for
any capability. Patch 2 adds regression tests driving the GetCapability
parser and the TPM1 OIAP helpers with truncated and over-long replies
through the sandbox emulator.

Based on v2026.07 (fdfe2ec48d5c). A reproducer is available on request.

Signed-off-by: Shahriyar Jalayeri <[email protected]>
---
Changes in v5:
- Count the TPM1 LoadKey2 minimum reply length from the header, like the
  other commands, so it is 55 rather than 41. (Ilias Apalodimas)
- Move the TPM2_PT_SANDBOX_* test-hook properties out of the common
  tpm-v2.h into the sandbox TPM header drivers/tpm/sandbox_common.h.
  (Ilias Apalodimas)

Changes in v4:
- tpm2_get_capability(): bound the copy by the caller's buffer size, passed
  in as a new buf_size argument, instead of a prop_count-derived guess; this
  covers every capability, not just the properties query. Document @buf_size
  and @prop_count. (Simon Glass)
- Add regression tests for the TPM1 OIAP tpm1_load_key2_oiap() and
  tpm1_get_pub_key_oiap() length checks; enable CONFIG_TPM_AUTH_SESSIONS in
  the sandbox config so they build. (Simon Glass)

Changes in v3:
- Rework per review: check the response length once in
  tpm_sendrecv_command() instead of at each call site, so every command
  that reads a reply is guarded. Drop the per-site lower-bound checks; keep
  the GetCapability buffer bound.
- Drop Miquel's Acked-by, as the fix changed substantially.

Changes in v2:
- Use my real name in the From and Signed-off-by (Miquel Raynal)

---
Shahriyar Jalayeri (2):
      tpm: bounds-check the device-reported response length
      test: tpm: check malformed capability and OIAP responses are rejected

 cmd/tpm-v2.c                   |  4 +-
 configs/sandbox_defconfig      |  1 +
 drivers/tpm/sandbox_common.h   | 10 +++++
 drivers/tpm/tpm2_tis_sandbox.c | 28 +++++++++++++
 drivers/tpm/tpm_tis_sandbox.c  |  9 +++++
 include/tpm-v2.h               |  5 ++-
 lib/efi_loader/efi_tcg2.c      |  9 +++--
 lib/tpm-common.c               | 16 ++++++--
 lib/tpm-utils.h                |  6 ++-
 lib/tpm-v1.c                   | 62 +++++++++++++++++------------
 lib/tpm-v2.c                   | 60 ++++++++++++++++------------
 lib/tpm_api.c                  |  4 +-
 test/dm/tpm.c                  | 89 ++++++++++++++++++++++++++++++++++++++++++
 13 files changed, 244 insertions(+), 59 deletions(-)
---
base-commit: fdfe2ec48d5c1c2ed03073d73edd3fdd3fe1ffa1
change-id: 20260723-tpm-trunc-resp-664a3babf1cf

Best regards,
--  
Shahriyar Jalayeri <[email protected]>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.