* [PATCH v2] Restrict unprivileged access to kernel syslog
@ 2010-11-10 0:18 Dan Rosenberg
2010-11-10 8:25 ` Ingo Molnar
2010-11-10 16:32 ` Kees Cook
0 siblings, 2 replies; 7+ messages in thread
From: Dan Rosenberg @ 2010-11-10 0:18 UTC (permalink / raw)
To: linux-kernel; +Cc: torvalds, mingo, kees.cook
The kernel syslog contains debugging information that is often useful
during exploitation of other vulnerabilities, such as kernel heap
addresses. Rather than futilely attempt to sanitize hundreds (or
thousands) of printk statements and simultaneously cripple useful
debugging functionality, it is far simpler to create an option that
prevents unprivileged users from reading the syslog.
This patch, loosely based on grsecurity's GRKERNSEC_DMESG, creates the
dmesg_restrict sysctl. When set to "0", the default, no restrictions
are enforced. When set to "1", only users with CAP_SYS_ADMIN can read
the kernel syslog via dmesg(8) or other mechanisms.
v2 adds CONFIG_SECURITY_RESTRICT_DMESG. When enabled, the default
sysctl value is set to "1". When disabled, the default sysctl value is
set to "0".
Signed-off-by: Dan Rosenberg <drosenberg@vsecurity.com>
CC: Linus Torvalds <torvalds@linux-foundation.org>
CC: Ingo Molnar <mingo@elte.hu>
CC: Kees Cook <kees.cook@canonical.com>
CC: stable <stable@kernel.org>
---
Documentation/sysctl/kernel.txt | 11 +++++++++++
include/linux/kernel.h | 1 +
kernel/printk.c | 6 ++++++
kernel/sysctl.c | 9 +++++++++
security/Kconfig | 11 +++++++++++
security/commoncap.c | 2 ++
6 files changed, 40 insertions(+), 0 deletions(-)
diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt
index 3894eaa..c6bac30 100644
--- a/Documentation/sysctl/kernel.txt
+++ b/Documentation/sysctl/kernel.txt
@@ -28,6 +28,7 @@ show up in /proc/sys/kernel:
- core_uses_pid
- ctrl-alt-del
- dentry-state
+- dmesg_restrict
- domainname
- hostname
- hotplug
@@ -213,6 +214,16 @@ to decide what to do with it.
==============================================================
+dmesg_restrict:
+
+This toggle indicates whether unprivileged users are prevented
+from using dmesg(8) to view messages from the kernel's log
+buffer. By default, it is set to (0), resulting in no
+restrictions. When set to (1), users must have CAP_SYS_ADMIN
+to use dmesg(8).
+
+==============================================================
+
domainname & hostname:
These files can be used to set the NIS/YP domainname and the
diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 450092c..f0d0088 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -293,6 +293,7 @@ extern bool printk_timed_ratelimit(unsigned long *caller_jiffies,
unsigned int interval_msec);
extern int printk_delay_msec;
+extern int dmesg_restrict;
/*
* Print a one-time message (analogous to WARN_ONCE() et al):
diff --git a/kernel/printk.c b/kernel/printk.c
index b2ebaee..485d653 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -261,6 +261,12 @@ static inline void boot_delay_msec(void)
}
#endif
+#ifdef CONFIG_SECURITY_RESTRICT_DMESG
+int dmesg_restrict = 1;
+#else
+int dmesg_restrict;
+#endif
+
int do_syslog(int type, char __user *buf, int len, bool from_file)
{
unsigned i, j, limit, count;
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index c33a1ed..b65bf63 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -704,6 +704,15 @@ static struct ctl_table kern_table[] = {
},
#endif
{
+ .procname = "dmesg_restrict",
+ .data = &dmesg_restrict,
+ .maxlen = sizeof(int),
+ .mode = 0644,
+ .proc_handler = proc_dointvec_minmax,
+ .extra1 = &zero,
+ .extra2 = &one,
+ },
+ {
.procname = "ngroups_max",
.data = &ngroups_max,
.maxlen = sizeof (int),
diff --git a/security/Kconfig b/security/Kconfig
index bd72ae6..6ca390e 100644
--- a/security/Kconfig
+++ b/security/Kconfig
@@ -39,6 +39,17 @@ config KEYS_DEBUG_PROC_KEYS
If you are unsure as to whether this is required, answer N.
+config SECURITY_RESTRICT_DMESG
+ bool "Restrict unprivileged access to the kernel syslog"
+ help
+ This enforces restrictions on unprivileged users reading the kernel
+ syslog via dmesg(8).
+
+ If this option is not selected, no restrictions will be enforced
+ unless the dmesg_restrict sysctl is explicitly set to (1).
+
+ If you are unsure how to answer this question, answer N.
+
config SECURITY
bool "Enable different security models"
depends on SYSFS
diff --git a/security/commoncap.c b/security/commoncap.c
index 5e632b4..04b80f9 100644
--- a/security/commoncap.c
+++ b/security/commoncap.c
@@ -895,6 +895,8 @@ int cap_syslog(int type, bool from_file)
{
if (type != SYSLOG_ACTION_OPEN && from_file)
return 0;
+ if (dmesg_restrict && !capable(CAP_SYS_ADMIN))
+ return -EPERM;
if ((type != SYSLOG_ACTION_READ_ALL &&
type != SYSLOG_ACTION_SIZE_BUFFER) && !capable(CAP_SYS_ADMIN))
return -EPERM;
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH v2] Restrict unprivileged access to kernel syslog
2010-11-10 0:18 [PATCH v2] Restrict unprivileged access to kernel syslog Dan Rosenberg
@ 2010-11-10 8:25 ` Ingo Molnar
2010-11-10 15:26 ` Andrew Morton
2010-11-10 16:32 ` Kees Cook
1 sibling, 1 reply; 7+ messages in thread
From: Ingo Molnar @ 2010-11-10 8:25 UTC (permalink / raw)
To: Dan Rosenberg; +Cc: linux-kernel, torvalds, kees.cook, Andrew Morton
* Dan Rosenberg <drosenberg@vsecurity.com> wrote:
> The kernel syslog contains debugging information that is often useful
> during exploitation of other vulnerabilities, such as kernel heap
> addresses. Rather than futilely attempt to sanitize hundreds (or
> thousands) of printk statements and simultaneously cripple useful
> debugging functionality, it is far simpler to create an option that
> prevents unprivileged users from reading the syslog.
>
> This patch, loosely based on grsecurity's GRKERNSEC_DMESG, creates the
> dmesg_restrict sysctl. When set to "0", the default, no restrictions
> are enforced. When set to "1", only users with CAP_SYS_ADMIN can read
> the kernel syslog via dmesg(8) or other mechanisms.
>
> v2 adds CONFIG_SECURITY_RESTRICT_DMESG. When enabled, the default
> sysctl value is set to "1". When disabled, the default sysctl value is
> set to "0".
>
> Signed-off-by: Dan Rosenberg <drosenberg@vsecurity.com>
> CC: Linus Torvalds <torvalds@linux-foundation.org>
> CC: Ingo Molnar <mingo@elte.hu>
> CC: Kees Cook <kees.cook@canonical.com>
> CC: stable <stable@kernel.org>
Acked-by: Ingo Molnar <mingo@elte.hu>
Linus, Andrew, any objections against pushing this trivial control flag upstream out
of band, after a bit of testing? It's not like it can break anything, and the flag
is very useful to distros.
Thanks,
Ingo
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2] Restrict unprivileged access to kernel syslog
2010-11-10 8:25 ` Ingo Molnar
@ 2010-11-10 15:26 ` Andrew Morton
2010-11-10 17:50 ` Dave Jones
2010-11-10 18:10 ` Ingo Molnar
0 siblings, 2 replies; 7+ messages in thread
From: Andrew Morton @ 2010-11-10 15:26 UTC (permalink / raw)
To: Ingo Molnar; +Cc: Dan Rosenberg, linux-kernel, torvalds, kees.cook
On Wed, 10 Nov 2010 09:25:16 +0100 Ingo Molnar <mingo@elte.hu> wrote:
>
> * Dan Rosenberg <drosenberg@vsecurity.com> wrote:
>
> > The kernel syslog contains debugging information that is often useful
> > during exploitation of other vulnerabilities, such as kernel heap
> > addresses. Rather than futilely attempt to sanitize hundreds (or
> > thousands) of printk statements and simultaneously cripple useful
> > debugging functionality, it is far simpler to create an option that
> > prevents unprivileged users from reading the syslog.
> >
> > This patch, loosely based on grsecurity's GRKERNSEC_DMESG, creates the
> > dmesg_restrict sysctl. When set to "0", the default, no restrictions
> > are enforced. When set to "1", only users with CAP_SYS_ADMIN can read
> > the kernel syslog via dmesg(8) or other mechanisms.
> >
> > v2 adds CONFIG_SECURITY_RESTRICT_DMESG. When enabled, the default
> > sysctl value is set to "1". When disabled, the default sysctl value is
> > set to "0".
> >
> > Signed-off-by: Dan Rosenberg <drosenberg@vsecurity.com>
> > CC: Linus Torvalds <torvalds@linux-foundation.org>
> > CC: Ingo Molnar <mingo@elte.hu>
> > CC: Kees Cook <kees.cook@canonical.com>
> > CC: stable <stable@kernel.org>
>
> Acked-by: Ingo Molnar <mingo@elte.hu>
>
> Linus, Andrew, any objections against pushing this trivial control flag upstream out
> of band, after a bit of testing? It's not like it can break anything, and the flag
> is very useful to distros.
>
OK by me, apart from ...
a) I'd question the need for the config option. Are distros really
so lame that they can't trust themselves to poke a number into
procfs at boot time?
b) we have "dmesg_restrict" and "CONFIG_RESTRICT_DMESG". Less
dyslexia, please.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2] Restrict unprivileged access to kernel syslog
2010-11-10 15:26 ` Andrew Morton
@ 2010-11-10 17:50 ` Dave Jones
2010-11-10 18:13 ` Ingo Molnar
2010-11-10 18:10 ` Ingo Molnar
1 sibling, 1 reply; 7+ messages in thread
From: Dave Jones @ 2010-11-10 17:50 UTC (permalink / raw)
To: Andrew Morton
Cc: Ingo Molnar, Dan Rosenberg, linux-kernel, torvalds, kees.cook
On Wed, Nov 10, 2010 at 07:26:38AM -0800, Andrew Morton wrote:
> a) I'd question the need for the config option. Are distros really
> so lame that they can't trust themselves to poke a number into
> procfs at boot time?
short answer: yes.
* /etc/sysctl.conf is for users to override decisions distros have made,
rather than a catalog of those decisions.
* Sometimes we change our mind on those decisions. Flipping a config option
in the kernel means we push out an update, and forget about it.
Users /etc/sysctl.conf's contain all kinds of crazyness. ask Davem about
the stale TCP 'tuning' crap that lingered for years in Fedora users configs
before anyone noticed.
(We could update the sysctl.conf at post-install of the kernel package,
but if you've ever seen a distro kernel packaging schema, you'd understand
why adding more magic like this isn't desirable)
There's a bunch of patches we carry in Fedora that change defaults because there's
no CONFIG option for them, which I've been meaning to get around to
hacking up into options so we can carry a few less patches.
Dave
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2] Restrict unprivileged access to kernel syslog
2010-11-10 17:50 ` Dave Jones
@ 2010-11-10 18:13 ` Ingo Molnar
0 siblings, 0 replies; 7+ messages in thread
From: Ingo Molnar @ 2010-11-10 18:13 UTC (permalink / raw)
To: Dave Jones, Andrew Morton, Dan Rosenberg, linux-kernel, torvalds,
kees.cook
* Dave Jones <davej@redhat.com> wrote:
> On Wed, Nov 10, 2010 at 07:26:38AM -0800, Andrew Morton wrote:
>
> > a) I'd question the need for the config option. Are distros really
> > so lame that they can't trust themselves to poke a number into
> > procfs at boot time?
>
> short answer: yes.
>
> * /etc/sysctl.conf is for users to override decisions distros have made,
> rather than a catalog of those decisions.
>
> * Sometimes we change our mind on those decisions. Flipping a config option
> in the kernel means we push out an update, and forget about it.
> Users /etc/sysctl.conf's contain all kinds of crazyness. ask Davem about
> the stale TCP 'tuning' crap that lingered for years in Fedora users configs
> before anyone noticed.
> (We could update the sysctl.conf at post-install of the kernel package,
> but if you've ever seen a distro kernel packaging schema, you'd understand
> why adding more magic like this isn't desirable)
>
> There's a bunch of patches we carry in Fedora that change defaults because there's
> no CONFIG option for them, which I've been meaning to get around to hacking up
> into options so we can carry a few less patches.
_YES_.
A self-contained .config that carries all kernel related defaults is a very powerful
thing. We need more of that.
Thanks,
Ingo
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2] Restrict unprivileged access to kernel syslog
2010-11-10 15:26 ` Andrew Morton
2010-11-10 17:50 ` Dave Jones
@ 2010-11-10 18:10 ` Ingo Molnar
1 sibling, 0 replies; 7+ messages in thread
From: Ingo Molnar @ 2010-11-10 18:10 UTC (permalink / raw)
To: Andrew Morton; +Cc: Dan Rosenberg, linux-kernel, torvalds, kees.cook
* Andrew Morton <akpm@linux-foundation.org> wrote:
> OK by me, apart from ...
>
> a) I'd question the need for the config option. Are distros really
> so lame that they can't trust themselves to poke a number into
> procfs at boot time?
When it comes to security i personally prefer 'permanent' defaults that is a
property of the booting image. I'd even change the default for the x86 defconfig for
example - and we could make this option default-y in the future. (We cannot ever
make the sysctl default itself default-1, it would break compatibility with old
behavior.)
> b) we have "dmesg_restrict" and "CONFIG_RESTRICT_DMESG". Less
> dyslexia, please.
Good point. CONFIG_DMESG_RESTRICT is the proper hierarchical naming i suspect.
Thanks,
Ingo
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2] Restrict unprivileged access to kernel syslog
2010-11-10 0:18 [PATCH v2] Restrict unprivileged access to kernel syslog Dan Rosenberg
2010-11-10 8:25 ` Ingo Molnar
@ 2010-11-10 16:32 ` Kees Cook
1 sibling, 0 replies; 7+ messages in thread
From: Kees Cook @ 2010-11-10 16:32 UTC (permalink / raw)
To: Dan Rosenberg; +Cc: linux-kernel, torvalds, mingo
On Tue, Nov 09, 2010 at 07:18:29PM -0500, Dan Rosenberg wrote:
> The kernel syslog contains debugging information that is often useful
> during exploitation of other vulnerabilities, such as kernel heap
> addresses. Rather than futilely attempt to sanitize hundreds (or
> thousands) of printk statements and simultaneously cripple useful
> debugging functionality, it is far simpler to create an option that
> prevents unprivileged users from reading the syslog.
>
> This patch, loosely based on grsecurity's GRKERNSEC_DMESG, creates the
> dmesg_restrict sysctl. When set to "0", the default, no restrictions
> are enforced. When set to "1", only users with CAP_SYS_ADMIN can read
> the kernel syslog via dmesg(8) or other mechanisms.
>
> v2 adds CONFIG_SECURITY_RESTRICT_DMESG. When enabled, the default
> sysctl value is set to "1". When disabled, the default sysctl value is
> set to "0".
>
> Signed-off-by: Dan Rosenberg <drosenberg@vsecurity.com>
> CC: Linus Torvalds <torvalds@linux-foundation.org>
> CC: Ingo Molnar <mingo@elte.hu>
> CC: Kees Cook <kees.cook@canonical.com>
> CC: stable <stable@kernel.org>
Acked-by: Kees Cook <kees.cook@canonical.com>
As before, this looks fine and does the right thing with regard to /proc
access to the kernel log.
--
Kees Cook
Ubuntu Security Team
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2010-11-10 18:14 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-10 0:18 [PATCH v2] Restrict unprivileged access to kernel syslog Dan Rosenberg
2010-11-10 8:25 ` Ingo Molnar
2010-11-10 15:26 ` Andrew Morton
2010-11-10 17:50 ` Dave Jones
2010-11-10 18:13 ` Ingo Molnar
2010-11-10 18:10 ` Ingo Molnar
2010-11-10 16:32 ` Kees Cook
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox