Re: [PATCH 1/4] kaslr: check user's config too when handle relocations

Baoquan He
2014-09-10T14:53:54Z

On 09/10/14 at 10:30am, Vivek Goyal wrote:
> On Wed, Sep 10, 2014 at 03:21:15PM +0800, Baoquan He wrote:

> > In fact, I think below checking will be clearer and works too.
> >
> >
> > static void handle_relocations(void *output, unsigned long output_len)
> > {
> >
> > ...
> >
> > #if CONFIG_X86_64
> >
> > or
> >
> > #if CONFIG_RANDOMIZE_BASE
> > #ifdef CONFIG_HIBERNATION
> > if (!cmdline_find_option_bool("kaslr")) {
> > debug_putstr("No relocation needed... ");
> > return;
> > }
> > #else
> > if (cmdline_find_option_bool("nokaslr")) {
> > debug_putstr("No relocation needed... ");
> > return;
> > }
> > #endif
>
> >
> > if (max_addr > CONFIG_RANDOMIZE_BASE_MAX_OFFSET) {
> > debug_putstr("Random addr is not allowed. No relocation
> > needed... \n");
> > return;
>
> Hi Bao,
>
> I dont think that this is required or this is correct. kaslr will not
> choose a physical location which is beyond CONFIG_RANDOMIZE_BASE_MAX_OFFSET,
> So not sure what will this do.
>
> Just the other check of output_orig == output should fix issue for us.
>
> If one is not passing nokaslr in case of kexec, and kernel is loaded
> high (say 64G), I think kaslr will automatically move kernel below 1G
> and handle_relocations() should succeed.

No, if kernel is loaded high (say 64G), the random kernel location
choosing won't happen. Since in process_e820_entry() it only accepts the
memory region which is above output, plus the
CONFIG_RANDOMIZE_BASE_MAX_OFFSET checking, any kenrel loaded high above
1G will not get a new random kernel location. So it's safe in this case.

>
> In case of kdump we will have to pass nokaslr, as we don't want kernel
> to move as it could stomp over other things we have loaded.

For kdump and kexec nokaslr is unnecessary. As you know we always
call add_buffer with buf_end as 1, this will cause kernel loaded at the
top of available memory. E.g on my pc with 16G memory, kexec kernel will
be put nearby 16G, so no random location choosing happen as I said in
above. For kdump, if reserved memory is at 500M~700M, then kernel will
be put nearby 700M, the random location choosing also never happen.

In fact, for some cases I need change kexec-tools user app code, to make
kernel be put from down to top.

>
> So I would suggest that test and repost the other patch with proper changelog
> and that might be sufficient for now. Only other thing we will need is
> Kees's patch for avoiding setup data regions in kaslr.

Anyway, it's great people think the "output_orig=output" is good and can
solve our problems, and it does change less code. I can repost that one
with your suggestion that put some comments above that.

Thanks for your comments and suggstion.

>
> Thanks
> Vivek