From: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com>
To: Kees Cook <keescook@chromium.org>
Cc: linux-kernel@vger.kernel.org, x86@kernel.org,
kernel-hardening@lists.openwall.com, adurbin@google.com,
Eric Northup <digitaleric@google.com>,
jln@google.com, wad@google.com,
Mathias Krause <minipli@googlemail.com>,
Zhang Yanfei <zhangyanfei@cn.fujitsu.com>,
"H. Peter Anvin" <hpa@zytor.com>
Subject: [kernel-hardening] Re: [PATCH 6/7] x86, kaslr: report kernel offset on panic
Date: Wed, 02 Oct 2013 09:38:06 +0900 [thread overview]
Message-ID: <524B6AEE.90301@jp.fujitsu.com> (raw)
In-Reply-To: <1380656245-29975-7-git-send-email-keescook@chromium.org>
(2013/10/02 4:37), Kees Cook wrote:
> When the system panics, include the kernel offset in the report to assist
> in debugging.
>
> Signed-off-by: Kees Cook <keescook@chromium.org>
> ---
> arch/x86/kernel/setup.c | 26 ++++++++++++++++++++++++++
> 1 file changed, 26 insertions(+)
>
> diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
> index f0de629..1708862 100644
> --- a/arch/x86/kernel/setup.c
> +++ b/arch/x86/kernel/setup.c
> @@ -824,6 +824,20 @@ static void __init trim_low_memory_range(void)
> }
>
> /*
> + * Dump out kernel offset information on panic.
> + */
> +static int
> +dump_kernel_offset(struct notifier_block *self, unsigned long v, void *p)
> +{
> + pr_emerg("Kernel Offset: 0x%lx from 0x%lx "
> + "(relocation range: 0x%lx-0x%lx)\n",
> + (unsigned long)&_text - __START_KERNEL, __START_KERNEL,
> + __START_KERNEL_map, MODULES_VADDR-1);
Using phys_base seems better.
> +
> + return 0;
> +}
> +
> +/*
> * Determine if we were loaded by an EFI loader. If so, then we have also been
> * passed the efi memmap, systab, etc., so we should use these data structures
> * for initialization. Note, the efi init code path is determined by the
> @@ -1242,3 +1256,15 @@ void __init i386_reserve_resources(void)
> }
>
> #endif /* CONFIG_X86_32 */
> +
> +static struct notifier_block kernel_offset_notifier = {
> + .notifier_call = dump_kernel_offset
> +};
> +
> +static int __init register_kernel_offset_dumper(void)
> +{
> + atomic_notifier_chain_register(&panic_notifier_list,
> + &kernel_offset_notifier);
> + return 0;
> +}
> +__initcall(register_kernel_offset_dumper);
>
Panic notifier is not executed if kdump is enabled. Maybe, Chrome OS doesn't use
kdump? Anyway, kdump related tools now calculate phys_base from memory map
information passed as ELF PT_LOAD entries like below.
$ LANG=C readelf -l vmcore-rhel6up4
Elf file type is CORE (Core file)
Entry point 0x0
There are 5 program headers, starting at offset 64
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
NOTE 0x0000000000000158 0x0000000000000000 0x0000000000000000
0x0000000000000b08 0x0000000000000b08 0
LOAD 0x0000000000000c60 0xffffffff81000000 0x0000000001000000
0x000000000103b000 0x000000000103b000 RWE 0
LOAD 0x000000000103bc60 0xffff880000001000 0x0000000000001000
0x000000000009cc00 0x000000000009cc00 RWE 0
LOAD 0x00000000010d8860 0xffff880000100000 0x0000000000100000
0x0000000002f00000 0x0000000002f00000 RWE 0
LOAD 0x0000000003fd8860 0xffff880013000000 0x0000000013000000
0x000000002cffd000 0x000000002cffd000 RWE 0
Each PT_LOAD entry is assigned to virtual and physical address. In this case,
1st PT_LOAD entry belongs to kernel text mapping region, from which we can
calculate phys_base value.
Therefore, we already have phys_base information even in case of kdump, and
as long as using kdump-related tools such as crash utility, we don't need
to see ELF PT_LOAD headers as I explain here because they calculate the process
I explain here automatically.
Another idea is to add phys_base value in VMCOREINFO information that is debugging
information for user-land tools to filter crash dump. This is simple string information
so you can see the values contained in some crash dump by using strings command to it.
For example,
$ LANG=C strings vmcore-rhel6up4
CORE
CORE
CORE
CORE
VMCOREINFO
OSRELEASE=2.6.32-345.el6.x86_64
PAGESIZE=4096
SYMBOL(init_uts_ns)=ffffffff81a8e940
SYMBOL(node_online_map)=ffffffff81c09e20
SYMBOL(swapper_pg_dir)=ffffffff81a85000
...cut...
NUMBER(PG_private)=11
NUMBER(PG_swapcache)=16
SYMBOL(phys_base)=ffffffff81a8d010
SYMBOL(init_level4_pgt)=ffffffff81a85000
SYMBOL(node_data)=ffffffff81c06280
LENGTH(node_data)=512
CRASHTIME=1355815389
The problem is that currently phys_base information is somehow exported as virtual address
assigned to phys_base symbol, not the value of it. User-land tools use this to determine
if they need to calculate phys_base. But obviously, it's simpler to export phys_base information
as its value, not the assigned address. Then, as a side-effect, we can check phys_base value
using strings command to crash dump and this is a little handy.
--
Thanks.
HATAYAMA, Daisuke
WARNING: multiple messages have this Message-ID (diff)
From: HATAYAMA Daisuke <d.hatayama@jp.fujitsu.com>
To: Kees Cook <keescook@chromium.org>
Cc: linux-kernel@vger.kernel.org, x86@kernel.org,
kernel-hardening@lists.openwall.com, adurbin@google.com,
Eric Northup <digitaleric@google.com>,
jln@google.com, wad@google.com,
Mathias Krause <minipli@googlemail.com>,
Zhang Yanfei <zhangyanfei@cn.fujitsu.com>,
"H. Peter Anvin" <hpa@zytor.com>
Subject: Re: [PATCH 6/7] x86, kaslr: report kernel offset on panic
Date: Wed, 02 Oct 2013 09:38:06 +0900 [thread overview]
Message-ID: <524B6AEE.90301@jp.fujitsu.com> (raw)
In-Reply-To: <1380656245-29975-7-git-send-email-keescook@chromium.org>
(2013/10/02 4:37), Kees Cook wrote:
> When the system panics, include the kernel offset in the report to assist
> in debugging.
>
> Signed-off-by: Kees Cook <keescook@chromium.org>
> ---
> arch/x86/kernel/setup.c | 26 ++++++++++++++++++++++++++
> 1 file changed, 26 insertions(+)
>
> diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
> index f0de629..1708862 100644
> --- a/arch/x86/kernel/setup.c
> +++ b/arch/x86/kernel/setup.c
> @@ -824,6 +824,20 @@ static void __init trim_low_memory_range(void)
> }
>
> /*
> + * Dump out kernel offset information on panic.
> + */
> +static int
> +dump_kernel_offset(struct notifier_block *self, unsigned long v, void *p)
> +{
> + pr_emerg("Kernel Offset: 0x%lx from 0x%lx "
> + "(relocation range: 0x%lx-0x%lx)\n",
> + (unsigned long)&_text - __START_KERNEL, __START_KERNEL,
> + __START_KERNEL_map, MODULES_VADDR-1);
Using phys_base seems better.
> +
> + return 0;
> +}
> +
> +/*
> * Determine if we were loaded by an EFI loader. If so, then we have also been
> * passed the efi memmap, systab, etc., so we should use these data structures
> * for initialization. Note, the efi init code path is determined by the
> @@ -1242,3 +1256,15 @@ void __init i386_reserve_resources(void)
> }
>
> #endif /* CONFIG_X86_32 */
> +
> +static struct notifier_block kernel_offset_notifier = {
> + .notifier_call = dump_kernel_offset
> +};
> +
> +static int __init register_kernel_offset_dumper(void)
> +{
> + atomic_notifier_chain_register(&panic_notifier_list,
> + &kernel_offset_notifier);
> + return 0;
> +}
> +__initcall(register_kernel_offset_dumper);
>
Panic notifier is not executed if kdump is enabled. Maybe, Chrome OS doesn't use
kdump? Anyway, kdump related tools now calculate phys_base from memory map
information passed as ELF PT_LOAD entries like below.
$ LANG=C readelf -l vmcore-rhel6up4
Elf file type is CORE (Core file)
Entry point 0x0
There are 5 program headers, starting at offset 64
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
NOTE 0x0000000000000158 0x0000000000000000 0x0000000000000000
0x0000000000000b08 0x0000000000000b08 0
LOAD 0x0000000000000c60 0xffffffff81000000 0x0000000001000000
0x000000000103b000 0x000000000103b000 RWE 0
LOAD 0x000000000103bc60 0xffff880000001000 0x0000000000001000
0x000000000009cc00 0x000000000009cc00 RWE 0
LOAD 0x00000000010d8860 0xffff880000100000 0x0000000000100000
0x0000000002f00000 0x0000000002f00000 RWE 0
LOAD 0x0000000003fd8860 0xffff880013000000 0x0000000013000000
0x000000002cffd000 0x000000002cffd000 RWE 0
Each PT_LOAD entry is assigned to virtual and physical address. In this case,
1st PT_LOAD entry belongs to kernel text mapping region, from which we can
calculate phys_base value.
Therefore, we already have phys_base information even in case of kdump, and
as long as using kdump-related tools such as crash utility, we don't need
to see ELF PT_LOAD headers as I explain here because they calculate the process
I explain here automatically.
Another idea is to add phys_base value in VMCOREINFO information that is debugging
information for user-land tools to filter crash dump. This is simple string information
so you can see the values contained in some crash dump by using strings command to it.
For example,
$ LANG=C strings vmcore-rhel6up4
CORE
CORE
CORE
CORE
VMCOREINFO
OSRELEASE=2.6.32-345.el6.x86_64
PAGESIZE=4096
SYMBOL(init_uts_ns)=ffffffff81a8e940
SYMBOL(node_online_map)=ffffffff81c09e20
SYMBOL(swapper_pg_dir)=ffffffff81a85000
...cut...
NUMBER(PG_private)=11
NUMBER(PG_swapcache)=16
SYMBOL(phys_base)=ffffffff81a8d010
SYMBOL(init_level4_pgt)=ffffffff81a85000
SYMBOL(node_data)=ffffffff81c06280
LENGTH(node_data)=512
CRASHTIME=1355815389
The problem is that currently phys_base information is somehow exported as virtual address
assigned to phys_base symbol, not the value of it. User-land tools use this to determine
if they need to calculate phys_base. But obviously, it's simpler to export phys_base information
as its value, not the assigned address. Then, as a side-effect, we can check phys_base value
using strings command to crash dump and this is a little handy.
--
Thanks.
HATAYAMA, Daisuke
next prev parent reply other threads:[~2013-10-02 0:38 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-01 19:37 [kernel-hardening] [PATCH v6 0/7] Kernel base address randomization Kees Cook
2013-10-01 19:37 ` Kees Cook
2013-10-01 19:37 ` [kernel-hardening] [PATCH 1/7] x86, kaslr: move CPU flags out of cpucheck Kees Cook
2013-10-01 19:37 ` Kees Cook
2013-10-01 20:48 ` [kernel-hardening] " H. Peter Anvin
2013-10-01 20:48 ` H. Peter Anvin
2013-10-01 21:09 ` [kernel-hardening] " Kees Cook
2013-10-01 21:09 ` Kees Cook
2013-10-01 19:37 ` [kernel-hardening] [PATCH 2/7] x86, kaslr: return location from decompress_kernel Kees Cook
2013-10-01 19:37 ` Kees Cook
2013-10-01 19:37 ` [kernel-hardening] [PATCH 3/7] x86, kaslr: find minimum safe relocation position Kees Cook
2013-10-01 19:37 ` Kees Cook
2013-10-01 19:37 ` [kernel-hardening] [PATCH 4/7] x86, kaslr: select random base offset Kees Cook
2013-10-01 19:37 ` Kees Cook
2013-10-01 20:46 ` [kernel-hardening] " H. Peter Anvin
2013-10-01 20:46 ` H. Peter Anvin
2013-10-01 21:18 ` [kernel-hardening] " Kees Cook
2013-10-01 21:18 ` Kees Cook
2013-10-01 19:37 ` [kernel-hardening] [PATCH 5/7] x86, kaslr: select memory region from e820 maps Kees Cook
2013-10-01 19:37 ` Kees Cook
2013-10-01 19:37 ` [kernel-hardening] [PATCH 6/7] x86, kaslr: report kernel offset on panic Kees Cook
2013-10-01 19:37 ` Kees Cook
2013-10-02 0:38 ` HATAYAMA Daisuke [this message]
2013-10-02 0:38 ` HATAYAMA Daisuke
2013-10-02 1:06 ` [kernel-hardening] " HATAYAMA Daisuke
2013-10-02 1:06 ` HATAYAMA Daisuke
2013-10-02 7:51 ` [kernel-hardening] " Kees Cook
2013-10-02 7:51 ` Kees Cook
2013-10-02 7:48 ` [kernel-hardening] " Kees Cook
2013-10-02 7:48 ` Kees Cook
2013-10-02 9:13 ` [kernel-hardening] " HATAYAMA Daisuke
2013-10-02 9:13 ` HATAYAMA Daisuke
2013-10-03 0:33 ` [kernel-hardening] " HATAYAMA Daisuke
2013-10-03 0:33 ` HATAYAMA Daisuke
2013-10-03 13:47 ` [kernel-hardening] " Dave Anderson
2013-10-03 13:47 ` Dave Anderson
2013-10-07 1:59 ` [kernel-hardening] " HATAYAMA Daisuke
2013-10-07 1:59 ` HATAYAMA Daisuke
2013-10-07 13:21 ` [kernel-hardening] " Dave Anderson
2013-10-07 13:21 ` Dave Anderson
2013-10-08 9:52 ` [kernel-hardening] " HATAYAMA Daisuke
2013-10-08 9:52 ` HATAYAMA Daisuke
2013-10-08 13:38 ` [kernel-hardening] " Dave Anderson
2013-10-08 13:38 ` Dave Anderson
2013-10-09 10:04 ` [kernel-hardening] " HATAYAMA Daisuke
2013-10-09 10:04 ` HATAYAMA Daisuke
2013-10-09 14:13 ` [kernel-hardening] " H. Peter Anvin
2013-10-09 14:13 ` H. Peter Anvin
2013-10-09 18:06 ` [kernel-hardening] " Kees Cook
2013-10-09 18:06 ` Kees Cook
2013-10-01 19:37 ` [kernel-hardening] [PATCH 7/7] x86, kaslr: raise max positions to 1GiB on x86_64 Kees Cook
2013-10-01 19:37 ` Kees Cook
2013-10-02 5:07 ` [kernel-hardening] Re: [PATCH v6 0/7] Kernel base address randomization Ingo Molnar
2013-10-02 5:07 ` Ingo Molnar
2013-10-02 5:11 ` [kernel-hardening] " H. Peter Anvin
2013-10-02 5:11 ` H. Peter Anvin
2013-10-02 5:25 ` [kernel-hardening] " Ingo Molnar
2013-10-02 5:25 ` Ingo Molnar
2013-10-02 5:30 ` [kernel-hardening] " H. Peter Anvin
2013-10-02 5:30 ` H. Peter Anvin
2013-10-02 5:36 ` [kernel-hardening] " Kees Cook
2013-10-02 5:36 ` Kees Cook
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=524B6AEE.90301@jp.fujitsu.com \
--to=d.hatayama@jp.fujitsu.com \
--cc=adurbin@google.com \
--cc=digitaleric@google.com \
--cc=hpa@zytor.com \
--cc=jln@google.com \
--cc=keescook@chromium.org \
--cc=kernel-hardening@lists.openwall.com \
--cc=linux-kernel@vger.kernel.org \
--cc=minipli@googlemail.com \
--cc=wad@google.com \
--cc=x86@kernel.org \
--cc=zhangyanfei@cn.fujitsu.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.