From nobody Wed Sep 6 04:19:42 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4RgTfk4dMNz4s30T; Wed, 6 Sep 2023 04:19:42 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4RgTfk47WDz3LDN; Wed, 6 Sep 2023 04:19:42 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1693973982; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=55W1KmHjsns5KBPyQvUoSkdfAUKnD/dcR3T7kmxA0dc=; b=FbqdZoyk1JFt4LPtWfmNjOdNTKHsI1JBVNqoHFL5kjDkeaCLmM4uvCn9h00TOxofWULYzX 36/ltdkWSwbk5Xvm91Lq77HoizYj10MDu3mu9sBKy6rtX1Bv73TCYrnrnMrb32DG7NiDJu JSkWZAnG7XmfW8qWzb8ZxcNvLQC2Vuq8sPcvghudiAgHzEVkeZMVED6Nv9Qo9rrNA/L2WF LUHuIw6J/tDtOtprTmsec8JGOKP3nInRVbtUv8cPk9nQGrTQHJB4QWsu6lvfMmzz+8uf01 CkvPXeQ71NpZexxO5PKW+H7+sqZdFfbp9AGXXqKZc0S4jnSA0eFbOUWrI/S+kA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1693973982; a=rsa-sha256; cv=none; b=osLDtc4pQXH/3Mmdey47Dot0Zu5rcqck1ecPP4vDz7B8iinjeupQyEHzuVVEjcdOoH/8vO nlvo1v7YrsMnBDtXUdaQIPDgborQBn4O0uRsOQ6R3PpWQJWiT7PJl3bYEFiNFF2JSXfxOr z/Q2bIr/gjAWjAzSVncxl8dwkvLB39tf4UJshI/u3xYKV0CLkJDX1HtC0YDe3dD1dUlvI6 VL1KgA1YKOb7cE2FpxAYg5BJJPUH9oLe2rUb9REAWdf7OeawLhQiV/XksWrFiEIzLNadnC wO9w87+EzROJjQJ9qlqeq6UI/YQV/42lUtjSH2xX0ynkgy30ZPB310O9KWPxoA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1693973982; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=55W1KmHjsns5KBPyQvUoSkdfAUKnD/dcR3T7kmxA0dc=; b=oZw+r3D6ODxgibxsGDiPoIhRCY03It3pNkyGrach3b7IVjDyGeLS6L/Jfo0HXmTIK3HeAe NpXgqKCOSFaJllirrhWv1cK4ImhBiwDDhFnw8N2JgSjHrk/Uq4EMX+zsyJ0uikNuTkK2iR fzJztnZC7M3Wy1erlCxBHKdL5Tn2LDWI8UoFRRww7x8fRRONWZ5AaKJKX1+avoizNEDYJs hOu5Z0V2rPoUj66ZUfjAYHJb8jAgX4mjWKQ5ByiQcKV65Sz9N1+7K+COxCdUe9fcnr482x 704BT61P58h+GpTiMX3L1qZCA6cM4sLnTGusBQseYST3WZoXVo+316LiS8AjUQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4RgTfk2p8bz11Ns; Wed, 6 Sep 2023 04:19:42 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 3864JgQb057452; Wed, 6 Sep 2023 04:19:42 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 3864Jg1T057449; Wed, 6 Sep 2023 04:19:42 GMT (envelope-from git) Date: Wed, 6 Sep 2023 04:19:42 GMT Message-Id: <202309060419.3864Jg1T057449@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Zhenlei Huang Subject: git: 809450c4b531 - stable/13 - geom_linux_lvm: Check the offset of physical volume header List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: zlei X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: 809450c4b53109b6ca8a87054452f2b3b8f711aa Auto-Submitted: auto-generated The branch stable/13 has been updated by zlei: URL: https://cgit.FreeBSD.org/src/commit/?id=809450c4b53109b6ca8a87054452f2b3b8f711aa commit 809450c4b53109b6ca8a87054452f2b3b8f711aa Author: Zhenlei Huang AuthorDate: 2023-08-22 09:20:10 +0000 Commit: Zhenlei Huang CommitDate: 2023-09-06 04:17:49 +0000 geom_linux_lvm: Check the offset of physical volume header The LVM label is stored on any of the first four sectors, and the PV (physical volume) header is stored within the same sector following the LVM label. The current implementation does not fully check the offset of PV header, when attaching a bad formatted LVM PV the kernel may crash due to out-of-bounds memory read. PR: 266562 Reviewed by: jhb MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D36773 (cherry picked from commit c941b82e1c31a67a025c43cc7bd31f269fa62588) --- sys/geom/linux_lvm/g_linux_lvm.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/sys/geom/linux_lvm/g_linux_lvm.c b/sys/geom/linux_lvm/g_linux_lvm.c index 2e4bbcaa045a..dddc3ae9184e 100644 --- a/sys/geom/linux_lvm/g_linux_lvm.c +++ b/sys/geom/linux_lvm/g_linux_lvm.c @@ -67,7 +67,8 @@ static int g_llvm_read_label(struct g_consumer *, struct g_llvm_label *); static int g_llvm_read_md(struct g_consumer *, struct g_llvm_metadata *, struct g_llvm_label *); -static int llvm_label_decode(const u_char *, struct g_llvm_label *, int); +static int llvm_label_decode(const u_char *, struct g_llvm_label *, + int, u_int); static int llvm_md_decode(const u_char *, struct g_llvm_metadata *, struct g_llvm_label *); static int llvm_textconf_decode(u_char *, int, @@ -637,7 +638,8 @@ g_llvm_read_label(struct g_consumer *cp, struct g_llvm_label *ll) /* Search the four sectors for the LVM label. */ for (i = 0; i < 4; i++) { - error = llvm_label_decode(&buf[i * pp->sectorsize], ll, i); + error = llvm_label_decode(&buf[i * pp->sectorsize], ll, i, + pp->sectorsize); if (error == 0) break; /* found it */ } @@ -703,7 +705,8 @@ g_llvm_read_md(struct g_consumer *cp, struct g_llvm_metadata *md, } static int -llvm_label_decode(const u_char *data, struct g_llvm_label *ll, int sector) +llvm_label_decode(const u_char *data, struct g_llvm_label *ll, int sector, + u_int sectorsize) { uint64_t off; char *uuid; @@ -728,6 +731,13 @@ llvm_label_decode(const u_char *data, struct g_llvm_label *ll, int sector) return (EINVAL); } + /* XXX The minimal possible size of physical volume header is 88 */ + if (ll->ll_offset < 32 || ll->ll_offset > sectorsize - 88) { + G_LLVM_DEBUG(0, "Invalid physical volume header offset %u", + ll->ll_offset); + return (EINVAL); + } + off = ll->ll_offset; /* * convert the binary uuid to string format, the format is