security, perf: Add config option to restrict perf_event_open
Subsystems (3)
PATCH 2/2 security, perf: Add config option to restrict perf_event_open
When CONFIG_SECURITY_PERF_EVENTS_RESTRICT=y kernel.perf_event_paranoid sysctl will be set to 3 by default, and no unprivileged use of the perf_event_open syscall will be permitted unless it is changed.
This new level of restriction is intended to reduce the attack surface of the kernel. It allows for a safe default to be set on production systems at build time while leaving a simple means for developers to grant access.
--- Documentation/sysctl/kernel.txt | 3 ++- kernel/events/core.c | 4 ++++ security/Kconfig | 9 +++++++++ 3 files changed, 15 insertions(+), 1 deletion(-)
Documentation/sysctl/kernel.txt +2 -1
@@ -659,7 +659,8 @@ allowed to execute. perf_event_paranoid: Controls use of the performance events system by unprivileged -users (without CAP_SYS_ADMIN). The default value is 2. +users (without CAP_SYS_ADMIN). The default value is 3 if +CONFIG_SECURITY_PERF_EVENTS_RESTRICT is set, or 2 otherwise. -1: Allow use of (almost) all events by all users >=0: Disallow raw tracepoint access by users without CAP_IOC_LOCK
kernel/events/core.c +4 -0
@@ -355,7 +355,11 @@ static struct srcu_struct pmus_srcu;* 2 - disallow kernel profiling for unpriv * 3 - disallow all unpriv perf event use */ +#ifdef CONFIG_SECURITY_PERF_EVENTS_RESTRICT +int sysctl_perf_event_paranoid__read_mostly =3 ; +#else int sysctl_perf_event_paranoid__read_mostly =2 ; +#endif /* Minimum for 512 kiB + 1 user control page */ int sysctl_perf_event_mlock__read_mostly =512 + (PAGE_SIZE /1024 );/* 'free' kiB per user */
security/Kconfig +9 -0
@@ -18,6 +18,15 @@ config SECURITY_DMESG_RESTRICT If you are unsure how to answer this question, answer N. +config SECURITY_PERF_EVENTS_RESTRICT + bool "Restrict unprivileged use of performance events" + depends on PERF_EVENTS + help + If you say Y here, the kernel.perf_event_paranoid sysctl + will be set to 3 by default, and no unprivileged use of the + perf_event_open syscall will be permitted unless it is + changed. + config SECURITY bool "Enable different security models" depends on SYSFS
Signature · 1 line
2.8.0.rc3.226.g39d4020
Quoted 10 lines · Jeff Vander Stoep
When
CONFIG_SECURITY_PERF_EVENTS_RESTRICT=ykernel.perf_event_paranoid sysctl will be set to 3 by default, and no unprivileged use of theperf_event_opensyscall will be permitted unless it is changed.This new level of restriction is intended to reduce the attack surface of the kernel. It allows for a safe default to be set on production systems at build time while leaving a simple means for developers to grant access.
Signed-off-by Jeff Vander Stoep <[email protected]>
-Kees
Quoted 59 lines
--- Documentation/sysctl/kernel.txt | 3 ++- kernel/events/core.c | 4 ++++ security/Kconfig | 9 +++++++++ 3 files changed, 15 insertions(+), 1 deletion(-)Documentation/sysctl/kernel.txt +2
-1@@ -659,7 +659,8 @@ allowed to execute. perf_event_paranoid: Controls use of the performance events system by unprivileged -users (without CAP_SYS_ADMIN). The default value is 2. +users (without CAP_SYS_ADMIN). The default value is 3 if +CONFIG_SECURITY_PERF_EVENTS_RESTRICT is set, or 2 otherwise. -1: Allow use of (almost) all events by all users >=0: Disallow raw tracepoint access by users without CAP_IOC_LOCKkernel/events/core.c +4
-0@@ -355,7 +355,11 @@ static struct srcu_struct pmus_srcu;* 2 - disallow kernel profiling for unpriv * 3 - disallow all unpriv perf event use */ +#ifdef CONFIG_SECURITY_PERF_EVENTS_RESTRICT +int sysctl_perf_event_paranoid__read_mostly =3 ; +#else int sysctl_perf_event_paranoid__read_mostly =2 ; +#endif /* Minimum for 512 kiB + 1 user control page */ int sysctl_perf_event_mlock__read_mostly =512 + (PAGE_SIZE /1024 );/* 'free' kiB per user */ security/Kconfig +9
-1@@ -18,6 +18,15 @@ config SECURITY_DMESG_RESTRICT If you are unsure how to answer this question, answer N. +config SECURITY_PERF_EVENTS_RESTRICT + bool "Restrict unprivileged use of performance events" + depends on PERF_EVENTS + help + If you say Y here, the kernel.perf_event_paranoid sysctl + will be set to 3 by default, and no unprivileged use of the + perf_event_open syscall will be permitted unless it is + changed. + config SECURITY bool "Enable different security models" depends on SYSFS --2.8.0.rc3.226.g39d4020
Signature · 2 lines
Kees Cook Chrome OS & Brillo Security
Quoted 19 lines · Jeff Vander Stoep
+++
b/kernel/events/core.ckernel/events/core.c +4
-0@@ -355,7 +355,11 @@ static struct srcu_struct pmus_srcu;* 2 - disallow kernel profiling for unpriv * 3 - disallow all unpriv perf event use */ +#ifdef CONFIG_SECURITY_PERF_EVENTS_RESTRICT +int sysctl_perf_event_paranoid__read_mostly =3 ; +#else int sysctl_perf_event_paranoid__read_mostly =2 ; +#endif /* Minimum for 512 kiB + 1 user control page */ int sysctl_perf_event_mlock__read_mostly =512 + (PAGE_SIZE /1024 );/* 'free' kiB per user */ security/Kconfig +0
-0@@ -18,6 +18,15 @@ config SECURITY_DMESG_RESTRICT
security/Kconfig config SECURITY_DMESG_RESTRICT · line 28
Quoted 10 lines
security/Kconfig +8
-0If you are unsure how to answer this question, answer N. +config SECURITY_PERF_EVENTS_RESTRICT + bool "Restrict unprivileged use of performance events" + depends on PERF_EVENTS + help + If you say Y here, the kernel.perf_event_paranoid sysctl + will be set to 3 by default, and no unprivileged use of the + perf_event_open syscall will be permitted unless it is + changed.
NAK.
Apart from the fact that I hate the 3 thing this is not how you do default CONFIG knobs for !bool state variables.
Use an "int" config not a "bool" config and allow all options to be default.
Quoted 33 lines · Peter Zijlstra
Quoted 19 lines · Jeff Vander Stoep
+++
b/kernel/events/core.ckernel/events/core.c +4
-0@@ -355,7 +355,11 @@ static struct srcu_struct pmus_srcu;* 2 - disallow kernel profiling for unpriv * 3 - disallow all unpriv perf event use */ +#ifdef CONFIG_SECURITY_PERF_EVENTS_RESTRICT +int sysctl_perf_event_paranoid__read_mostly =3 ; +#else int sysctl_perf_event_paranoid__read_mostly =2 ; +#endif /* Minimum for 512 kiB + 1 user control page */ int sysctl_perf_event_mlock__read_mostly =512 + (PAGE_SIZE /1024 );/* 'free' kiB per user */ security/Kconfig +0
-0@@ -18,6 +18,15 @@ config SECURITY_DMESG_RESTRICTsecurity/Kconfig config SECURITY_DMESG_RESTRICT · line 28
Quoted 10 lines
security/Kconfig +8
-0If you are unsure how to answer this question, answer N. +config SECURITY_PERF_EVENTS_RESTRICT + bool "Restrict unprivileged use of performance events" + depends on PERF_EVENTS + help + If you say Y here, the kernel.perf_event_paranoid sysctl + will be set to 3 by default, and no unprivileged use of the + perf_event_open syscall will be permitted unless it is + changed.NAK.
Quoted 5 lines
Apart from the fact that I hate the 3 thing this is not how you do default CONFIG knobs for !bool state variables.
Use an "int" config not a "bool" config and allow all options to be default.
How about leaving off 2/2 and just keeping 1/2 of this series?
-Kees
Signature · 2 lines
Kees Cook Chrome OS & Brillo Security