]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
ELF: fix kernel.randomize_va_space double read
authorAlexey Dobriyan <adobriyan@gmail.com>
Fri, 21 Jun 2024 18:54:50 +0000 (21:54 +0300)
committerKees Cook <kees@kernel.org>
Fri, 21 Jun 2024 19:40:01 +0000 (12:40 -0700)
ELF loader uses "randomize_va_space" twice. It is sysctl and can change
at any moment, so 2 loads could see 2 different values in theory with
unpredictable consequences.

Issue exactly one load for consistent value across one exec.

Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Link: https://lore.kernel.org/r/3329905c-7eb8-400a-8f0a-d87cff979b5b@p183
Signed-off-by: Kees Cook <kees@kernel.org>
fs/binfmt_elf.c

index 7860d6504499916193cd470d465af5ef13aba4e0..40111451aa95118018e88efc97522b44696d673b 100644 (file)
@@ -1003,7 +1003,8 @@ out_free_interp:
        if (elf_read_implies_exec(*elf_ex, executable_stack))
                current->personality |= READ_IMPLIES_EXEC;
 
-       if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
+       const int snapshot_randomize_va_space = READ_ONCE(randomize_va_space);
+       if (!(current->personality & ADDR_NO_RANDOMIZE) && snapshot_randomize_va_space)
                current->flags |= PF_RANDOMIZE;
 
        setup_new_exec(bprm);
@@ -1285,7 +1286,7 @@ out_free_interp:
        mm->end_data = end_data;
        mm->start_stack = bprm->p;
 
-       if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) {
+       if ((current->flags & PF_RANDOMIZE) && (snapshot_randomize_va_space > 1)) {
                /*
                 * For architectures with ELF randomization, when executing
                 * a loader directly (i.e. no interpreter listed in ELF