[PATCH v2 00/29] implement KASLR for ARM
From: tony@atomide.com (Tony Lindgren)
Date: 2017-09-05 21:27:42
* Ard Biesheuvel [off-list ref] [170905 12:43]:
Right. Well, I will try to reproduce with the BB white I have.
Yeah that should be reproducable, I got it to happen on BBB here after about 5 boots.
Are you booting with an initrd?
Not on this one, on beagleboard xm I do.
quoted
quoted
quoted
Then loading modules with CONFIG_RANDOMIZE_BASE=y seems to fail with: $ sudo modprobe rtc-twl rtc_twl: disagrees about version of symbol module_layout modprobe: ERROR: could not insert 'rtc_twl': Exec format errorIs this with CONFIG_MODVERSIONS enabled?Yes, but disabling that did not seem to make any difference based on just one test.Yeah, well, it appears I missed a couple of details :-) This should fix the module loading issues:
Yeah now modprobe works :) That's after manually applying it as the tabs got munched in your patch somewhere, see below. Regards, Tony
quoted hunk ↗ jump to hunk
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 1a0304dd388d..bbefd5f32ec2 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig@@ -1830,6 +1830,8 @@ config RANDOMIZE_BASE depends on MMU && AUTO_ZRELADDR depends on !XIP_KERNEL && !ZBOOT_ROM select RELOCATABLE + select ARM_MODULE_PLTS if MODULES + select MODULE_REL_CRCS if MODVERSIONS help Randomizes the virtual and physical address at which the kernel image is loaded, as a security feature that deters exploit attemptsdiff --git a/arch/arm/include/asm/elf.h b/arch/arm/include/asm/elf.h index f13ae153fb24..b56fc4dd27b6 100644 --- a/arch/arm/include/asm/elf.h +++ b/arch/arm/include/asm/elf.h@@ -50,6 +50,7 @@ typedef struct user_fp elf_fpregset_t; #define R_ARM_NONE 0 #define R_ARM_PC24 1 #define R_ARM_ABS32 2 +#define R_ARM_REL32 3 #define R_ARM_CALL 28 #define R_ARM_JUMP24 29 #define R_ARM_TARGET1 38diff --git a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c index 3ff571c2c71c..aa4d72837cd5 100644 --- a/arch/arm/kernel/module.c +++ b/arch/arm/kernel/module.c@@ -175,6 +175,10 @@ *(u32 *)loc |= offset & 0x7fffffff; break; + case R_ARM_REL32: + *(u32 *)loc += sym->st_value - loc; + break; + case R_ARM_MOVW_ABS_NC: case R_ARM_MOVT_ABS: offset = tmp = __mem_to_opcode_arm(*(u32 *)loc);