Received: by 2002:ac0:8c9a:0:0:0:0:0 with SMTP id r26csp332990ima; Fri, 1 Feb 2019 04:08:46 -0800 (PST) X-Google-Smtp-Source: ALg8bN7BlKSVjKaTi5IMkJBQkXS3wvElNHiZDsKpOFKVUSsSGz/jjdl3e9C3NtOPZYKTGbWUbYsN X-Received: by 2002:a62:c28e:: with SMTP id w14mr38962357pfk.115.1549022926140; Fri, 01 Feb 2019 04:08:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549022926; cv=none; d=google.com; s=arc-20160816; b=WDan+KVCACdNoTSKhO9WZPolJar1IzF3AddXV//AsqpBi8K4rWC9ffhBJddTVA1t1U t0p8QLNd8vPy2ntTWwsRNWfVvBmrQ7NPFjrExJaJr85+sOdfiaUzpbtPUYdoExGj11KK gdKZJtP4yli3FStmf5CDHEEuMF78jVqswOkSqu5+Y+d09PcZbEbXfNZUFrIgzUGIxeDZ tmJCrO1SXjY8r7C4S5ZgDLBsYnPHUR4OzpeH+VCF+3lMgP6lkgO3RCoM08wEVZo3ptt2 Zt/EswMp+gKvvjX3RM70IU5mXd2MxKzrd5rWWSU++8sghXNlkuS5p9Rc1KamNzcd8IMt 992w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=shduhI6Dtj+YLvZBnr5663IDZRagKQAnP/Dlg5a0/6U=; b=lV2ZyHhp2ziCal/F0Ty4DtiunOQay/lfSX6lOrGRKxU1cFwUD038i7PALEeLw7hq7K EsEzThTKAGEkhjO3RGyEJDP7CZ3mXd7bf5xlBoUPIXUQTABgT9JekUA7ZAym3z4Ol6MP VBvqWPNUhp09uBZRzxcNUElYWLVNZSyYTwrEMnBbYJh0pOR2uVloJcTLb0PnpfHfqdYy JT77j++L8J+QhnpU34kTljt/HRsSNfH9wVO2Qayfdnox6fQZB/x103aFn7Bo60PXkp/Q STDLEdID0OTBQl03kdQHNlj3KnnzKvHTb8KCmbhRyGK69fp+QLX0TlWiti5HIBhsHM70 wf+w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id x5si7086062pgq.535.2019.02.01.04.08.30; Fri, 01 Feb 2019 04:08:46 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730180AbfBALd6 (ORCPT + 99 others); Fri, 1 Feb 2019 06:33:58 -0500 Received: from mga12.intel.com ([192.55.52.136]:11876 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726849AbfBALd4 (ORCPT ); Fri, 1 Feb 2019 06:33:56 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Feb 2019 03:33:55 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,548,1539673200"; d="scan'208";a="139818063" Received: from jsakkine-mobl1.tm.intel.com (HELO localhost) ([10.237.50.172]) by fmsmga002.fm.intel.com with ESMTP; 01 Feb 2019 03:33:53 -0800 From: Jarkko Sakkinen To: linux-kernel@vger.kernel.org Cc: linux-integrity@vger.kernel.org, linux-security-module@vger.kernel.org, Jarkko Sakkinen , stable@vger.kernel.org, Linus Torvalds , James Morris , Tomas Winkler , Jerry Snitselaar Subject: [PATCH] tpm/tpm_crb: Avoid unaligned reads in crb_recv(): Date: Fri, 1 Feb 2019 13:19:49 +0200 Message-Id: <20190201111949.14881-1-jarkko.sakkinen@linux.intel.com> X-Mailer: git-send-email 2.19.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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: Linus Torvalds Cc: James Morris Cc: Tomas Winkler Cc: Jerry Snitselaar Fixes: 30fc8d138e91 ("tpm: TPM 2.0 CRB Interface") Signed-off-by: Jarkko Sakkinen --- drivers/char/tpm/tpm_crb.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c index 36952ef98f90..7f47e43aa9f1 100644 --- a/drivers/char/tpm/tpm_crb.c +++ b/drivers/char/tpm/tpm_crb.c @@ -288,18 +288,18 @@ static int crb_recv(struct tpm_chip *chip, u8 *buf, size_t count) unsigned int expected; /* sanity check */ - if (count < 6) + if (count < 8) return -EIO; if (ioread32(&priv->regs_t->ctrl_sts) & CRB_CTRL_STS_ERROR) return -EIO; - memcpy_fromio(buf, priv->rsp, 6); + memcpy_fromio(buf, priv->rsp, 8); expected = be32_to_cpup((__be32 *) &buf[2]); - if (expected > count || expected < 6) + if (expected > count || expected < 8) return -EIO; - memcpy_fromio(&buf[6], &priv->rsp[6], expected - 6); + memcpy_fromio(&buf[8], &priv->rsp[8], expected - 8); return expected; } -- 2.17.1