• Andy Lutomirski's avatar
    x86/ptrace: Clean up PTRACE_GETREGS/PTRACE_PUTREGS regset selection · f22fecaf
    Andy Lutomirski authored
    task_user_regset_view() has nonsensical semantics, but those semantics
    appear to be relied on by existing users of PTRACE_GETREGSET and
    PTRACE_SETREGSET.  (See added comments below for details.)
    
    It shouldn't be used for PTRACE_GETREGS or PTRACE_SETREGS, though. A
    native 64-bit ptrace() call and an x32 ptrace() call using GETREGS
    or SETREGS wants the 64-bit regset views, and a 32-bit ptrace() call
    (native or compat) should use the 32-bit regset.
    
    task_user_regset_view() almost does this except that it will
    malfunction if a ptracer is itself ptraced and the outer ptracer
    modifies CS on entry to a ptrace() syscall.  Hopefully that has never
    happened.  (The compat ptrace() code already hardcoded the 32-bit
    regset, so this change has no effect on that path.)
    
    Improve the situation and deobfuscate the code by hardcoding the
    64-bit view in the x32 ptrace() and selecting the view based on the
    kernel config in the native ptrace().
    
    I tried to figure out the history behind this API. I naïvely assumed
    that PTRAGE_GETREGSET and PTRACE_SETREGSET were ancient APIs that
    predated compat, but no. They were introduced by
    
      2225a122 ("ptrace: Add support for generic PTRACE_GETREGSET/PTRACE_SETREGSET")
    
    in 2010, and they are simply a poor design.  ELF core dumps have the
    ELF e_machine field and a bunch of register sets in ELF notes, and the
    pair (e_machine, NT_XXX) indicates the format of the regset blob.  But
    the new PTRACE_GET/SETREGSET API coopted the NT_XXX numbering without
    any way to specify which e_machine was in effect.  This is especially
    bad on x86, where a process can freely switch between 32-bit and
    64-bit mode, and, in fact, the PTRAGE_SETREGSET call itself can cause
    this switch to happen.  Oops.
    Signed-off-by: default avatarAndy Lutomirski <luto@kernel.org>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Link: https://lkml.kernel.org/r/9daa791d0c7eaebd59c5bc2b2af1b0e7bebe707d.1612375698.git.luto@kernel.org
    f22fecaf
ptrace.c 34.4 KB