Patch "perf/core: Drop kernel samples even though :u is specified" has been added to the 4.11-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
perf/core: Drop kernel samples even though :u is specified
to the 4.11-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
perf-core-drop-kernel-samples-even-though-u-is-specified.patch
and it can be found in the queue-4.11 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
cc1582c231ea041fbc68861dfaf957eaf902b829Mon Sep 17 00:00:00 2001
From: Jin Yao <[email protected]>
Date: Thu, 25 May 2017 18:09:07 +0800
Subject: perf/core: Drop kernel samples even though :u is specified
From: Jin Yao <[email protected]>
commit cc1582c231ea041fbc68861dfaf957eaf902b829 upstream.
When doing sampling, for example:
perf record -e cycles:u ...
On workloads that do a lot of kernel entry/exits we see kernel samples, even though :u is specified. This is due to skid existing.
This might be a security issue because it can leak kernel addresses even though kernel sampling support is disabled.
The patch drops the kernel samples if exclude_kernel is specified.
For example, test on Haswell desktop:
perf record -e cycles:u <mgen> perf report --stdio
Before patch applied:
99.77% mgen mgen [.] buf_read
0.20% mgen mgen [.] rand_buf_init
0.01% mgen [kernel.vmlinux] [k] apic_timer_interrupt
0.00% mgen mgen [.] last_free_elem
0.00% mgen libc-2.23.so [.] __random_r
0.00% mgen libc-2.23.so [.] _int_malloc
0.00% mgen mgen [.] rand_array_init
0.00% mgen [kernel.vmlinux] [k] page_fault
0.00% mgen libc-2.23.so [.] __random
0.00% mgen libc-2.23.so [.] __strcasestr
0.00% mgen ld-2.23.so [.] strcmp
0.00% mgen ld-2.23.so [.] _dl_start
0.00% mgen libc-2.23.so [.] sched_setaffinity@@GLIBC_2.3.4
0.00% mgen ld-2.23.so [.] _startWe can see kernel symbols apic_timer_interrupt and page_fault.
After patch applied:
99.79% mgen mgen [.] buf_read
0.19% mgen mgen [.] rand_buf_init
0.00% mgen libc-2.23.so [.] __random_r
0.00% mgen mgen [.] rand_array_init
0.00% mgen mgen [.] last_free_elem
0.00% mgen libc-2.23.so [.] vfprintf
0.00% mgen libc-2.23.so [.] rand
0.00% mgen libc-2.23.so [.] __random
0.00% mgen libc-2.23.so [.] _int_malloc
0.00% mgen libc-2.23.so [.] _IO_doallocbuf
0.00% mgen ld-2.23.so [.] do_lookup_x
0.00% mgen ld-2.23.so [.] open_verify.constprop.7
0.00% mgen ld-2.23.so [.] _dl_important_hwcaps
0.00% mgen libc-2.23.so [.] sched_setaffinity@@GLIBC_2.3.4
0.00% mgen ld-2.23.so [.] _startThere are only userspace symbols.
--- kernel/events/core.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
kernel/events/core.c +21 -0
@@ -7184,6 +7184,21 @@ int perf_event_account_interrupt(structreturn __perf_event_account_interrupt (event,1 ); } +static bool sample_is_allowed (struct perf_event *event,struct pt_regs *regs) +{ +/* +* Due to interrupt latency (AKA "skid"), we may enter the +* kernel before taking an overflow, even if the PMU is only +* counting user events. +* To avoid leaking information to userspace, we must always +* reject kernel samples when exclude_kernel is set. +*/ +if (event->attr.exclude_kernel && !user_mode (regs)) +return false; + +return true; +} +/* * Generic event overflow handling, sampling. */
@@ -7205,6 +7220,12 @@ static int __perf_event_overflow(struct ret =__perf_event_account_interrupt (event, throttle);/* +* For security, drop the skid kernel samples if necessary. +*/ +if (!sample_is_allowed (event, regs)) +return ret; + +/* * XXX event_limit might not quite work as expected on inherited * events */
Patches currently in stable-queue which might be from [email protected] are
queue-4.11/perf-core-drop-kernel-samples-even-though-u-is-specified.patch