| From 6bb320ca4a4a7b5b3db8c8d7250cc40002046878 Mon Sep 17 00:00:00 2001 |
| From: Jeremy Boone <jeremy.boone@nccgroup.trust> |
| Date: Thu, 8 Feb 2018 12:32:06 -0800 |
| Subject: tpm_tis: fix potential buffer overruns caused by bit glitches on the bus |
| |
| From: Jeremy Boone <jeremy.boone@nccgroup.trust> |
| |
| commit 6bb320ca4a4a7b5b3db8c8d7250cc40002046878 upstream. |
| |
| Discrete TPMs are often connected over slow serial buses which, on |
| some platforms, can have glitches causing bit flips. In all the |
| driver _recv() functions, we need to use a u32 to unmarshal the |
| response size, otherwise a bit flip of the 31st bit would cause the |
| expected variable to go negative, which would then try to read a huge |
| amount of data. Also sanity check that the expected amount of data is |
| large enough for the TPM header. |
| |
| Signed-off-by: Jeremy Boone <jeremy.boone@nccgroup.trust> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com> |
| Tested-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> |
| Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> |
| Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> |
| Signed-off-by: James Morris <james.morris@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/char/tpm/tpm_tis.c | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/char/tpm/tpm_tis.c |
| +++ b/drivers/char/tpm/tpm_tis.c |
| @@ -283,7 +283,8 @@ static int recv_data(struct tpm_chip *ch |
| static int tpm_tis_recv(struct tpm_chip *chip, u8 *buf, size_t count) |
| { |
| int size = 0; |
| - int expected, status; |
| + int status; |
| + u32 expected; |
| |
| if (count < TPM_HEADER_SIZE) { |
| size = -EIO; |
| @@ -298,7 +299,7 @@ static int tpm_tis_recv(struct tpm_chip |
| } |
| |
| expected = be32_to_cpu(*(__be32 *) (buf + 2)); |
| - if (expected > count) { |
| + if (expected > count || expected < TPM_HEADER_SIZE) { |
| size = -EIO; |
| goto out; |
| } |