Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp2983068imu; Sun, 9 Dec 2018 14:15:45 -0800 (PST) X-Google-Smtp-Source: AFSGD/Xzn2Mjhkw3SQ0hz6Na+/ItiFwnfbwMKE8pH3UsMkU706EbHLkrvnSTHNehfmxTS6Ri1Qfx X-Received: by 2002:a62:1bd7:: with SMTP id b206mr10021637pfb.213.1544393745121; Sun, 09 Dec 2018 14:15:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1544393745; cv=none; d=google.com; s=arc-20160816; b=DBBRfRfbnVgfA6jVFMSdig6IvolPmzEeODYU3F7Qp61nPeVJNhdjniWmb3oRNNejkn UBoU9Dp4aKnmT+WnorMk41ZMfqVKdWjJWZuBFU2WFH2alRIYCFBQl3cCh1cisyWaAaox eBD56k9Z/tQ0f3lm0LhaekomzAj57+Za1TCKqvsFH9bc7fBhWDM9unjgsixLkmzXEH77 qQjnDeADcLa9YhrBn3PHZfnfyjn+IczAgSJXkztAKsV7RUy+Bm+6u0hcoa1XzDPGCORg nM10fPC1/RO17x42it/9OGb8M5VhzKwlEewnhoVNq5BOs9opLXTgqjjOE1siPAfzb1Hu +jlw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:subject:message-id:date:cc:to :from:mime-version:content-transfer-encoding:content-disposition; bh=HQHnzYvih1huCYF4oxXsryfUAF41jPxSCIm9rrvh16I=; b=q3JKofTjx8afWSIIPbyi8rpEv5xaKi8Q16PPn3l1RGxMGxdLL0/75ux1Fh2Yrey+Gk a9SeGkb8bhy/Sz4l1p22EZboNXaUJTlXWg9XecsioQYy7oLWweQeqre8T8Y1Qv27cVD4 fPdADEqhpIXcS9dhNbmF5yt5T/NfuHWc5UTDcATj1R+fEsfB75/kCYEjKqNUbU3u9gpq BdLPn+gMRCiY31mfPo8KtN0MDWdPBFlwHLl0/BOqAxevB4TQVjtwRKapxRo6luU8ywh0 tRs7/t1U53JQ0N4105YWgASthsCe8qSGEGfARRD0UWxiU2WK3K4XbIkcmnr2192X5fpx D85w== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p3si8144866pgi.0.2018.12.09.14.15.29; Sun, 09 Dec 2018 14:15:45 -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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728120AbeLIWON (ORCPT + 99 others); Sun, 9 Dec 2018 17:14:13 -0500 Received: from shadbolt.e.decadent.org.uk ([88.96.1.126]:38036 "EHLO shadbolt.e.decadent.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728507AbeLIWOL (ORCPT ); Sun, 9 Dec 2018 17:14:11 -0500 Received: from pub.yeoldevic.com ([81.174.156.145] helo=deadeye) by shadbolt.decadent.org.uk with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1gW73B-0002iY-Vb; Sun, 09 Dec 2018 21:55:46 +0000 Received: from ben by deadeye with local (Exim 4.91) (envelope-from ) id 1gW72e-0003QG-5T; Sun, 09 Dec 2018 21:55:12 +0000 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 From: Ben Hutchings To: linux-kernel@vger.kernel.org, stable@vger.kernel.org CC: akpm@linux-foundation.org, "Jeremy Cline" , "Josh Poimboeuf" , "Jan Kara" Date: Sun, 09 Dec 2018 21:50:33 +0000 Message-ID: X-Mailer: LinuxStableQueue (scripts by bwh) X-Patchwork-Hint: ignore Subject: [PATCH 3.16 154/328] fs/quota: Fix spectre gadget in do_quotactl In-Reply-To: X-SA-Exim-Connect-IP: 81.174.156.145 X-SA-Exim-Mail-From: ben@decadent.org.uk X-SA-Exim-Scanned: No (on shadbolt.decadent.org.uk); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 3.16.62-rc1 review patch. If anyone has any objections, please let me know. ------------------ From: Jeremy Cline commit 7b6924d94a60c6b8c1279ca003e8744e6cd9e8b1 upstream. 'type' is user-controlled, so sanitize it after the bounds check to avoid using it in speculative execution. This covers the following potential gadgets detected with the help of smatch: * fs/ext4/super.c:5741 ext4_quota_read() warn: potential spectre issue 'sb_dqopt(sb)->files' [r] * fs/ext4/super.c:5778 ext4_quota_write() warn: potential spectre issue 'sb_dqopt(sb)->files' [r] * fs/f2fs/super.c:1552 f2fs_quota_read() warn: potential spectre issue 'sb_dqopt(sb)->files' [r] * fs/f2fs/super.c:1608 f2fs_quota_write() warn: potential spectre issue 'sb_dqopt(sb)->files' [r] * fs/quota/dquot.c:412 mark_info_dirty() warn: potential spectre issue 'sb_dqopt(sb)->info' [w] * fs/quota/dquot.c:933 dqinit_needed() warn: potential spectre issue 'dquots' [r] * fs/quota/dquot.c:2112 dquot_commit_info() warn: potential spectre issue 'dqopt->ops' [r] * fs/quota/dquot.c:2362 vfs_load_quota_inode() warn: potential spectre issue 'dqopt->files' [w] (local cap) * fs/quota/dquot.c:2369 vfs_load_quota_inode() warn: potential spectre issue 'dqopt->ops' [w] (local cap) * fs/quota/dquot.c:2370 vfs_load_quota_inode() warn: potential spectre issue 'dqopt->info' [w] (local cap) * fs/quota/quota.c:110 quota_getfmt() warn: potential spectre issue 'sb_dqopt(sb)->info' [r] * fs/quota/quota_v2.c:84 v2_check_quota_file() warn: potential spectre issue 'quota_magics' [w] * fs/quota/quota_v2.c:85 v2_check_quota_file() warn: potential spectre issue 'quota_versions' [w] * fs/quota/quota_v2.c:96 v2_read_file_info() warn: potential spectre issue 'dqopt->info' [r] * fs/quota/quota_v2.c:172 v2_write_file_info() warn: potential spectre issue 'dqopt->info' [r] Additionally, a quick inspection indicates there are array accesses with 'type' in quota_on() and quota_off() functions which are also addressed by this. Cc: Josh Poimboeuf Signed-off-by: Jeremy Cline Signed-off-by: Jan Kara [bwh: Backported to 3.16: The maximum valid quota type is command-dependent. Introduce a local variable rather than repeating the expression.] Signed-off-by: Ben Hutchings --- --- a/fs/quota/quota.c +++ b/fs/quota/quota.c @@ -17,6 +17,7 @@ #include #include #include +#include static int check_quotactl_permission(struct super_block *sb, int type, int cmd, qid_t id) @@ -405,10 +406,12 @@ static int quota_rmxquota(struct super_b static int do_quotactl(struct super_block *sb, int type, int cmd, qid_t id, void __user *addr, struct path *path) { + unsigned int max_quotas = XQM_COMMAND(cmd) ? XQM_MAXQUOTAS : MAXQUOTAS; int ret; - if (type >= (XQM_COMMAND(cmd) ? XQM_MAXQUOTAS : MAXQUOTAS)) + if (type >= max_quotas) return -EINVAL; + type = array_index_nospec(type, max_quotas); if (!sb->s_qcop) return -ENOSYS;