Received: by 2002:a6b:fb09:0:0:0:0:0 with SMTP id h9csp1179838iog; Thu, 30 Jun 2022 19:29:12 -0700 (PDT) X-Google-Smtp-Source: AGRyM1tg1FEgRYATHlcoZbMnlur8+NXdMMbeJZbmE6fNfbyX7fcN9w19XiViFI4WhmmKb4OWzLH7 X-Received: by 2002:a63:5a21:0:b0:3fd:41e4:f833 with SMTP id o33-20020a635a21000000b003fd41e4f833mr10120803pgb.409.1656642552720; Thu, 30 Jun 2022 19:29:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1656642552; cv=none; d=google.com; s=arc-20160816; b=Pv7ZAF+JdT8iEY56mi1ae6d57nYcvHsFyNjuX5zHQoC9eL2Dm86kRVaKeNyRd78m1E uza/lYz3TZKb4mNjw7iWlxPE8WpYJpfZY1JUuFeRYXKVDhSIIcP7+rORx9fkPzvNQqWA R1LQ2Nd0BI2k4tetkQiZdGVybdQvbbhzpcSMsmrbxKmXk+Bc7/KHAw07LBvE/zy6KTBb CxQmHV993OTtMXpOjdv9HfbbBf9tL+UN8yUAyLpO0tz5m/tNtR3DqhZM8zh13l5BY7MA 9CHYrZcLhxIx1GoKbcrYvksX/8Yxzz3c0S43m5Ctrw+FOQDzHgxJyw//cvSBDWGy/TWC G/iQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:content-transfer-encoding :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=N2tc+pPuppIhXwUrUZlYZv1wqkGyyQ5FbCPl9FV56oU=; b=qgbRHGIQEz1w7NKdMO+6HrRdT/xKMCi+6n7ADVeqLix/UxYL1j89u3CaZHMXfl+9CS nXWlm2wBWYYUlEL3h74VzgOBw4UcUHV4JsBufnYxoHmN5+7YJX4qrHRrH+icpB6X0NuH kpCsAsIuC3Kg6QRg4qcKnmOZzPNzHPi2ZNXodNBDOv94CwGDS14O5MWMJhU01VLKZaHo tL3xFKCJVeb/NPYaV9orA5Q2pnkslKQkOXckV5/DgHqoLNO6XAMEQOAPiAi/7DkSOT5m rpFe7DuHM2Xfl/T8NSt/vTYoQ6ftEra42begAezG3uAcgQTtu239ewAjGt8nzGibYePc k40w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ibm.com header.s=pp1 header.b=hLEoR4cg; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=ibm.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id g127-20020a636b85000000b0040dffa70d5bsi18097886pgc.37.2022.06.30.19.29.00; Thu, 30 Jun 2022 19:29:12 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@ibm.com header.s=pp1 header.b=hLEoR4cg; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=ibm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233225AbiGAC0n (ORCPT + 99 others); Thu, 30 Jun 2022 22:26:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52754 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233236AbiGAC0c (ORCPT ); Thu, 30 Jun 2022 22:26:32 -0400 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AA8FE5C9EE; Thu, 30 Jun 2022 19:26:31 -0700 (PDT) Received: from pps.filterd (m0098417.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 2612GTRA005358; Fri, 1 Jul 2022 02:26:15 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : content-transfer-encoding : mime-version; s=pp1; bh=N2tc+pPuppIhXwUrUZlYZv1wqkGyyQ5FbCPl9FV56oU=; b=hLEoR4cgEwOU/FNrWVVEE9hV6o1Jc44DKx9JMvL0dWr2Cdxv9Q+Y1KDo/fglXHXq8T4a UHnjoZDYveHAHnkT9b4lfrxA7AQERaVzFjipNy+HkQhvjmQGPDgBdCeqCX9ciwIDfK4n luDe0lmU/sUq7SNxN8Edl4cUPXFWV4KpU1aOwPRN/huGEX9QAKWMil6/OdYOeu9unO9h krozYZBwZwbctO4qRjzxVleFAB77DmabipD/MSBVtVxFl+CqqSjTasPkDaQr7TrqyX6k T2pSvKT7lzdCs0ekBbaa4Crtmeb73XrFZWfiE59PwRMFwVVoiTTBD8guYIrncEc/CgvE 3Q== Received: from ppma04wdc.us.ibm.com (1a.90.2fa9.ip4.static.sl-reverse.com [169.47.144.26]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3h1r06g64w-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 01 Jul 2022 02:26:15 +0000 Received: from pps.filterd (ppma04wdc.us.ibm.com [127.0.0.1]) by ppma04wdc.us.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 2612LM4H009215; Fri, 1 Jul 2022 02:26:14 GMT Received: from b01cxnp23033.gho.pok.ibm.com (b01cxnp23033.gho.pok.ibm.com [9.57.198.28]) by ppma04wdc.us.ibm.com with ESMTP id 3gwt0af07c-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 01 Jul 2022 02:26:14 +0000 Received: from b01ledav002.gho.pok.ibm.com (b01ledav002.gho.pok.ibm.com [9.57.199.107]) by b01cxnp23033.gho.pok.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 2612QE9b40370640 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 1 Jul 2022 02:26:14 GMT Received: from b01ledav002.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 26691124052; Fri, 1 Jul 2022 02:26:14 +0000 (GMT) Received: from b01ledav002.gho.pok.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0DD25124055; Fri, 1 Jul 2022 02:26:14 +0000 (GMT) Received: from sbct-3.pok.ibm.com (unknown [9.47.158.153]) by b01ledav002.gho.pok.ibm.com (Postfix) with ESMTP; Fri, 1 Jul 2022 02:26:14 +0000 (GMT) From: Stefan Berger To: kexec@lists.infradead.org, devicetree@vger.kernel.org, linux-integrity@vger.kernel.org, linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org Cc: nayna@linux.ibm.com, nasastry@in.ibm.com, mpe@ellerman.id.au, Vaibhav Jain Subject: [PATCH v4 1/5] of: check previous kernel's ima-kexec-buffer against memory bounds Date: Thu, 30 Jun 2022 22:25:59 -0400 Message-Id: <20220701022603.31076-2-stefanb@linux.ibm.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220701022603.31076-1-stefanb@linux.ibm.com> References: <20220701022603.31076-1-stefanb@linux.ibm.com> X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: V7FgybWqf8ab4NwlacdTJfVLcaXWVlX2 X-Proofpoint-GUID: V7FgybWqf8ab4NwlacdTJfVLcaXWVlX2 Content-Transfer-Encoding: 8bit X-Proofpoint-UnRewURL: 0 URL was un-rewritten MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.883,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-07-01_01,2022-06-28_01,2022-06-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 spamscore=0 malwarescore=0 suspectscore=0 phishscore=0 lowpriorityscore=0 bulkscore=0 adultscore=0 impostorscore=0 clxscore=1015 mlxscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2204290000 definitions=main-2207010003 X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_EF,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Vaibhav Jain Presently ima_get_kexec_buffer() doesn't check if the previous kernel's ima-kexec-buffer lies outside the addressable memory range. This can result in a kernel panic if the new kernel is booted with 'mem=X' arg and the ima-kexec-buffer was allocated beyond that range by the previous kernel. The panic is usually of the form below: $ sudo kexec --initrd initrd vmlinux --append='mem=16G' BUG: Unable to handle kernel data access on read at 0xc000c01fff7f0000 Faulting instruction address: 0xc000000000837974 Oops: Kernel access of bad area, sig: 11 [#1] NIP [c000000000837974] ima_restore_measurement_list+0x94/0x6c0 LR [c00000000083b55c] ima_load_kexec_buffer+0xac/0x160 Call Trace: [c00000000371fa80] [c00000000083b55c] ima_load_kexec_buffer+0xac/0x160 [c00000000371fb00] [c0000000020512c4] ima_init+0x80/0x108 [c00000000371fb70] [c0000000020514dc] init_ima+0x4c/0x120 [c00000000371fbf0] [c000000000012240] do_one_initcall+0x60/0x2c0 [c00000000371fcc0] [c000000002004ad0] kernel_init_freeable+0x344/0x3ec [c00000000371fda0] [c0000000000128a4] kernel_init+0x34/0x1b0 [c00000000371fe10] [c00000000000ce64] ret_from_kernel_thread+0x5c/0x64 Instruction dump: f92100b8 f92100c0 90e10090 910100a0 4182050c 282a0017 3bc00000 40810330 7c0802a6 fb610198 7c9b2378 f80101d0 2c090001 40820614 e9240010 ---[ end trace 0000000000000000 ]--- Fix this issue by checking returned PFN range of previous kernel's ima-kexec-buffer with page_is_ram() to ensure correct memory bounds. Fixes: 467d27824920 ("powerpc: ima: get the kexec buffer passed by the previous kernel") [ Several tags removed; for testing by krobot ] Signed-off-by: Vaibhav Jain Link: https://lore.kernel.org/r/20220531041446.3334259-1-vaibhav@linux.ibm.com --- drivers/of/kexec.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/drivers/of/kexec.c b/drivers/of/kexec.c index 8d374cc552be..91b04b04eec4 100644 --- a/drivers/of/kexec.c +++ b/drivers/of/kexec.c @@ -126,6 +126,7 @@ int ima_get_kexec_buffer(void **addr, size_t *size) { int ret, len; unsigned long tmp_addr; + unsigned long start_pfn, end_pfn; size_t tmp_size; const void *prop; @@ -140,6 +141,22 @@ int ima_get_kexec_buffer(void **addr, size_t *size) if (ret) return ret; + /* Do some sanity on the returned size for the ima-kexec buffer */ + if (!tmp_size) + return -ENOENT; + + /* + * Calculate the PFNs for the buffer and ensure + * they are with in addressable memory. + */ + start_pfn = PHYS_PFN(tmp_addr); + end_pfn = PHYS_PFN(tmp_addr + tmp_size - 1); + if (!page_is_ram(start_pfn) || !page_is_ram(end_pfn)) { + pr_warn("IMA buffer at 0x%lx, size = 0x%zx beyond memory\n", + tmp_addr, tmp_size); + return -EINVAL; + } + *addr = __va(tmp_addr); *size = tmp_size; -- 2.35.1