Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp310852imu; Wed, 19 Dec 2018 19:19:16 -0800 (PST) X-Google-Smtp-Source: AFSGD/XOS/JWezh89H30PrmvYOFqb6Sx14t+ZZ28CWOo/P0AqgBR3Jz9Ztz8avCCZGoyMvC5PM0o X-Received: by 2002:a63:5153:: with SMTP id r19mr21567426pgl.281.1545275956538; Wed, 19 Dec 2018 19:19:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1545275956; cv=none; d=google.com; s=arc-20160816; b=NtHi0nryj0IavqQaKHxqlZ9m7B4dYJihS8FiIMMsJKSoW0SvQOUrlmjFfbsDVCDp0c MAim8yHaaP3U80L/kxCRj8mzz04sf8z6mnVOUv3bd6VVWhj1EgdWk0M/TyVyBd4Jq0we 1JRJqoNiJ/lTdYVQ8qjKreOq00xg/0trVPW7ZMiC1EjF8Rr6OGKvCikVDobpEuStfNi2 aJKhYvYNrxlAzJeCqhQNaTofsj5Zfxb0l5nhDuFJd0oqVznp3JT6xfYdeBtpaCcmMHt5 KN6Gl4MoVAqxBGkaC43y3vomuqzbwcqXD3o1pXeh35MpUbM/PyrH+Qb4qbL1+Sf3TICq xJzg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:content-disposition :mime-version:message-id:subject:cc:to:from:date; bh=ipaOWlnfIOVGrIAaO1LqPKSMBZKoFxwGRYrNIs7bgTc=; b=a03ca44JMWJNL+oCTEAuOKVujHD0lSbAWdFFNS0qzWWCbUPp8NkXn+mERNCTLwWNqQ qSYVwQ8YziEZ4ehmbXvR1s/nhgtzjjvPoRuRwPUjCrKhRD6Q2pV6D/wA9sgCGm5Ody9M jRd4zybbNYpcgIafNmPa4I18iQY8g0R1RmUSuQ94lnY8WrgeQNHZ55y5S+QvNHywlmDT TtNxwVMOtu5hGtsKTRRKa/QFUtz573NqSrsKLD6UVU49w/sJ7GKyiEvF7yvi877BsPG0 QqnF2ot4gyuCWuKH9ZGA0Ki+8/wsS8n3DQbTLwSq4s7bE2WqO5IWYFwiUDwVSfsF4zoe jxdQ== 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 c11si17816810pgh.18.2018.12.19.19.19.00; Wed, 19 Dec 2018 19:19:16 -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 S1730265AbeLTAAT (ORCPT + 99 others); Wed, 19 Dec 2018 19:00:19 -0500 Received: from gateway24.websitewelcome.com ([192.185.50.73]:14372 "EHLO gateway24.websitewelcome.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727818AbeLTAAS (ORCPT ); Wed, 19 Dec 2018 19:00:18 -0500 Received: from cm10.websitewelcome.com (cm10.websitewelcome.com [100.42.49.4]) by gateway24.websitewelcome.com (Postfix) with ESMTP id 289C59DE6 for ; Wed, 19 Dec 2018 18:00:17 -0600 (CST) Received: from gator4166.hostgator.com ([108.167.133.22]) by cmsmtp with SMTP id ZllBg4N5a2PzOZllBgoWle; Wed, 19 Dec 2018 18:00:17 -0600 X-Authority-Reason: nr=8 Received: from [189.250.106.44] (port=36150 helo=embeddedor) by gator4166.hostgator.com with esmtpa (Exim 4.91) (envelope-from ) id 1gZll9-0010in-Rj; Wed, 19 Dec 2018 18:00:16 -0600 Date: Wed, 19 Dec 2018 18:00:15 -0600 From: "Gustavo A. R. Silva" To: Maarten Lankhorst , Maxime Ripard , Sean Paul , David Airlie , Daniel Vetter Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, "Gustavo A. R. Silva" Subject: [PATCH] drm/ioctl: Fix Spectre v1 vulnerabilities Message-ID: <20181220000015.GA18973@embeddedor> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.9.4 (2018-02-28) X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - gator4166.hostgator.com X-AntiAbuse: Original Domain - vger.kernel.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - embeddedor.com X-BWhitelist: no X-Source-IP: 189.250.106.44 X-Source-L: No X-Exim-ID: 1gZll9-0010in-Rj X-Source: X-Source-Args: X-Source-Dir: X-Source-Sender: (embeddedor) [189.250.106.44]:36150 X-Source-Auth: gustavo@embeddedor.com X-Email-Count: 7 X-Source-Cap: Z3V6aWRpbmU7Z3V6aWRpbmU7Z2F0b3I0MTY2Lmhvc3RnYXRvci5jb20= X-Local-Domain: yes Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org nr is indirectly controlled by user-space, hence leading to a potential exploitation of the Spectre variant 1 vulnerability. This issue was detected with the help of Smatch: drivers/gpu/drm/drm_ioctl.c:805 drm_ioctl() warn: potential spectre issue 'dev->driver->ioctls' [r] drivers/gpu/drm/drm_ioctl.c:810 drm_ioctl() warn: potential spectre issue 'drm_ioctls' [r] (local cap) drivers/gpu/drm/drm_ioctl.c:892 drm_ioctl_flags() warn: potential spectre issue 'drm_ioctls' [r] (local cap) Fix this by sanitizing nr before using it to index dev->driver->ioctls and drm_ioctls. Notice that given that speculation windows are large, the policy is to kill the speculation on the first load and not worry if it can be completed with a dependent load/store [1]. [1] https://marc.info/?l=linux-kernel&m=152449131114778&w=2 Cc: stable@vger.kernel.org Signed-off-by: Gustavo A. R. Silva --- drivers/gpu/drm/drm_ioctl.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c index 94bd872d56c4..7e6746b2d704 100644 --- a/drivers/gpu/drm/drm_ioctl.c +++ b/drivers/gpu/drm/drm_ioctl.c @@ -37,6 +37,7 @@ #include #include +#include /** * DOC: getunique and setversion story @@ -800,13 +801,17 @@ long drm_ioctl(struct file *filp, if (is_driver_ioctl) { /* driver ioctl */ - if (nr - DRM_COMMAND_BASE >= dev->driver->num_ioctls) + unsigned int index = nr - DRM_COMMAND_BASE; + + if (index >= dev->driver->num_ioctls) goto err_i1; - ioctl = &dev->driver->ioctls[nr - DRM_COMMAND_BASE]; + index = array_index_nospec(index, dev->driver->num_ioctls); + ioctl = &dev->driver->ioctls[index]; } else { /* core ioctl */ if (nr >= DRM_CORE_IOCTL_COUNT) goto err_i1; + nr = array_index_nospec(nr, DRM_CORE_IOCTL_COUNT); ioctl = &drm_ioctls[nr]; } @@ -888,6 +893,7 @@ bool drm_ioctl_flags(unsigned int nr, unsigned int *flags) if (nr >= DRM_CORE_IOCTL_COUNT) return false; + nr = array_index_nospec(nr, DRM_CORE_IOCTL_COUNT); *flags = drm_ioctls[nr].flags; return true; -- 2.20.1