lkml.org 
[lkml]   [2022]   [Dec]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 32/39] x86: Expose thread features in /proc/$PID/status
    Date
    Applications and loaders can have logic to decide whether to enable
    shadow stack. They usually don't report whether shadow stack has been
    enabled or not, so there is no way to verify whether an application
    actually is protected by shadow stack.

    Add two lines in /proc/$PID/status to report enabled and locked features.

    Since, this involves referring to arch specific defines in asm/prctl.h,
    implement an arch breakout to emit the feature lines.

    Tested-by: Pengfei Xu <pengfei.xu@intel.com>
    Tested-by: John Allen <john.allen@amd.com>
    Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    [Switched to CET, added to commit log]
    Signed-off-by: Rick Edgecombe <rick.p.edgecombe@intel.com>
    ---

    v4:
    - Remove "CET" references

    v3:
    - Move to /proc/pid/status (Kees)

    v2:
    - New patch

    arch/x86/kernel/cpu/proc.c | 23 +++++++++++++++++++++++
    fs/proc/array.c | 6 ++++++
    include/linux/proc_fs.h | 2 ++
    3 files changed, 31 insertions(+)

    diff --git a/arch/x86/kernel/cpu/proc.c b/arch/x86/kernel/cpu/proc.c
    index 099b6f0d96bd..31c0e68f6227 100644
    --- a/arch/x86/kernel/cpu/proc.c
    +++ b/arch/x86/kernel/cpu/proc.c
    @@ -4,6 +4,8 @@
    #include <linux/string.h>
    #include <linux/seq_file.h>
    #include <linux/cpufreq.h>
    +#include <asm/prctl.h>
    +#include <linux/proc_fs.h>

    #include "cpu.h"

    @@ -175,3 +177,24 @@ const struct seq_operations cpuinfo_op = {
    .stop = c_stop,
    .show = show_cpuinfo,
    };
    +
    +#ifdef CONFIG_X86_USER_SHADOW_STACK
    +static void dump_x86_features(struct seq_file *m, unsigned long features)
    +{
    + if (features & ARCH_SHSTK_SHSTK)
    + seq_puts(m, "shstk ");
    + if (features & ARCH_SHSTK_WRSS)
    + seq_puts(m, "wrss ");
    +}
    +
    +void arch_proc_pid_thread_features(struct seq_file *m, struct task_struct *task)
    +{
    + seq_puts(m, "x86_Thread_features:\t");
    + dump_x86_features(m, task->thread.features);
    + seq_putc(m, '\n');
    +
    + seq_puts(m, "x86_Thread_features_locked:\t");
    + dump_x86_features(m, task->thread.features_locked);
    + seq_putc(m, '\n');
    +}
    +#endif /* CONFIG_X86_USER_SHADOW_STACK */
    diff --git a/fs/proc/array.c b/fs/proc/array.c
    index d2a94eafe9a3..96ee17d68b4c 100644
    --- a/fs/proc/array.c
    +++ b/fs/proc/array.c
    @@ -433,6 +433,11 @@ static inline void task_untag_mask(struct seq_file *m, struct mm_struct *mm)
    seq_printf(m, "untag_mask:\t%#lx\n", mm_untag_mask(mm));
    }

    +__weak void arch_proc_pid_thread_features(struct seq_file *m,
    + struct task_struct *task)
    +{
    +}
    +
    int proc_pid_status(struct seq_file *m, struct pid_namespace *ns,
    struct pid *pid, struct task_struct *task)
    {
    @@ -457,6 +462,7 @@ int proc_pid_status(struct seq_file *m, struct pid_namespace *ns,
    task_cpus_allowed(m, task);
    cpuset_task_status_allowed(m, task);
    task_context_switch_counts(m, task);
    + arch_proc_pid_thread_features(m, task);
    return 0;
    }

    diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h
    index 81d6e4ec2294..5a8b21c0a587 100644
    --- a/include/linux/proc_fs.h
    +++ b/include/linux/proc_fs.h
    @@ -158,6 +158,8 @@ int proc_pid_arch_status(struct seq_file *m, struct pid_namespace *ns,
    struct pid *pid, struct task_struct *task);
    #endif /* CONFIG_PROC_PID_ARCH_STATUS */

    +void arch_proc_pid_thread_features(struct seq_file *m, struct task_struct *task);
    +
    #else /* CONFIG_PROC_FS */

    static inline void proc_root_init(void)
    --
    2.17.1
    \
     
     \ /
      Last update: 2022-12-03 01:44    [W:4.075 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site