|
|
Message-ID: <201906101111.0868D6BE6@keescook>
Date: Mon, 10 Jun 2019 11:20:43 -0700
From: Kees Cook <keescook@...omium.org>
To: "Khajapasha, Mohammed" <mohammed.khajapasha@...el.com>
Cc: "kernel-hardening@...ts.openwall.com" <kernel-hardening@...ts.openwall.com>
Subject: Re: Regarding add detection for double-reads
On Mon, Jun 10, 2019 at 05:19:17PM +0000, Khajapasha, Mohammed wrote:
> As discussed over IRC, could you please provide some point on "add detection for double-reads".
Hi!
This was about following up on building a good Coccinelle script that
would warn about cases where the kernel reads from userspace twice at
the same location which may result in bugs like reading the size of a
structure at the start of a structure, allocating a size, then filling
the structure with a second read (at which point the size may have
changed). For example:
struct example {
unsigned int bytes;
unsigned int flags;
u8 data[];
}
int do_user_interface(struct example __user *user_instance)
{
struct example *instance;
unsigned int size;
copy_from_user(&size, user_instance, sizeof(size));
instance = kmalloc(size, GFP_KERNEL);
if (!instance)
return -EINVAL;
copy_from_user(instance, user_instance, size);
perform_actions(instance);
}
The "bytes" field of the instance passed to perform_actions() may not
contain the right value, leading to possible heap overflows when
accessing instance->data[]...
What's needed after the second copy_from_user() is:
if (instance.bytes != size) {
kfree(instance);
return -EINVAL;
}
But _finding_ the cases is what I'd like to nail down and get into the
kernel scripts. The thread that needs following up is here:
https://lore.kernel.org/lkml/20160426222442.GA8104@www.outflux.net
--
Kees Cook
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.