|
Message-ID: <CAGXu5jLT-pZc_67UeTJj-dCsRJteT2CCwaviGOKCXHnL8t-URw@mail.gmail.com> Date: Tue, 26 Jul 2016 10:07:22 -0700 From: Kees Cook <keescook@...omium.org> To: Jason Cooper <jason@...edaemon.net> Cc: "Roberts, William C" <william.c.roberts@...el.com>, linux-mm@...r.kernel.org, LKML <linux-kernel@...r.kernel.org>, "kernel-hardening@...ts.openwall.com" <kernel-hardening@...ts.openwall.com>, Russell King - ARM Linux <linux@....linux.org.uk>, Andrew Morton <akpm@...ux-foundation.org>, "Theodore Ts'o" <tytso@....edu>, Arnd Bergmann <arnd@...db.de>, Greg KH <gregkh@...uxfoundation.org>, Catalin Marinas <catalin.marinas@....com>, Will Deacon <will.deacon@....com>, Ralf Baechle <ralf@...ux-mips.org>, "benh@...nel.crashing.org" <benh@...nel.crashing.org>, Paul Mackerras <paulus@...ba.org>, Michael Ellerman <mpe@...erman.id.au>, "David S. Miller" <davem@...emloft.net>, Thomas Gleixner <tglx@...utronix.de>, Ingo Molnar <mingo@...hat.com>, "H. Peter Anvin" <hpa@...or.com>, "x86@...nel.org" <x86@...nel.org>, Al Viro <viro@...iv.linux.org.uk>, Nick Kralevich <nnk@...gle.com>, Jeffrey Vander Stoep <jeffv@...gle.com>, alyzyn@...roid.com, Daniel Cashman <dcashman@...roid.com> Subject: Re: [RFC patch 1/6] random: Simplify API for random address requests On Tue, Jul 26, 2016 at 10:00 AM, Jason Cooper <jason@...edaemon.net> wrote: > Hi Kees, > > On Mon, Jul 25, 2016 at 09:39:58PM -0700, Kees Cook wrote: >> On Mon, Jul 25, 2016 at 8:30 PM, Jason Cooper <jason@...edaemon.net> wrote: >> > On Tue, Jul 26, 2016 at 03:01:55AM +0000, Jason Cooper wrote: >> >> To date, all callers of randomize_range() have set the length to 0, and >> >> check for a zero return value. For the current callers, the only way >> >> to get zero returned is if end <= start. Since they are all adding a >> >> constant to the start address, this is unnecessary. >> >> >> >> We can remove a bunch of needless checks by simplifying the API to do >> >> just what everyone wants, return an address between [start, start + >> >> range]. >> >> >> >> While we're here, s/get_random_int/get_random_long/. No current call >> >> site is adversely affected by get_random_int(), since all current range >> >> requests are < MAX_UINT. However, we should match caller expectations > > merf. UINT_MAX. > >> >> to avoid coming up short (ha!) in the future. >> >> >> >> Signed-off-by: Jason Cooper <jason@...edaemon.net> >> >> --- >> >> drivers/char/random.c | 17 ++++------------- >> >> include/linux/random.h | 2 +- >> >> 2 files changed, 5 insertions(+), 14 deletions(-) >> >> >> >> diff --git a/drivers/char/random.c b/drivers/char/random.c >> >> index 0158d3bff7e5..1251cb2cbab2 100644 >> >> --- a/drivers/char/random.c >> >> +++ b/drivers/char/random.c >> >> @@ -1822,22 +1822,13 @@ unsigned long get_random_long(void) >> >> EXPORT_SYMBOL(get_random_long); >> >> >> >> /* >> >> - * randomize_range() returns a start address such that >> >> - * >> >> - * [...... <range> .....] >> >> - * start end >> >> - * >> >> - * a <range> with size "len" starting at the return value is inside in the >> >> - * area defined by [start, end], but is otherwise randomized. >> >> + * randomize_addr() returns a page aligned address within [start, start + >> >> + * range] >> >> */ >> >> unsigned long >> >> -randomize_range(unsigned long start, unsigned long end, unsigned long len) >> >> +randomize_addr(unsigned long start, unsigned long range) >> >> { >> >> - unsigned long range = end - len - start; >> >> - >> >> - if (end <= start + len) >> >> - return 0; >> >> - return PAGE_ALIGN(get_random_int() % range + start); >> >> + return PAGE_ALIGN(get_random_long() % range + start); >> >> } >> > >> > bah! old patch file. This should have been: >> > >> > if (range == 0) >> > return start; >> > else >> > return PAGE_ALIGN(get_random_long() % range + start); >> >> I think range should be limited to start + range < UINTMAX, > > ULONG_MAX? I agree. Heh, I am plagued by misspelling these constants, and yes, sorry, ULONG_MAX. :) > if (range == 0 || ULONG_MAX - range < start) > return start; Should it "abort" like this? I was thinking just cap the range, something like: if (range > ULONG_MAX - start) range = ULONG_MAX - start > else > return PAGE_ALIGN(get_random_long() % range + start); > > ? > >> and it should be very clear if the range is inclusive or exclusive. > > Sorry, I was reading the original comment, '[start, end]' with square > brackets denoting inclusive. > > Regardless, the math in randomize_range() was just undoing the math at > each of the call sites. This proposed change to randomize_addr() > doesn't alter the current state of affairs wrt inclusive, exclusive. > >> start = 0, range = 4096. does this mean 1 page, or 2 pages possible? > > ooh, good spot. What we have right now is [start, start + range), which > is matching previous behavior. But does not match the old comment, > [start, end]. It should have been [start, end). > > So, you're correct, I need to clarify this in the comments. Okay, cool. Thanks! I'm glad to have this clean-up. :) -Kees > > thx, > > Jason. -- Kees Cook Chrome OS & Brillo Security
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.