From patchwork Wed Sep 2 19:41:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Breathitt Gray X-Patchwork-Id: 1356081 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (no SPF record) smtp.mailfrom=lists.ubuntu.com (client-ip=91.189.94.19; helo=huckleberry.canonical.com; envelope-from=kernel-team-bounces@lists.ubuntu.com; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=canonical.com Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4BhZBR3b1fz9sTq; Thu, 3 Sep 2020 05:43:59 +1000 (AEST) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.86_2) (envelope-from ) id 1kDYfj-0003u4-FZ; Wed, 02 Sep 2020 19:43:55 +0000 Received: from youngberry.canonical.com ([91.189.89.112]) by huckleberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1kDYfg-0003rn-US for kernel-team@lists.ubuntu.com; Wed, 02 Sep 2020 19:43:52 +0000 Received: from mail-qt1-f199.google.com ([209.85.160.199]) by youngberry.canonical.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1kDYfg-0004nX-EL for kernel-team@lists.ubuntu.com; Wed, 02 Sep 2020 19:43:52 +0000 Received: by mail-qt1-f199.google.com with SMTP id w1so568547qto.4 for ; Wed, 02 Sep 2020 12:43:52 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Jgs+SLTRZn2cOKLmtTwgRtsf8G8iKY8OO5Q4jV6oj9o=; b=QZvrzCST/vqJoUUQj0gXA5l6YQQ9h1AyDYvnA1qlEtQoqQXCfMbNZDFe0KHzQAAL+b /7HPVZCRl8BqIH+Bq4yHcaZSbaVMrANYa9ZPq82+GQV6DScL8DHJKYsMSiE0V8+bTcv2 exMJoEZJ3LBpGhk/MQ3QuRGr0YcxzU6MrUp1s3BEzvZL3U20KkdTlWN1dPHUIjjNqOWf FjmQfAo3YIwABlmJ5XQSbY6ethEwwfQZue9++smvu9gzIrVmK0dFAZ9ZcJIOd8belNQA EABr0KXBPdySVtW3i6nY7IzJlUOixGJglfKt9qpMygSlYjIMhjY8OUSJcPPbErpNwGu0 L6iA== X-Gm-Message-State: AOAM533UVS78KvH4GXO0mrTAk0kEH+H9OQbJfKdwI2Lf/1a5MGqCtx4x mUvec1eg5p/kwdlgEvQMvD5+Dqzsgi+8P7nKgTsslC/p1K2hj/i6Et21wNJbzDsGiDZwVzQ6q54 On/Ln3JQHmecHgsSMdUV1A2R8SRcDeGijoBVDJYQN5A== X-Received: by 2002:a0c:bd03:: with SMTP id m3mr8124577qvg.33.1599075831316; Wed, 02 Sep 2020 12:43:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyGhKAhfiHicvcif2jE7atjPkTAlLl41Oz4SN16E4QfLOLRkjpkAdtocJv3eZkvpre31rludA== X-Received: by 2002:a0c:bd03:: with SMTP id m3mr8124564qvg.33.1599075831111; Wed, 02 Sep 2020 12:43:51 -0700 (PDT) Received: from localhost.localdomain (072-189-064-225.res.spectrum.com. [72.189.64.225]) by smtp.gmail.com with ESMTPSA id k63sm478635qkf.33.2020.09.02.12.43.50 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 02 Sep 2020 12:43:50 -0700 (PDT) From: William Breathitt Gray To: kernel-team@lists.ubuntu.com Subject: [SRU][B/X][CVE-2018-10322][PATCH v2 4/4] xfs: enhance dinode verifier Date: Wed, 2 Sep 2020 15:41:39 -0400 Message-Id: <20200902194139.67480-6-william.gray@canonical.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200902194139.67480-1-william.gray@canonical.com> References: <20200902194139.67480-1-william.gray@canonical.com> MIME-Version: 1.0 X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.20 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: "kernel-team" From: Eric Sandeen Add several more validations to xfs_dinode_verify: - For LOCAL data fork formats, di_nextents must be 0. - For LOCAL attr fork formats, di_anextents must be 0. - For inodes with no attr fork offset, - format must be XFS_DINODE_FMT_EXTENTS if set at all - di_anextents must be 0. Thanks to dchinner for pointing out a couple related checks I had forgotten to add. Signed-off-by: Eric Sandeen Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=199377 Reviewed-by: Darrick J. Wong Signed-off-by: Darrick J. Wong CVE-2018-10322 (backported from commit b42db0860e13067fcc7cbfba3966c9e652668bbc) [ vilhelmgray: context adjustments ] Signed-off-by: William Breathitt Gray --- fs/xfs/libxfs/xfs_inode_buf.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/fs/xfs/libxfs/xfs_inode_buf.c b/fs/xfs/libxfs/xfs_inode_buf.c index 936a72e420b1..a03b9c02d09c 100644 --- a/fs/xfs/libxfs/xfs_inode_buf.c +++ b/fs/xfs/libxfs/xfs_inode_buf.c @@ -349,6 +349,8 @@ xfs_dinode_verify( return false; if (di_size > XFS_DFORK_DSIZE(dip, mp)) return false; + if (dip->di_nextents) + return false; /* fall through */ case XFS_DINODE_FMT_EXTENTS: case XFS_DINODE_FMT_BTREE: @@ -367,12 +369,31 @@ xfs_dinode_verify( if (XFS_DFORK_Q(dip)) { switch (dip->di_aformat) { case XFS_DINODE_FMT_LOCAL: + if (dip->di_anextents) + return false; + /* fall through */ case XFS_DINODE_FMT_EXTENTS: case XFS_DINODE_FMT_BTREE: break; default: return false; } + } else { + /* + * If there is no fork offset, this may be a freshly-made inode + * in a new disk cluster, in which case di_aformat is zeroed. + * Otherwise, such an inode must be in EXTENTS format; this goes + * for freed inodes as well. + */ + switch (dip->di_aformat) { + case 0: + case XFS_DINODE_FMT_EXTENTS: + break; + default: + return false; + } + if (dip->di_anextents) + return false; } /* only version 3 or greater inodes are extensively verified here */