lkml.org 
[lkml]   [2017]   [Sep]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.12 46/52] x86/fsgsbase/64: Fully initialize FS and GS state in start_thread_common
    Date
    4.12-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Andy Lutomirski <luto@kernel.org>

    commit 767d035d838f4fd6b5a5bbd7a3f6d293b7f65a49 upstream.

    execve used to leak FSBASE and GSBASE on AMD CPUs. Fix it.

    The security impact of this bug is small but not quite zero -- it
    could weaken ASLR when a privileged task execs a less privileged
    program, but only if program changed bitness across the exec, or the
    child binary was highly unusual or actively malicious. A child
    program that was compromised after the exec would not have access to
    the leaked base.

    Signed-off-by: Andy Lutomirski <luto@kernel.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Borislav Petkov <bpetkov@suse.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Chang Seok <chang.seok.bae@intel.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Josh Poimboeuf <jpoimboe@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/x86/kernel/process_64.c | 9 +++++++++
    1 file changed, 9 insertions(+)

    --- a/arch/x86/kernel/process_64.c
    +++ b/arch/x86/kernel/process_64.c
    @@ -229,10 +229,19 @@ start_thread_common(struct pt_regs *regs
    unsigned long new_sp,
    unsigned int _cs, unsigned int _ss, unsigned int _ds)
    {
    + WARN_ON_ONCE(regs != current_pt_regs());
    +
    + if (static_cpu_has(X86_BUG_NULL_SEG)) {
    + /* Loading zero below won't clear the base. */
    + loadsegment(fs, __USER_DS);
    + load_gs_index(__USER_DS);
    + }
    +
    loadsegment(fs, 0);
    loadsegment(es, _ds);
    loadsegment(ds, _ds);
    load_gs_index(0);
    +
    regs->ip = new_ip;
    regs->sp = new_sp;
    regs->cs = _cs;

    \
     
     \ /
      Last update: 2017-09-18 11:42    [W:4.871 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site