2011-04-09 12:41:28

by Vasily Kulikov

[permalink] [raw]
Subject: [PATCH] char: istallion: fix arbitrary kernel memory reads/writes

stli_brdstats is defined as global variable. After de-BKL-ization in
the patch b4eda9cb48eac1b7 an access to the variable is not serialized
anymore. This leads to the TOCTOU in stli_getbrdstats():

if (copy_from_user(&stli_brdstats, bp, sizeof(combrd_t)))
return -EFAULT;
if (stli_brdstats.brd >= STL_MAXBRDS) <<<<
return -ENODEV;
brdp = stli_brds[stli_brdstats.brd]; <<<<

If one process calls COM_GETBRDSTATS ioctl() with sane .brd, second
process calls COM_GETBRDSTATS ioctl() with invalid .brd, and the
second process' copy_from_user() executes exactly between the check and
stli_brds[] indexation of the first process, then the first process gets
contents of memory at *stli_brds[stli_brdstats.brd] address. Also
the resulting .nrpanels field may be too big, in this case
stli_brdstats.panels array overflows.

Signed-off-by: Vasiliy Kulikov <[email protected]>
---
drivers/char/istallion.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/char/istallion.c b/drivers/char/istallion.c
index 7c6de4c..232c5e0 100644
--- a/drivers/char/istallion.c
+++ b/drivers/char/istallion.c
@@ -186,7 +186,6 @@ static struct ktermios stli_deftermios = {
* re-used for each stats call.
*/
static comstats_t stli_comstats;
-static combrd_t stli_brdstats;
static struct asystats stli_cdkstats;

/*****************************************************************************/
@@ -4005,6 +4004,7 @@ static int stli_getbrdstats(combrd_t __user *bp)
{
struct stlibrd *brdp;
unsigned int i;
+ combrd_t stli_brdstats;

if (copy_from_user(&stli_brdstats, bp, sizeof(combrd_t)))
return -EFAULT;
--
1.7.0.4


2011-04-09 13:27:06

by Jiri Slaby

[permalink] [raw]
Subject: Re: [PATCH] char: istallion: fix arbitrary kernel memory reads/writes

On 04/09/2011 02:41 PM, Vasiliy Kulikov wrote:
> stli_brdstats is defined as global variable. After de-BKL-ization in
> the patch b4eda9cb48eac1b7 an access to the variable is not serialized
> anymore. This leads to the TOCTOU in stli_getbrdstats():

Don't use such a weird and uncommon abbreviations.

> --- a/drivers/char/istallion.c
> +++ b/drivers/char/istallion.c

Note that the code moved to staging.

regards,
--
js

2011-04-09 20:25:32

by Valdis Klētnieks

[permalink] [raw]
Subject: Re: [PATCH] char: istallion: fix arbitrary kernel memory reads/writes

On Sat, 09 Apr 2011 15:26:59 +0200, Jiri Slaby said:
> On 04/09/2011 02:41 PM, Vasiliy Kulikov wrote:
> > stli_brdstats is defined as global variable. After de-BKL-ization in
> > the patch b4eda9cb48eac1b7 an access to the variable is not serialized
> > anymore. This leads to the TOCTOU in stli_getbrdstats():
>
> Don't use such a weird and uncommon abbreviations.

Time Of Check [to] Time Of Use. Hardly uncommon, especially in the security
community. Googling for 'TOCTOU' and 'TOCTTOU' gets about 60K hits combined.


Attachments:
(No filename) (227.00 B)

2011-04-09 20:36:12

by Jiri Slaby

[permalink] [raw]
Subject: Re: [PATCH] char: istallion: fix arbitrary kernel memory reads/writes

On 04/09/2011 10:24 PM, [email protected] wrote:
> On Sat, 09 Apr 2011 15:26:59 +0200, Jiri Slaby said:
>> On 04/09/2011 02:41 PM, Vasiliy Kulikov wrote:
>>> stli_brdstats is defined as global variable. After de-BKL-ization in
>>> the patch b4eda9cb48eac1b7 an access to the variable is not serialized
>>> anymore. This leads to the TOCTOU in stli_getbrdstats():
>>
>> Don't use such a weird and uncommon abbreviations.
>
> Time Of Check [to] Time Of Use. Hardly uncommon, especially in the security
> community.

Well, changelogs are not for security community only. And I think I've
read far than enough papers about code analysis and never seen that before.

> Googling for 'TOCTOU' and 'TOCTTOU' gets about 60K hits combined.

Sure, I googled that a bit. But that didn't persuade me at all. It looks
like it is used by a narrow set of experts.

Whatever, I mainly wanted to point out the code move.

thanks,
--
js