• Rick Edgecombe's avatar
    x86: Add PTRACE interface for shadow stack · 2fab02b2
    Rick Edgecombe authored
    Some applications (like GDB) would like to tweak shadow stack state via
    ptrace. This allows for existing functionality to continue to work for
    seized shadow stack applications. Provide a regset interface for
    manipulating the shadow stack pointer (SSP).
    
    There is already ptrace functionality for accessing xstate, but this
    does not include supervisor xfeatures. So there is not a completely
    clear place for where to put the shadow stack state. Adding it to the
    user xfeatures regset would complicate that code, as it currently shares
    logic with signals which should not have supervisor features.
    
    Don't add a general supervisor xfeature regset like the user one,
    because it is better to maintain flexibility for other supervisor
    xfeatures to define their own interface. For example, an xfeature may
    decide not to expose all of it's state to userspace, as is actually the
    case for  shadow stack ptrace functionality. A lot of enum values remain
    to be used, so just put it in dedicated shadow stack regset.
    
    The only downside to not having a generic supervisor xfeature regset,
    is that apps need to be enlightened of any new supervisor xfeature
    exposed this way (i.e. they can't try to have generic save/restore
    logic). But maybe that is a good thing, because they have to think
    through each new xfeature instead of encountering issues when a new
    supervisor xfeature was added.
    
    By adding a shadow stack regset, it also has the effect of including the
    shadow stack state in a core dump, which could be useful for debugging.
    
    The shadow stack specific xstate includes the SSP, and the shadow stack
    and WRSS enablement status. Enabling shadow stack or WRSS in the kernel
    involves more than just flipping the bit. The kernel is made aware that
    it has to do extra things when cloning or handling signals. That logic
    is triggered off of separate feature enablement state kept in the task
    struct. So the flipping on HW shadow stack enforcement without notifying
    the kernel to change its behavior would severely limit what an application
    could do without crashing, and the results would depend on kernel
    internal implementation details. There is also no known use for controlling
    this state via ptrace today. So only expose the SSP, which is something
    that userspace already has indirect control over.
    Co-developed-by: default avatarYu-cheng Yu <yu-cheng.yu@intel.com>
    Signed-off-by: default avatarYu-cheng Yu <yu-cheng.yu@intel.com>
    Signed-off-by: default avatarRick Edgecombe <rick.p.edgecombe@intel.com>
    Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
    Reviewed-by: default avatarBorislav Petkov (AMD) <bp@alien8.de>
    Reviewed-by: default avatarKees Cook <keescook@chromium.org>
    Acked-by: default avatarMike Rapoport (IBM) <rppt@kernel.org>
    Tested-by: default avatarPengfei Xu <pengfei.xu@intel.com>
    Tested-by: default avatarJohn Allen <john.allen@amd.com>
    Tested-by: default avatarKees Cook <keescook@chromium.org>
    Link: https://lore.kernel.org/all/20230613001108.3040476-41-rick.p.edgecombe%40intel.com
    2fab02b2
regset.c 11.7 KB