perf: fix hypervisor branch sampling permission check
PATCH 1/1 perf: fix hypervisor branch sampling permission check
Commit 2b923c8 perf/x86: Check branch sampling priv level in generic code was missing the check for the hypervisor (HV) priv level, so add it back.
With this patch, we get the following correct behavior:
# echo 2 >/proc/sys/kernel/perf_event_paranoid
$ perf record -j any,k noploop 1
Error:
You may not have permission to collect stats.
Consider tweaking /proc/sys/kernel/perf_event_paranoid:
-1 - Not paranoid at all
0 - Disallow raw tracepoint access for unpriv
1 - Disallow cpu events for unpriv
2 - Disallow kernel profiling for unpriv $ perf record -j any,hv noploop 1
Error:
You may not have permission to collect stats.
Consider tweaking /proc/sys/kernel/perf_event_paranoid:
-1 - Not paranoid at all
0 - Disallow raw tracepoint access for unpriv
1 - Disallow cpu events for unpriv
2 - Disallow kernel profiling for unpriv---
kernel/events/core.c +2 -2
@@ -6501,8 +6501,8 @@ static int perf_copy_attr(struct perf_event_attr __user *uattr,*/ attr->branch_sample_type = mask; } -/* kernel level capture: check permissions */ -if ((mask &PERF_SAMPLE_BRANCH_KERNEL ) +/* privileged levels capture (kernel, hv): check permissions */ +if ((mask &PERF_SAMPLE_BRANCH_PERM_PLM ) &&perf_paranoid_kernel () && !capable (CAP_SYS_ADMIN ))return -EACCES ; }
Quoted 33 lines · Stephane Eranian
Commit 2b923c8 perf/x86: Check branch sampling priv level in generic code was missing the check for the hypervisor (HV) priv level, so add it back.
With this patch, we get the following correct behavior:
# echo 2 >/proc/sys/kernel/perf_event_paranoid$ perf record -j any,k noploop 1 Error: You may not have permission to collect stats. Consider tweaking /proc/sys/kernel/perf_event_paranoid: -1 - Not paranoid at all 0 - Disallow raw tracepoint access for unpriv 1 - Disallow cpu events for unpriv 2 - Disallow kernel profiling for unpriv$ perf record -j any,hv noploop 1 Error: You may not have permission to collect stats. Consider tweaking /proc/sys/kernel/perf_event_paranoid: -1 - Not paranoid at all 0 - Disallow raw tracepoint access for unpriv 1 - Disallow cpu events for unpriv 2 - Disallow kernel profiling for unprivSigned-off-by Stephane Eranian <[email protected]>---
kernel/events/core.c +0
-0
kernel/events/core.c static int perf_copy_attr(struct perf_event_attr __user *uattr, · line 6508
Quoted 10 lines
kernel/events/core.c +2
-2@@ -6501,8 +6501,8 @@ static int perf_copy_attr(struct perf_event_attr __user *uattr,*/ attr->branch_sample_type = mask; } -/* kernel level capture: check permissions */ -if ((mask &PERF_SAMPLE_BRANCH_KERNEL ) +/* privileged levels capture (kernel, hv): check permissions */ +if ((mask &PERF_SAMPLE_BRANCH_PERM_PLM ) &&perf_paranoid_kernel () && !capable (CAP_SYS_ADMIN ))return -EACCES ; }
Signature · 1 line
Petr Matousek / Red Hat Security Response Team
tip-bot for Stephane Eranian
merge bot[tip:perf/core] perf: Fix hypervisor branch sampling permission check
In reply to Stephane Eranianperf: Fix hypervisor branch sampling permission check
Commit-ID: e712209a9e0b70e78b13847738eb66fe37412515 Gitweb: http://git.kernel.org/tip/e712209a9e0b70e78b13847738eb66fe37412515 Author: Stephane Eranian <[email protected]> AuthorDate: Thu, 6 Jun 2013 11:02:04 +0200 Committer: Ingo Molnar <[email protected]> CommitDate: Wed, 19 Jun 2013 12:50:21 +0200
perf: Fix hypervisor branch sampling permission check
Commit 2b923c8 perf/x86: Check branch sampling priv level in generic code was missing the check for the hypervisor (HV) priv level, so add it back.
With this patch, we get the following correct behavior:
# echo 2 >/proc/sys/kernel/perf_event_paranoid
$ perf record -j any,k noploop 1
Error:
You may not have permission to collect stats.
Consider tweaking /proc/sys/kernel/perf_event_paranoid:
-1 - Not paranoid at all
0 - Disallow raw tracepoint access for unpriv
1 - Disallow cpu events for unpriv
2 - Disallow kernel profiling for unpriv $ perf record -j any,hv noploop 1
Error:
You may not have permission to collect stats.
Consider tweaking /proc/sys/kernel/perf_event_paranoid:
-1 - Not paranoid at all
0 - Disallow raw tracepoint access for unpriv
1 - Disallow cpu events for unpriv
2 - Disallow kernel profiling for unpriv--- kernel/events/core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/events/core.c +2 -2
@@ -6573,8 +6573,8 @@ static int perf_copy_attr(struct perf_event_attr __user *uattr,*/ attr->branch_sample_type = mask; } -/* kernel level capture: check permissions */ -if ((mask &PERF_SAMPLE_BRANCH_KERNEL ) +/* privileged levels capture (kernel, hv): check permissions */ +if ((mask &PERF_SAMPLE_BRANCH_PERM_PLM ) &&perf_paranoid_kernel () && !capable (CAP_SYS_ADMIN ))return -EACCES ; }