2018-10-16 11:14:10

by Gustavo A. R. Silva

[permalink] [raw]
Subject: [PATCH] Input: uinput - fix Spectre v1 vulnerability

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: [email protected]
Signed-off-by: Gustavo A. R. Silva <[email protected]>
---
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



2018-10-16 17:34:50

by Dmitry Torokhov

[permalink] [raw]
Subject: Re: [PATCH] Input: uinput - fix Spectre v1 vulnerability

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

2018-10-16 18:10:58

by Dmitry Torokhov

[permalink] [raw]
Subject: Re: [PATCH] Input: uinput - fix Spectre v1 vulnerability

On October 16, 2018 10:52:58 AM PDT, "Gustavo A. R. Silva" <[email protected]> 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

2018-10-16 18:14:01

by Gustavo A. R. Silva

[permalink] [raw]
Subject: Re: [PATCH] Input: uinput - fix Spectre v1 vulnerability



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

2018-10-16 18:18:18

by Gustavo A. R. Silva

[permalink] [raw]
Subject: Re: [PATCH] Input: uinput - fix Spectre v1 vulnerability

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

2018-10-18 20:08:20

by Dmitry Torokhov

[permalink] [raw]
Subject: Re: [PATCH] Input: uinput - fix Spectre v1 vulnerability

On Thu, Oct 18, 2018 at 12:43 PM Alan Cox <[email protected]> wrote:
>
> On Tue, 16 Oct 2018 20:12:43 +0200
> "Gustavo A. R. Silva" <[email protected]> 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

2018-10-18 20:29:22

by Alan Cox

[permalink] [raw]
Subject: Re: [PATCH] Input: uinput - fix Spectre v1 vulnerability

On Tue, 16 Oct 2018 20:12:43 +0200
"Gustavo A. R. Silva" <[email protected]> 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

2018-10-22 14:50:37

by Pavel Machek

[permalink] [raw]
Subject: Re: [PATCH] Input: uinput - fix Spectre v1 vulnerability

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


Attachments:
(No filename) (1.51 kB)
signature.asc (188.00 B)
Digital signature
Download all attachments