Message ID | 20241223070650.2810747-2-luogengkun@huaweicloud.com (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Paul Moore |
Headers | show |
Series | Fix perf security check problem | expand |
On Mon, Dec 23, 2024 at 1:57 AM Luo Gengkun <luogengkun@huaweicloud.com> wrote: > > It seems that the attr parameter was never been used in security > checks since it was first introduced by: > > commit da97e18458fb ("perf_event: Add support for LSM and SELinux checks") > > so remove it. > > Signed-off-by: Luo Gengkun <luogengkun@huaweicloud.com> > --- > arch/x86/events/intel/bts.c | 2 +- > arch/x86/events/intel/core.c | 2 +- > arch/x86/events/intel/p4.c | 2 +- > drivers/perf/arm_spe_pmu.c | 4 ++-- > include/linux/lsm_hook_defs.h | 2 +- > include/linux/perf_event.h | 10 +++++----- > include/linux/security.h | 5 ++--- > kernel/events/core.c | 14 +++++++------- > kernel/trace/trace_event_perf.c | 4 ++-- > security/security.c | 5 ++--- > security/selinux/hooks.c | 2 +- > 11 files changed, 25 insertions(+), 27 deletions(-) This patch seems fine to me from a LSM and SELinux perspective, but I'd want to see an ACK from the perf folks before I merge this. I'll also leave patch 2/2 for the perf folks as it seems largely unrelated to this patch.
On 2025/1/5 10:45, Paul Moore wrote: > On Mon, Dec 23, 2024 at 1:57 AM Luo Gengkun <luogengkun@huaweicloud.com> wrote: >> It seems that the attr parameter was never been used in security >> checks since it was first introduced by: >> >> commit da97e18458fb ("perf_event: Add support for LSM and SELinux checks") >> >> so remove it. >> >> Signed-off-by: Luo Gengkun <luogengkun@huaweicloud.com> >> --- >> arch/x86/events/intel/bts.c | 2 +- >> arch/x86/events/intel/core.c | 2 +- >> arch/x86/events/intel/p4.c | 2 +- >> drivers/perf/arm_spe_pmu.c | 4 ++-- >> include/linux/lsm_hook_defs.h | 2 +- >> include/linux/perf_event.h | 10 +++++----- >> include/linux/security.h | 5 ++--- >> kernel/events/core.c | 14 +++++++------- >> kernel/trace/trace_event_perf.c | 4 ++-- >> security/security.c | 5 ++--- >> security/selinux/hooks.c | 2 +- >> 11 files changed, 25 insertions(+), 27 deletions(-) > This patch seems fine to me from a LSM and SELinux perspective, but > I'd want to see an ACK from the perf folks before I merge this. > > I'll also leave patch 2/2 for the perf folks as it seems largely > unrelated to this patch. Thanks for your review Gengkun
* Paul Moore <paul@paul-moore.com> wrote: > On Mon, Dec 23, 2024 at 1:57 AM Luo Gengkun <luogengkun@huaweicloud.com> wrote: > > > > It seems that the attr parameter was never been used in security > > checks since it was first introduced by: > > > > commit da97e18458fb ("perf_event: Add support for LSM and SELinux checks") > > > > so remove it. > > > > Signed-off-by: Luo Gengkun <luogengkun@huaweicloud.com> > > --- > > arch/x86/events/intel/bts.c | 2 +- > > arch/x86/events/intel/core.c | 2 +- > > arch/x86/events/intel/p4.c | 2 +- > > drivers/perf/arm_spe_pmu.c | 4 ++-- > > include/linux/lsm_hook_defs.h | 2 +- > > include/linux/perf_event.h | 10 +++++----- > > include/linux/security.h | 5 ++--- > > kernel/events/core.c | 14 +++++++------- > > kernel/trace/trace_event_perf.c | 4 ++-- > > security/security.c | 5 ++--- > > security/selinux/hooks.c | 2 +- > > 11 files changed, 25 insertions(+), 27 deletions(-) > > This patch seems fine to me from a LSM and SELinux perspective, but > I'd want to see an ACK from the perf folks before I merge this. A belated: Reviewed-by: Ingo Molnar <mingo@kernel.org> Patch still seems to apply fine. Thanks, Ingo
On Dec 23, 2024 Luo Gengkun <luogengkun@huaweicloud.com> wrote: > > It seems that the attr parameter was never been used in security > checks since it was first introduced by: > > commit da97e18458fb ("perf_event: Add support for LSM and SELinux checks") > > so remove it. > > Signed-off-by: Luo Gengkun <luogengkun@huaweicloud.com> > Reviewed-by: Ingo Molnar <mingo@kernel.org> > --- > arch/x86/events/intel/bts.c | 2 +- > arch/x86/events/intel/core.c | 2 +- > arch/x86/events/intel/p4.c | 2 +- > drivers/perf/arm_spe_pmu.c | 4 ++-- > include/linux/lsm_hook_defs.h | 2 +- > include/linux/perf_event.h | 10 +++++----- > include/linux/security.h | 5 ++--- > kernel/events/core.c | 14 +++++++------- > kernel/trace/trace_event_perf.c | 4 ++-- > security/security.c | 5 ++--- > security/selinux/hooks.c | 2 +- > 11 files changed, 25 insertions(+), 27 deletions(-) Now that we have Ingo's Reviewed-by, I've gone ahead and merged patch 1/2 into lsm/dev, thanks everyone! -- paul-moore.com
diff --git a/arch/x86/events/intel/bts.c b/arch/x86/events/intel/bts.c index 8f78b0c900ef..485a09d61adf 100644 --- a/arch/x86/events/intel/bts.c +++ b/arch/x86/events/intel/bts.c @@ -559,7 +559,7 @@ static int bts_event_init(struct perf_event *event) * to the user in a zero-copy fashion. */ if (event->attr.exclude_kernel) { - ret = perf_allow_kernel(&event->attr); + ret = perf_allow_kernel(); if (ret) return ret; } diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c index 103ee41907c7..3b65df32daee 100644 --- a/arch/x86/events/intel/core.c +++ b/arch/x86/events/intel/core.c @@ -4150,7 +4150,7 @@ static int intel_pmu_hw_config(struct perf_event *event) if (x86_pmu.version < 3) return -EINVAL; - ret = perf_allow_cpu(&event->attr); + ret = perf_allow_cpu(); if (ret) return ret; diff --git a/arch/x86/events/intel/p4.c b/arch/x86/events/intel/p4.c index 844bc4fc4724..78d78b8a1530 100644 --- a/arch/x86/events/intel/p4.c +++ b/arch/x86/events/intel/p4.c @@ -776,7 +776,7 @@ static int p4_validate_raw_event(struct perf_event *event) * the user needs special permissions to be able to use it */ if (p4_ht_active() && p4_event_bind_map[v].shared) { - v = perf_allow_cpu(&event->attr); + v = perf_allow_cpu(); if (v) return v; } diff --git a/drivers/perf/arm_spe_pmu.c b/drivers/perf/arm_spe_pmu.c index fd5b78732603..a55d10956ff6 100644 --- a/drivers/perf/arm_spe_pmu.c +++ b/drivers/perf/arm_spe_pmu.c @@ -50,7 +50,7 @@ static_assert((PERF_EVENT_FLAG_ARCH & SPE_PMU_HW_FLAGS_CX) == SPE_PMU_HW_FLAGS_C static void set_spe_event_has_cx(struct perf_event *event) { - if (IS_ENABLED(CONFIG_PID_IN_CONTEXTIDR) && !perf_allow_kernel(&event->attr)) + if (IS_ENABLED(CONFIG_PID_IN_CONTEXTIDR) && !perf_allow_kernel()) event->hw.flags |= SPE_PMU_HW_FLAGS_CX; } @@ -746,7 +746,7 @@ static int arm_spe_pmu_event_init(struct perf_event *event) set_spe_event_has_cx(event); reg = arm_spe_event_to_pmscr(event); if (reg & (PMSCR_EL1_PA | PMSCR_EL1_PCT)) - return perf_allow_kernel(&event->attr); + return perf_allow_kernel(); return 0; } diff --git a/include/linux/lsm_hook_defs.h b/include/linux/lsm_hook_defs.h index e2f1ce37c41e..e349e585cc07 100644 --- a/include/linux/lsm_hook_defs.h +++ b/include/linux/lsm_hook_defs.h @@ -445,7 +445,7 @@ LSM_HOOK(int, 0, bpf_token_capable, const struct bpf_token *token, int cap) LSM_HOOK(int, 0, locked_down, enum lockdown_reason what) #ifdef CONFIG_PERF_EVENTS -LSM_HOOK(int, 0, perf_event_open, struct perf_event_attr *attr, int type) +LSM_HOOK(int, 0, perf_event_open, int type) LSM_HOOK(int, 0, perf_event_alloc, struct perf_event *event) LSM_HOOK(int, 0, perf_event_read, struct perf_event *event) LSM_HOOK(int, 0, perf_event_write, struct perf_event *event) diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 8333f132f4a9..5d2ec4283ebf 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -1672,22 +1672,22 @@ static inline int perf_is_paranoid(void) return sysctl_perf_event_paranoid > -1; } -int perf_allow_kernel(struct perf_event_attr *attr); +int perf_allow_kernel(void); -static inline int perf_allow_cpu(struct perf_event_attr *attr) +static inline int perf_allow_cpu(void) { if (sysctl_perf_event_paranoid > 0 && !perfmon_capable()) return -EACCES; - return security_perf_event_open(attr, PERF_SECURITY_CPU); + return security_perf_event_open(PERF_SECURITY_CPU); } -static inline int perf_allow_tracepoint(struct perf_event_attr *attr) +static inline int perf_allow_tracepoint(void) { if (sysctl_perf_event_paranoid > -1 && !perfmon_capable()) return -EPERM; - return security_perf_event_open(attr, PERF_SECURITY_TRACEPOINT); + return security_perf_event_open(PERF_SECURITY_TRACEPOINT); } extern int perf_exclude_event(struct perf_event *event, struct pt_regs *regs); diff --git a/include/linux/security.h b/include/linux/security.h index 980b6c207cad..a3b35a699256 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -2324,14 +2324,13 @@ struct perf_event_attr; struct perf_event; #ifdef CONFIG_SECURITY -extern int security_perf_event_open(struct perf_event_attr *attr, int type); +extern int security_perf_event_open(int type); extern int security_perf_event_alloc(struct perf_event *event); extern void security_perf_event_free(struct perf_event *event); extern int security_perf_event_read(struct perf_event *event); extern int security_perf_event_write(struct perf_event *event); #else -static inline int security_perf_event_open(struct perf_event_attr *attr, - int type) +static inline int security_perf_event_open(int type) { return 0; } diff --git a/kernel/events/core.c b/kernel/events/core.c index b2bc67791f84..f2cb450eb134 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -4883,7 +4883,7 @@ find_get_context(struct task_struct *task, struct perf_event *event) if (!task) { /* Must be root to operate on a CPU event: */ - err = perf_allow_cpu(&event->attr); + err = perf_allow_cpu(); if (err) return ERR_PTR(err); @@ -12488,7 +12488,7 @@ static int perf_copy_attr(struct perf_event_attr __user *uattr, } /* privileged levels capture (kernel, hv): check permissions */ if (mask & PERF_SAMPLE_BRANCH_PERM_PLM) { - ret = perf_allow_kernel(attr); + ret = perf_allow_kernel(); if (ret) return ret; } @@ -12745,12 +12745,12 @@ SYSCALL_DEFINE5(perf_event_open, return err; /* Do we allow access to perf_event_open(2) ? */ - err = security_perf_event_open(&attr, PERF_SECURITY_OPEN); + err = security_perf_event_open(PERF_SECURITY_OPEN); if (err) return err; if (!attr.exclude_kernel) { - err = perf_allow_kernel(&attr); + err = perf_allow_kernel(); if (err) return err; } @@ -12770,7 +12770,7 @@ SYSCALL_DEFINE5(perf_event_open, /* Only privileged users can get physical addresses */ if ((attr.sample_type & PERF_SAMPLE_PHYS_ADDR)) { - err = perf_allow_kernel(&attr); + err = perf_allow_kernel(); if (err) return err; } @@ -13603,12 +13603,12 @@ const struct perf_event_attr *perf_event_attrs(struct perf_event *event) return &event->attr; } -int perf_allow_kernel(struct perf_event_attr *attr) +int perf_allow_kernel(void) { if (sysctl_perf_event_paranoid > 1 && !perfmon_capable()) return -EACCES; - return security_perf_event_open(attr, PERF_SECURITY_KERNEL); + return security_perf_event_open(PERF_SECURITY_KERNEL); } EXPORT_SYMBOL_GPL(perf_allow_kernel); diff --git a/kernel/trace/trace_event_perf.c b/kernel/trace/trace_event_perf.c index 3ff9caa4a71b..a6bb7577e8c5 100644 --- a/kernel/trace/trace_event_perf.c +++ b/kernel/trace/trace_event_perf.c @@ -49,7 +49,7 @@ static int perf_trace_event_perm(struct trace_event_call *tp_event, /* The ftrace function trace is allowed only for root. */ if (ftrace_event_is_function(tp_event)) { - ret = perf_allow_tracepoint(&p_event->attr); + ret = perf_allow_tracepoint(); if (ret) return ret; @@ -86,7 +86,7 @@ static int perf_trace_event_perm(struct trace_event_call *tp_event, * ...otherwise raw tracepoint data can be a severe data leak, * only allow root to have these. */ - ret = perf_allow_tracepoint(&p_event->attr); + ret = perf_allow_tracepoint(); if (ret) return ret; diff --git a/security/security.c b/security/security.c index 1db835c05a78..ad9655aa1322 100644 --- a/security/security.c +++ b/security/security.c @@ -5885,16 +5885,15 @@ EXPORT_SYMBOL(security_bdev_setintegrity); #ifdef CONFIG_PERF_EVENTS /** * security_perf_event_open() - Check if a perf event open is allowed - * @attr: perf event attribute * @type: type of event * * Check whether the @type of perf_event_open syscall is allowed. * * Return: Returns 0 if permission is granted. */ -int security_perf_event_open(struct perf_event_attr *attr, int type) +int security_perf_event_open(int type) { - return call_int_hook(perf_event_open, attr, type); + return call_int_hook(perf_event_open, type); } /** diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index a503b8fd6611..14c7d331c3b6 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -7040,7 +7040,7 @@ struct lsm_blob_sizes selinux_blob_sizes __ro_after_init = { }; #ifdef CONFIG_PERF_EVENTS -static int selinux_perf_event_open(struct perf_event_attr *attr, int type) +static int selinux_perf_event_open(int type) { u32 requested, sid = current_sid();
It seems that the attr parameter was never been used in security checks since it was first introduced by: commit da97e18458fb ("perf_event: Add support for LSM and SELinux checks") so remove it. Signed-off-by: Luo Gengkun <luogengkun@huaweicloud.com> --- arch/x86/events/intel/bts.c | 2 +- arch/x86/events/intel/core.c | 2 +- arch/x86/events/intel/p4.c | 2 +- drivers/perf/arm_spe_pmu.c | 4 ++-- include/linux/lsm_hook_defs.h | 2 +- include/linux/perf_event.h | 10 +++++----- include/linux/security.h | 5 ++--- kernel/events/core.c | 14 +++++++------- kernel/trace/trace_event_perf.c | 4 ++-- security/security.c | 5 ++--- security/selinux/hooks.c | 2 +- 11 files changed, 25 insertions(+), 27 deletions(-)