linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Input: uinput - fix Spectre v1 vulnerability
@ 2018-10-16 11:13 Gustavo A. R. Silva
  2018-10-16 17:21 ` Dmitry Torokhov
  0 siblings, 1 reply; 8+ messages in thread
From: Gustavo A. R. Silva @ 2018-10-16 11:13 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input, linux-kernel, Gustavo A. R. Silva

setup.code can be 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/input/misc/uinput.c:512 uinput_abs_setup() warn: potential
spectre issue 'dev->absinfo' [w] (local cap)

Fix this by sanitizing setup.code before using it to index dev->absinfo.

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 <gustavo@embeddedor.com>
---
 drivers/input/misc/uinput.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/input/misc/uinput.c b/drivers/input/misc/uinput.c
index 8ec483e..97b0809 100644
--- a/drivers/input/misc/uinput.c
+++ b/drivers/input/misc/uinput.c
@@ -42,6 +42,8 @@
 #include <linux/input/mt.h>
 #include "../input-compat.h"
 
+#include <linux/nospec.h>
+
 #define UINPUT_NAME		"uinput"
 #define UINPUT_BUFFER_SIZE	16
 #define UINPUT_NUM_REQUESTS	16
@@ -497,6 +499,7 @@ static int uinput_abs_setup(struct uinput_device *udev,
 
 	if (setup.code > ABS_MAX)
 		return -ERANGE;
+	setup.code = array_index_nospec(setup.code, ABS_MAX + 1);
 
 	dev = udev->dev;
 
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] Input: uinput - fix Spectre v1 vulnerability
  2018-10-16 11:13 [PATCH] Input: uinput - fix Spectre v1 vulnerability Gustavo A. R. Silva
@ 2018-10-16 17:21 ` Dmitry Torokhov
  2018-10-16 17:52   ` Gustavo A. R. Silva
  0 siblings, 1 reply; 8+ messages in thread
From: Dmitry Torokhov @ 2018-10-16 17:21 UTC (permalink / raw)
  To: Gustavo A. R. Silva; +Cc: linux-input, linux-kernel

Hi Gustavo,

On Tue, Oct 16, 2018 at 01:13:13PM +0200, Gustavo A. R. Silva wrote:
> setup.code can be 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/input/misc/uinput.c:512 uinput_abs_setup() warn: potential
> spectre issue 'dev->absinfo' [w] (local cap)
> 
> Fix this by sanitizing setup.code before using it to index dev->absinfo.

So we are saying that attacker, by repeatedly calling ioctl(...,
UI_ABS_SETUP, ...) will be able to poison branch predictor and discover
another program or kernel secrets? But uinput is a privileged interface
open to root only, as it allows injecting arbitrary keystrokes into the
kernel. And since only root can use uinput, meh?

Thanks.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Input: uinput - fix Spectre v1 vulnerability
  2018-10-16 17:21 ` Dmitry Torokhov
@ 2018-10-16 17:52   ` Gustavo A. R. Silva
  2018-10-16 18:09     ` Dmitry Torokhov
  2018-10-22 14:14     ` Pavel Machek
  0 siblings, 2 replies; 8+ messages in thread
From: Gustavo A. R. Silva @ 2018-10-16 17:52 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input, linux-kernel

Hi Dmitry,

On 10/16/18 7:21 PM, Dmitry Torokhov wrote:
> Hi Gustavo,
> 
> On Tue, Oct 16, 2018 at 01:13:13PM +0200, Gustavo A. R. Silva wrote:
>> setup.code can be 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/input/misc/uinput.c:512 uinput_abs_setup() warn: potential
>> spectre issue 'dev->absinfo' [w] (local cap)
>>
>> Fix this by sanitizing setup.code before using it to index dev->absinfo.
> 
> So we are saying that attacker, by repeatedly calling ioctl(...,
> UI_ABS_SETUP, ...) will be able to poison branch predictor and discover
> another program or kernel secrets? But uinput is a privileged interface
> open to root only, as it allows injecting arbitrary keystrokes into the
> kernel. And since only root can use uinput, meh?
> 

Oh I see... in that case this is a false positive.

Although, I wonder if all these operations are only accessible to root:

static const struct file_operations uinput_fops = {
        .owner          = THIS_MODULE,
        .open           = uinput_open,
        .release        = uinput_release,
        .read           = uinput_read,
        .write          = uinput_write,
        .poll           = uinput_poll,
        .unlocked_ioctl = uinput_ioctl,
#ifdef CONFIG_COMPAT
        .compat_ioctl   = uinput_compat_ioctl,
#endif
        .llseek         = no_llseek,
};

Thanks for the feedback.
--
Gustavo

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Input: uinput - fix Spectre v1 vulnerability
  2018-10-16 17:52   ` Gustavo A. R. Silva
@ 2018-10-16 18:09     ` Dmitry Torokhov
  2018-10-16 18:12       ` Gustavo A. R. Silva
  2018-10-22 14:14     ` Pavel Machek
  1 sibling, 1 reply; 8+ messages in thread
From: Dmitry Torokhov @ 2018-10-16 18:09 UTC (permalink / raw)
  To: Gustavo A. R. Silva; +Cc: linux-input, linux-kernel

On October 16, 2018 10:52:58 AM PDT, "Gustavo A. R. Silva" <gustavo@embeddedor.com> wrote:
>Hi Dmitry,
>
>On 10/16/18 7:21 PM, Dmitry Torokhov wrote:
>> Hi Gustavo,
>> 
>> On Tue, Oct 16, 2018 at 01:13:13PM +0200, Gustavo A. R. Silva wrote:
>>> setup.code can be 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/input/misc/uinput.c:512 uinput_abs_setup() warn: potential
>>> spectre issue 'dev->absinfo' [w] (local cap)
>>>
>>> Fix this by sanitizing setup.code before using it to index
>dev->absinfo.
>> 
>> So we are saying that attacker, by repeatedly calling ioctl(...,
>> UI_ABS_SETUP, ...) will be able to poison branch predictor and
>discover
>> another program or kernel secrets? But uinput is a privileged
>interface
>> open to root only, as it allows injecting arbitrary keystrokes into
>the
>> kernel. And since only root can use uinput, meh?
>> 
>
>Oh I see... in that case this is a false positive.
>
>Although, I wonder if all these operations are only accessible to root:
>
>static const struct file_operations uinput_fops = {
>        .owner          = THIS_MODULE,
>        .open           = uinput_open,
>        .release        = uinput_release,
>        .read           = uinput_read,
>        .write          = uinput_write,
>        .poll           = uinput_poll,
>        .unlocked_ioctl = uinput_ioctl,
>#ifdef CONFIG_COMPAT
>        .compat_ioctl   = uinput_compat_ioctl,
>#endif
>        .llseek         = no_llseek,
>};

/dev/uinput must be 0600, or accessible to equally privileged user, or you'll be opening your system to much mischief.


Thanks.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Input: uinput - fix Spectre v1 vulnerability
  2018-10-16 18:09     ` Dmitry Torokhov
@ 2018-10-16 18:12       ` Gustavo A. R. Silva
  2018-10-18 19:43         ` Alan Cox
  0 siblings, 1 reply; 8+ messages in thread
From: Gustavo A. R. Silva @ 2018-10-16 18:12 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input, linux-kernel



On 10/16/18 8:09 PM, Dmitry Torokhov wrote:

> 
> /dev/uinput 

I've got it. This explains it all. :)

> must be 0600, or accessible to equally privileged user, or you'll be opening your system to much mischief.
> 
Thanks, Dmitry.
--
Gustavo

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Input: uinput - fix Spectre v1 vulnerability
  2018-10-16 18:12       ` Gustavo A. R. Silva
@ 2018-10-18 19:43         ` Alan Cox
  2018-10-18 20:07           ` Dmitry Torokhov
  0 siblings, 1 reply; 8+ messages in thread
From: Alan Cox @ 2018-10-18 19:43 UTC (permalink / raw)
  To: Gustavo A. R. Silva; +Cc: Dmitry Torokhov, linux-input, linux-kernel

On Tue, 16 Oct 2018 20:12:43 +0200
"Gustavo A. R. Silva" <gustavo@embeddedor.com> wrote:

> On 10/16/18 8:09 PM, Dmitry Torokhov wrote:
> 
> > 
> > /dev/uinput   
> 
> I've got it. This explains it all. :)
> 
> > must be 0600, or accessible to equally privileged user, or you'll be opening your system to much mischief.

Still a correct change.

CAP_SYS_RAWIO is not the same as being root, especially in a container.

Alan

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Input: uinput - fix Spectre v1 vulnerability
  2018-10-18 19:43         ` Alan Cox
@ 2018-10-18 20:07           ` Dmitry Torokhov
  0 siblings, 0 replies; 8+ messages in thread
From: Dmitry Torokhov @ 2018-10-18 20:07 UTC (permalink / raw)
  To: One Thousand Gnomes; +Cc: Gustavo A. R. Silva, linux-input, lkml

On Thu, Oct 18, 2018 at 12:43 PM Alan Cox <gnomes@lxorguk.ukuu.org.uk> wrote:
>
> On Tue, 16 Oct 2018 20:12:43 +0200
> "Gustavo A. R. Silva" <gustavo@embeddedor.com> wrote:
>
> > On 10/16/18 8:09 PM, Dmitry Torokhov wrote:
> >
> > >
> > > /dev/uinput
> >
> > I've got it. This explains it all. :)
> >
> > > must be 0600, or accessible to equally privileged user, or you'll be opening your system to much mischief.
>
> Still a correct change.
>
> CAP_SYS_RAWIO is not the same as being root, especially in a container.

Giving access to uinput in an unprivileged container is nutty as well.

Thanks.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] Input: uinput - fix Spectre v1 vulnerability
  2018-10-16 17:52   ` Gustavo A. R. Silva
  2018-10-16 18:09     ` Dmitry Torokhov
@ 2018-10-22 14:14     ` Pavel Machek
  1 sibling, 0 replies; 8+ messages in thread
From: Pavel Machek @ 2018-10-22 14:14 UTC (permalink / raw)
  To: Gustavo A. R. Silva; +Cc: Dmitry Torokhov, linux-input, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 1545 bytes --]

On Tue 2018-10-16 19:52:58, Gustavo A. R. Silva wrote:
> Hi Dmitry,
> 
> On 10/16/18 7:21 PM, Dmitry Torokhov wrote:
> > Hi Gustavo,
> > 
> > On Tue, Oct 16, 2018 at 01:13:13PM +0200, Gustavo A. R. Silva wrote:
> >> setup.code can be 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/input/misc/uinput.c:512 uinput_abs_setup() warn: potential
> >> spectre issue 'dev->absinfo' [w] (local cap)
> >>
> >> Fix this by sanitizing setup.code before using it to index dev->absinfo.
> > 
> > So we are saying that attacker, by repeatedly calling ioctl(...,
> > UI_ABS_SETUP, ...) will be able to poison branch predictor and discover
> > another program or kernel secrets? But uinput is a privileged interface
> > open to root only, as it allows injecting arbitrary keystrokes into the
> > kernel. And since only root can use uinput, meh?
> > 
> 
> Oh I see... in that case this is a false positive.

No, please lets fix it.

Some people are trying to make sure kernel is "more priviledged" than
root -- its called secure boot etc.

And "if you givean attacker possibility to generate keystrokes, he can
read kernel memory as well"... is very unexpected.

Unexpected is bad when talking about security.
								Pavel
								
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2018-10-22 14:15 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-16 11:13 [PATCH] Input: uinput - fix Spectre v1 vulnerability Gustavo A. R. Silva
2018-10-16 17:21 ` Dmitry Torokhov
2018-10-16 17:52   ` Gustavo A. R. Silva
2018-10-16 18:09     ` Dmitry Torokhov
2018-10-16 18:12       ` Gustavo A. R. Silva
2018-10-18 19:43         ` Alan Cox
2018-10-18 20:07           ` Dmitry Torokhov
2018-10-22 14:14     ` Pavel Machek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).