Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20101108130630.GA3495@albatros>
Date: Mon, 8 Nov 2010 16:06:30 +0300
From: Vasiliy Kulikov <segooon@...il.com>
To: oss-security@...ts.openwall.com
Subject: Re: Linux kernel proactive security hardening

Solar,

On Mon, Nov 08, 2010 at 06:07 +0300, Solar Designer wrote:
> In the absence of cheap-enough general solution/workaround in the
> kernel, I'm afraid we'll need to resort to improving and using automated
> tools to detect bugs of this nature - which is apparently what you and
> Vasiliy were doing lately?  What tools did you use?

At first I was using simple "grep copy_to_user" and manually checked all
calls to copy_to_user().  Then I used coccinelle [1] to search this
pattern: struct allocated on the stack, not prepared with neither
copy_from_user() nor memset(), is copied with copy_to_user().  Both
result are manually checked.  The latter doesn't find all the cases of
leak, see e.g. [2].  The caller copies array, not struct.  Maybe my
cocci script should be added with s/struct/array/ too.  Search with
pahole or similar sucks as many leaks are not only padding bytes leaks,
but trivial uninitialized fields or using strlcpy() (instead of strncpy()).


Also note that even if this "pattern search" process can be fully automated,
we might have another more difficult to discover "pattern": struct is
allocated with kmalloc(), is not fully initialized and then is copied to
userspace, somewhere far from kmalloc() (not in this module or even not
in this driver layer).  Maybe this can be still automated with
coccinelle, e.g. search for all copy_to_user() that copies _not local_
struct/array and then check all dynamic allocation of this struct type
(hard to check _all_ the cases :( ).

But again, it also can be complicated by "virtual methods" those are called
through pointers to functions those use different types of struct: the
caller uses "struct A", the callee uses "struct B" that has struct A as
the first field.  (Yes, I know that the right code should use
container_of() macro.)


[1] http://coccinelle.lip6.fr/

[2] http://www.openwall.com/lists/oss-security/2010/11/02/7


Thanks,

-- 
Vasiliy

Powered by blists - more mailing lists

Please check out the Open Source Software Security Wiki, which is counterpart to this mailing list.

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.