Message ID | 20200205223950.1212394-6-kristen@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Finer grained kernel address space randomization | expand |
On Wed, Feb 05, 2020 at 02:39:44PM -0800, Kristen Carlson Accardi wrote: > Allow user to select CONFIG_FG_KASLR if dependencies are met. Change > the make file to build with -ffunction-sections if CONFIG_FG_KASLR > > Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com> > --- > Makefile | 4 ++++ > arch/x86/Kconfig | 13 +++++++++++++ > 2 files changed, 17 insertions(+) > > diff --git a/Makefile b/Makefile > index c50ef91f6136..41438a921666 100644 > --- a/Makefile > +++ b/Makefile > @@ -846,6 +846,10 @@ ifdef CONFIG_LIVEPATCH > KBUILD_CFLAGS += $(call cc-option, -flive-patching=inline-clone) > endif > > +ifdef CONFIG_FG_KASLR > +KBUILD_CFLAGS += -ffunction-sections > +endif The GCC manual has: -ffunction-sections -fdata-sections Place each function or data item into its own section in the output file if the target supports arbitrary sections. The name of the function or the name of the data item determines the section’s name in the output file. Use these options on systems where the linker can perform optimizations to improve locality of reference in the instruction space. Most systems using the ELF object format have linkers with such optimizations. On AIX, the linker rearranges sections (CSECTs) based on the call graph. The performance impact varies. Together with a linker garbage collection (linker --gc-sections option) these options may lead to smaller statically-linked executables (after stripping). On ELF/DWARF systems these options do not degenerate the quality of the debug information. There could be issues with other object files/debug info formats. Only use these options when there are significant benefits from doing so. When you specify these options, the assembler and linker create larger object and executable files and are also slower. These options affect code generation. They prevent optimizations by the compiler and assembler using relative locations inside a translation unit since the locations are unknown until link time. An example of such an optimization is relaxing calls to short call instructions. In particular: "They prevent optimizations by the compiler and assembler using relative locations inside a translation unit since the locations are unknown until link time." I suppose in practise this only means tail-calls are affected and will no longer use JMP.d8. Or are more things affected? (Also, should not the next patch come before this one?)
On Thu, Feb 06, 2020 at 11:30:55AM +0100, Peter Zijlstra wrote: > On Wed, Feb 05, 2020 at 02:39:44PM -0800, Kristen Carlson Accardi wrote: > > Allow user to select CONFIG_FG_KASLR if dependencies are met. Change > > the make file to build with -ffunction-sections if CONFIG_FG_KASLR > > > > Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com> > > --- > > Makefile | 4 ++++ > > arch/x86/Kconfig | 13 +++++++++++++ > > 2 files changed, 17 insertions(+) > > > > diff --git a/Makefile b/Makefile > > index c50ef91f6136..41438a921666 100644 > > --- a/Makefile > > +++ b/Makefile > > @@ -846,6 +846,10 @@ ifdef CONFIG_LIVEPATCH > > KBUILD_CFLAGS += $(call cc-option, -flive-patching=inline-clone) > > endif > > > > +ifdef CONFIG_FG_KASLR > > +KBUILD_CFLAGS += -ffunction-sections > > +endif > [...] > In particular: > > "They prevent optimizations by the compiler and assembler using > relative locations inside a translation unit since the locations are > unknown until link time." I think this mainly a feature of this flag, since it's those relocations that are used to do the post-shuffle fixups. But yes, I would imagine this has some negative impact on code generation. > I suppose in practise this only means tail-calls are affected and will > no longer use JMP.d8. Or are more things affected? It's worth looking at. I'm also curious to see how this will interact with Link Time Optimization.
On Wed, Feb 05, 2020 at 02:39:44PM -0800, Kristen Carlson Accardi wrote: > Allow user to select CONFIG_FG_KASLR if dependencies are met. Change > the make file to build with -ffunction-sections if CONFIG_FG_KASLR > > Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com> > --- > Makefile | 4 ++++ > arch/x86/Kconfig | 13 +++++++++++++ > 2 files changed, 17 insertions(+) > > diff --git a/Makefile b/Makefile > index c50ef91f6136..41438a921666 100644 > --- a/Makefile > +++ b/Makefile > @@ -846,6 +846,10 @@ ifdef CONFIG_LIVEPATCH > KBUILD_CFLAGS += $(call cc-option, -flive-patching=inline-clone) > endif > > +ifdef CONFIG_FG_KASLR > +KBUILD_CFLAGS += -ffunction-sections > +endif > + With -ffunction-sections I get a few unreachable code warnings from objtool. arch/x86/kernel/dumpstack.o: warning: objtool: show_iret_regs()+0x10: unreachable instruction fs/sysfs/dir.o: warning: objtool: sysfs_create_mount_point()+0x4f: unreachable instruction kernel/time/clocksource.o: warning: objtool: __clocksource_register_scale()+0x21: unreachable instruction drivers/tty/sysrq.o: warning: objtool: sysrq_filter()+0x2ef: unreachable instruction arch/x86/mm/fault.o: warning: objtool: pgtable_bad()+0x3f: unreachable instruction drivers/acpi/pci_root.o: warning: objtool: acpi_pci_osc_control_set()+0x123: unreachable instruction drivers/rtc/class.o: warning: objtool: devm_rtc_device_register()+0x40: unreachable instruction kernel/power/process.o: warning: objtool: freeze_processes.cold()+0x0: unreachable instruction drivers/pnp/quirks.o: warning: objtool: quirk_awe32_resources()+0x42: unreachable instruction drivers/acpi/utils.o: warning: objtool: acpi_evaluate_dsm()+0xf1: unreachable instruction kernel/reboot.o: warning: objtool: __do_sys_reboot()+0x1b6: unreachable instruction kernel/power/swap.o: warning: objtool: swsusp_read()+0x185: unreachable instruction drivers/hid/hid-core.o: warning: objtool: hid_hw_start()+0x38: unreachable instruction drivers/acpi/battery.o: warning: objtool: sysfs_add_battery.cold()+0x1a: unreachable instruction arch/x86/kernel/cpu/mce/core.o: warning: objtool: do_machine_check.cold()+0x33: unreachable instruction drivers/pcmcia/cistpl.o: warning: objtool: pccard_store_cis()+0x4e: unreachable instruction drivers/gpu/vga/vgaarb.o: warning: objtool: pci_notify()+0x35: unreachable instruction arch/x86/kernel/tsc.o: warning: objtool: determine_cpu_tsc_frequencies()+0x45: unreachable instruction drivers/pcmcia/yenta_socket.o: warning: objtool: ti1250_override()+0x50: unreachable instruction fs/proc/proc_sysctl.o: warning: objtool: sysctl_print_dir.isra.0()+0x19: unreachable instruction drivers/iommu/intel-iommu.o: warning: objtool: intel_iommu_init()+0x4f4: unreachable instruction net/mac80211/ibss.o: warning: objtool: ieee80211_ibss_work.cold()+0x157: unreachable instruction drivers/net/ethernet/intel/e1000/e1000_main.o: warning: objtool: e1000_clean.cold()+0x0: unreachable instruction net/core/skbuff.o: warning: objtool: skb_dump.cold()+0x3fd: unreachable instruction
On Tue, 2020-02-25 at 12:55 -0500, Arvind Sankar wrote: > On Wed, Feb 05, 2020 at 02:39:44PM -0800, Kristen Carlson Accardi > wrote: > > Allow user to select CONFIG_FG_KASLR if dependencies are met. > > Change > > the make file to build with -ffunction-sections if CONFIG_FG_KASLR > > > > Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com> > > --- > > Makefile | 4 ++++ > > arch/x86/Kconfig | 13 +++++++++++++ > > 2 files changed, 17 insertions(+) > > > > diff --git a/Makefile b/Makefile > > index c50ef91f6136..41438a921666 100644 > > --- a/Makefile > > +++ b/Makefile > > @@ -846,6 +846,10 @@ ifdef CONFIG_LIVEPATCH > > KBUILD_CFLAGS += $(call cc-option, -flive-patching=inline-clone) > > endif > > > > +ifdef CONFIG_FG_KASLR > > +KBUILD_CFLAGS += -ffunction-sections > > +endif > > + > > With -ffunction-sections I get a few unreachable code warnings from > objtool. > > arch/x86/kernel/dumpstack.o: warning: objtool: show_iret_regs()+0x10: > unreachable instruction > fs/sysfs/dir.o: warning: objtool: sysfs_create_mount_point()+0x4f: > unreachable instruction > kernel/time/clocksource.o: warning: objtool: > __clocksource_register_scale()+0x21: unreachable instruction > drivers/tty/sysrq.o: warning: objtool: sysrq_filter()+0x2ef: > unreachable instruction > arch/x86/mm/fault.o: warning: objtool: pgtable_bad()+0x3f: > unreachable instruction > drivers/acpi/pci_root.o: warning: objtool: > acpi_pci_osc_control_set()+0x123: unreachable instruction > drivers/rtc/class.o: warning: objtool: > devm_rtc_device_register()+0x40: unreachable instruction > kernel/power/process.o: warning: objtool: > freeze_processes.cold()+0x0: unreachable instruction > drivers/pnp/quirks.o: warning: objtool: quirk_awe32_resources()+0x42: > unreachable instruction > drivers/acpi/utils.o: warning: objtool: acpi_evaluate_dsm()+0xf1: > unreachable instruction > kernel/reboot.o: warning: objtool: __do_sys_reboot()+0x1b6: > unreachable instruction > kernel/power/swap.o: warning: objtool: swsusp_read()+0x185: > unreachable instruction > drivers/hid/hid-core.o: warning: objtool: hid_hw_start()+0x38: > unreachable instruction > drivers/acpi/battery.o: warning: objtool: > sysfs_add_battery.cold()+0x1a: unreachable instruction > arch/x86/kernel/cpu/mce/core.o: warning: objtool: > do_machine_check.cold()+0x33: unreachable instruction > drivers/pcmcia/cistpl.o: warning: objtool: pccard_store_cis()+0x4e: > unreachable instruction > drivers/gpu/vga/vgaarb.o: warning: objtool: pci_notify()+0x35: > unreachable instruction > arch/x86/kernel/tsc.o: warning: objtool: > determine_cpu_tsc_frequencies()+0x45: unreachable instruction > drivers/pcmcia/yenta_socket.o: warning: objtool: > ti1250_override()+0x50: unreachable instruction > fs/proc/proc_sysctl.o: warning: objtool: > sysctl_print_dir.isra.0()+0x19: unreachable instruction > drivers/iommu/intel-iommu.o: warning: objtool: > intel_iommu_init()+0x4f4: unreachable instruction > net/mac80211/ibss.o: warning: objtool: > ieee80211_ibss_work.cold()+0x157: unreachable instruction > drivers/net/ethernet/intel/e1000/e1000_main.o: warning: objtool: > e1000_clean.cold()+0x0: unreachable instruction > net/core/skbuff.o: warning: objtool: skb_dump.cold()+0x3fd: > unreachable instruction Thanks, I will look into this. I also get these warnings - I've been ignoring them successfully so far, but I'll root cause the issue.
On Tue, 2020-02-25 at 12:55 -0500, Arvind Sankar wrote: > On Wed, Feb 05, 2020 at 02:39:44PM -0800, Kristen Carlson Accardi > wrote: > > Allow user to select CONFIG_FG_KASLR if dependencies are met. > > Change > > the make file to build with -ffunction-sections if CONFIG_FG_KASLR > > > > Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com> > > --- > > Makefile | 4 ++++ > > arch/x86/Kconfig | 13 +++++++++++++ > > 2 files changed, 17 insertions(+) > > > > diff --git a/Makefile b/Makefile > > index c50ef91f6136..41438a921666 100644 > > --- a/Makefile > > +++ b/Makefile > > @@ -846,6 +846,10 @@ ifdef CONFIG_LIVEPATCH > > KBUILD_CFLAGS += $(call cc-option, -flive-patching=inline-clone) > > endif > > > > +ifdef CONFIG_FG_KASLR > > +KBUILD_CFLAGS += -ffunction-sections > > +endif > > + > > With -ffunction-sections I get a few unreachable code warnings from > objtool. > > arch/x86/kernel/dumpstack.o: warning: objtool: show_iret_regs()+0x10: > unreachable instruction > fs/sysfs/dir.o: warning: objtool: sysfs_create_mount_point()+0x4f: > unreachable instruction > kernel/time/clocksource.o: warning: objtool: > __clocksource_register_scale()+0x21: unreachable instruction > drivers/tty/sysrq.o: warning: objtool: sysrq_filter()+0x2ef: > unreachable instruction > arch/x86/mm/fault.o: warning: objtool: pgtable_bad()+0x3f: > unreachable instruction > drivers/acpi/pci_root.o: warning: objtool: > acpi_pci_osc_control_set()+0x123: unreachable instruction > drivers/rtc/class.o: warning: objtool: > devm_rtc_device_register()+0x40: unreachable instruction > kernel/power/process.o: warning: objtool: > freeze_processes.cold()+0x0: unreachable instruction > drivers/pnp/quirks.o: warning: objtool: quirk_awe32_resources()+0x42: > unreachable instruction > drivers/acpi/utils.o: warning: objtool: acpi_evaluate_dsm()+0xf1: > unreachable instruction > kernel/reboot.o: warning: objtool: __do_sys_reboot()+0x1b6: > unreachable instruction > kernel/power/swap.o: warning: objtool: swsusp_read()+0x185: > unreachable instruction > drivers/hid/hid-core.o: warning: objtool: hid_hw_start()+0x38: > unreachable instruction > drivers/acpi/battery.o: warning: objtool: > sysfs_add_battery.cold()+0x1a: unreachable instruction > arch/x86/kernel/cpu/mce/core.o: warning: objtool: > do_machine_check.cold()+0x33: unreachable instruction > drivers/pcmcia/cistpl.o: warning: objtool: pccard_store_cis()+0x4e: > unreachable instruction > drivers/gpu/vga/vgaarb.o: warning: objtool: pci_notify()+0x35: > unreachable instruction > arch/x86/kernel/tsc.o: warning: objtool: > determine_cpu_tsc_frequencies()+0x45: unreachable instruction > drivers/pcmcia/yenta_socket.o: warning: objtool: > ti1250_override()+0x50: unreachable instruction > fs/proc/proc_sysctl.o: warning: objtool: > sysctl_print_dir.isra.0()+0x19: unreachable instruction > drivers/iommu/intel-iommu.o: warning: objtool: > intel_iommu_init()+0x4f4: unreachable instruction > net/mac80211/ibss.o: warning: objtool: > ieee80211_ibss_work.cold()+0x157: unreachable instruction > drivers/net/ethernet/intel/e1000/e1000_main.o: warning: objtool: > e1000_clean.cold()+0x0: unreachable instruction > net/core/skbuff.o: warning: objtool: skb_dump.cold()+0x3fd: > unreachable instruction I'm still working on a solution, but the issue here is that any .cold function is going to be in a different section than the related function, and when objtool is searching for instructions in find_insn(), it assumes that it must be in the same section as the caller.
On Tue, Mar 24, 2020 at 02:24:51PM -0700, Kristen Carlson Accardi wrote: > On Tue, 2020-02-25 at 12:55 -0500, Arvind Sankar wrote: > > On Wed, Feb 05, 2020 at 02:39:44PM -0800, Kristen Carlson Accardi > > wrote: > > > Allow user to select CONFIG_FG_KASLR if dependencies are met. > > > Change > > > the make file to build with -ffunction-sections if CONFIG_FG_KASLR > > > > > > Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com> > > > --- > > > Makefile | 4 ++++ > > > arch/x86/Kconfig | 13 +++++++++++++ > > > 2 files changed, 17 insertions(+) > > > > > > diff --git a/Makefile b/Makefile > > > index c50ef91f6136..41438a921666 100644 > > > --- a/Makefile > > > +++ b/Makefile > > > @@ -846,6 +846,10 @@ ifdef CONFIG_LIVEPATCH > > > KBUILD_CFLAGS += $(call cc-option, -flive-patching=inline-clone) > > > endif > > > > > > +ifdef CONFIG_FG_KASLR > > > +KBUILD_CFLAGS += -ffunction-sections > > > +endif > > > + > > > > With -ffunction-sections I get a few unreachable code warnings from > > objtool. > > > > [...] > > net/mac80211/ibss.o: warning: objtool: > > ieee80211_ibss_work.cold()+0x157: unreachable instruction > > drivers/net/ethernet/intel/e1000/e1000_main.o: warning: objtool: > > e1000_clean.cold()+0x0: unreachable instruction > > net/core/skbuff.o: warning: objtool: skb_dump.cold()+0x3fd: > > unreachable instruction > > I'm still working on a solution, but the issue here is that any .cold > function is going to be in a different section than the related > function, and when objtool is searching for instructions in > find_insn(), it assumes that it must be in the same section as the > caller. Can we teach objtool about this? It doesn't seem too unreasonable.
diff --git a/Makefile b/Makefile index c50ef91f6136..41438a921666 100644 --- a/Makefile +++ b/Makefile @@ -846,6 +846,10 @@ ifdef CONFIG_LIVEPATCH KBUILD_CFLAGS += $(call cc-option, -flive-patching=inline-clone) endif +ifdef CONFIG_FG_KASLR +KBUILD_CFLAGS += -ffunction-sections +endif + # arch Makefile may override CC so keep this after arch Makefile is included NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include) diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 5e8949953660..b4b1b17076a8 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -2208,6 +2208,19 @@ config RANDOMIZE_BASE If unsure, say Y. +config FG_KASLR + bool "Finer grained Kernel Address Space Layout Randomization" + depends on $(cc-option, -ffunction-sections) + depends on RANDOMIZE_BASE && X86_64 + help + This option improves the randomness of the kernel text + over basic Kernel Address Space Layout Randomization (KASLR) + by reordering the kernel text at boot time. This feature + uses information generated at compile time to re-layout the + kernel text section at boot time at function level granularity. + + If unsure, say N. + # Relocation on x86 needs some additional build support config X86_NEED_RELOCS def_bool y
Allow user to select CONFIG_FG_KASLR if dependencies are met. Change the make file to build with -ffunction-sections if CONFIG_FG_KASLR Signed-off-by: Kristen Carlson Accardi <kristen@linux.intel.com> --- Makefile | 4 ++++ arch/x86/Kconfig | 13 +++++++++++++ 2 files changed, 17 insertions(+)