From: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
To: "Winkler, Tomas" <tomas.winkler@intel.com>
Cc: "linux-integrity@vger.kernel.org"
<linux-integrity@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"linux-security-module@vger.kernel.org"
<linux-security-module@vger.kernel.org>,
"stable@vger.kernel.org" <stable@vger.kernel.org>,
James Morris <jmorris@namei.org>,
Jerry Snitselaar <jsnitsel@redhat.com>
Subject: Re: [PATCH v2] tpm/tpm_crb: Avoid unaligned reads in crb_recv()
Date: Tue, 5 Feb 2019 01:24:11 +0200 [thread overview]
Message-ID: <20190204232411.GA14992@linux.intel.com> (raw)
In-Reply-To: <5B8DA87D05A7694D9FA63FD143655C1B9DA901F7@hasmsx108.ger.corp.intel.com>
On Mon, Feb 04, 2019 at 10:09:51PM +0000, Winkler, Tomas wrote:
> >
> > The current approach to read first 6 bytes from the response and then tail of
> > the response, can cause the 2nd memcpy_fromio() to do an unaligned read
> > (e.g. read 32-bit word from address aligned to a 16-bits), depending on how
> > memcpy_fromio() is implemented. If this happens, the read will fail and the
> > memory controller will fill the read with 1's.
> >
> > This was triggered by 170d13ca3a2f, which should be probably refined to check
> > and react to the address alignment. Before that commit, on x86
> > memcpy_fromio() turned out to be memcpy(). By a luck GCC has done the right
> > thing (from tpm_crb's perspective) for us so far, but we should not rely on that.
> > Thus, it makes sense to fix this also in tpm_crb, not least because the fix can be
> > then backported to stable kernels and make them more robust when compiled
> > in differing environments.
> >
> > Cc: stable@vger.kernel.org
> > Cc: James Morris <jmorris@namei.org>
> > Cc: Tomas Winkler <tomas.winkler@intel.com>
> > Cc: Jerry Snitselaar <jsnitsel@redhat.com>
> > Fixes: 30fc8d138e91 ("tpm: TPM 2.0 CRB Interface")
> > Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
> > Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com>
> After fixing the typos you can add my ack.
> Thanks
> Tomas
>
> > ---
> > v2:
> > * There was a trailing double colon in the end of the short summary.
> > * Check requested and expected length against TPM_HEADER_SIZE.
> > * Add some explanatory comments to crb_recv().
> > drivers/char/tpm/tpm_crb.c | 22 ++++++++++++++++------
> > 1 file changed, 16 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c index
> > 36952ef98f90..c084e61299aa 100644
> > --- a/drivers/char/tpm/tpm_crb.c
> > +++ b/drivers/char/tpm/tpm_crb.c
> > @@ -287,19 +287,29 @@ static int crb_recv(struct tpm_chip *chip, u8 *buf,
> > size_t count)
> > struct crb_priv *priv = dev_get_drvdata(&chip->dev);
> > unsigned int expected;
> >
> > - /* sanity check */
> > - if (count < 6)
> > + /* A sanity check that the upper layer wants to get at least the header
> > + * as that is the minimum size for any TPM response.
> > + */
> > + if (count < TPM_HEADER_SIZE)
> > return -EIO;
> >
> > + /* If this bit is set, according to the spec, the TPM is in unrecovable
> ^^^ typo ^^^^
> > + * condition.
> > + */
> > if (ioread32(&priv->regs_t->ctrl_sts) & CRB_CTRL_STS_ERROR)
> > return -EIO;
> >
> > - memcpy_fromio(buf, priv->rsp, 6);
> > - expected = be32_to_cpup((__be32 *) &buf[2]);
> > - if (expected > count || expected < 6)
> > + /* Read 8 bytes (not just 6 bytes, which would cover ^^^ tag and^^^ the response
> > length
> > + * field ^^^s^^^) in order to make sure that the reminding memory accesses
> ^^^ remaining^^^
> > will
> > + * be aligned.
> > + */
> > + memcpy_fromio(buf, priv->rsp, 8);
> > +
> > + expected = be32_to_cpup((__be32 *)&buf[2]);
> > + if (expected > count || expected < TPM_HEADER_SIZE)
> > return -EIO;
> >
> > - memcpy_fromio(&buf[6], &priv->rsp[6], expected - 6);
> > + memcpy_fromio(&buf[8], &priv->rsp[8], expected - 8);
> >
> > return expected;
> > }
> > --
> > 2.19.1
>
Thanks!
/Jarkko
next prev parent reply other threads:[~2019-02-04 23:24 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-04 13:59 [PATCH v2] tpm/tpm_crb: Avoid unaligned reads in crb_recv() Jarkko Sakkinen
2019-02-04 17:12 ` David Laight
2019-02-04 23:19 ` Jarkko Sakkinen
2019-02-04 22:09 ` Winkler, Tomas
2019-02-04 23:24 ` Jarkko Sakkinen [this message]
[not found] ` <20190207163157.DA4A62175B@mail.kernel.org>
2019-02-07 16:53 ` Jerry Snitselaar
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=20190204232411.GA14992@linux.intel.com \
--to=jarkko.sakkinen@linux.intel.com \
--cc=jmorris@namei.org \
--cc=jsnitsel@redhat.com \
--cc=linux-integrity@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=stable@vger.kernel.org \
--cc=tomas.winkler@intel.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.