aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation/sysctl
diff options
context:
space:
mode:
authorRyan Mallon <rmallon@gmail.com>2013-11-12 18:08:51 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2013-11-12 22:09:14 -0500
commit312b4e226951f707e120b95b118cbc14f3d162b2 (patch)
treef4e9daef9fe4047ac43e5e3972df4ed3a696f589 /Documentation/sysctl
parent27083baca51358fe0fba8cf40b7df9bb696c931a (diff)
vsprintf: check real user/group id for %pK
Some setuid binaries will allow reading of files which have read permission by the real user id. This is problematic with files which use %pK because the file access permission is checked at open() time, but the kptr_restrict setting is checked at read() time. If a setuid binary opens a %pK file as an unprivileged user, and then elevates permissions before reading the file, then kernel pointer values may be leaked. This happens for example with the setuid pppd application on Ubuntu 12.04: $ head -1 /proc/kallsyms 00000000 T startup_32 $ pppd file /proc/kallsyms pppd: In file /proc/kallsyms: unrecognized option 'c1000000' This will only leak the pointer value from the first line, but other setuid binaries may leak more information. Fix this by adding a check that in addition to the current process having CAP_SYSLOG, that effective user and group ids are equal to the real ids. If a setuid binary reads the contents of a file which uses %pK then the pointer values will be printed as NULL if the real user is unprivileged. Update the sysctl documentation to reflect the changes, and also correct the documentation to state the kptr_restrict=0 is the default. This is a only temporary solution to the issue. The correct solution is to do the permission check at open() time on files, and to replace %pK with a function which checks the open() time permission. %pK uses in printk should be removed since no sane permission check can be done, and instead protected by using dmesg_restrict. Signed-off-by: Ryan Mallon <rmallon@gmail.com> Cc: Kees Cook <keescook@chromium.org> Cc: Alexander Viro <viro@zeniv.linux.org.uk> Cc: Joe Perches <joe@perches.com> Cc: "Eric W. Biederman" <ebiederm@xmission.com> Cc: <stable@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'Documentation/sysctl')
-rw-r--r--Documentation/sysctl/kernel.txt25
1 files changed, 18 insertions, 7 deletions
diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt
index 4273b2d71a27..26b7ee491df8 100644
--- a/Documentation/sysctl/kernel.txt
+++ b/Documentation/sysctl/kernel.txt
@@ -290,13 +290,24 @@ Default value is "/sbin/hotplug".
290kptr_restrict: 290kptr_restrict:
291 291
292This toggle indicates whether restrictions are placed on 292This toggle indicates whether restrictions are placed on
293exposing kernel addresses via /proc and other interfaces. When 293exposing kernel addresses via /proc and other interfaces.
294kptr_restrict is set to (0), there are no restrictions. When 294
295kptr_restrict is set to (1), the default, kernel pointers 295When kptr_restrict is set to (0), the default, there are no restrictions.
296printed using the %pK format specifier will be replaced with 0's 296
297unless the user has CAP_SYSLOG. When kptr_restrict is set to 297When kptr_restrict is set to (1), kernel pointers printed using the %pK
298(2), kernel pointers printed using %pK will be replaced with 0's 298format specifier will be replaced with 0's unless the user has CAP_SYSLOG
299regardless of privileges. 299and effective user and group ids are equal to the real ids. This is
300because %pK checks are done at read() time rather than open() time, so
301if permissions are elevated between the open() and the read() (e.g via
302a setuid binary) then %pK will not leak kernel pointers to unprivileged
303users. Note, this is a temporary solution only. The correct long-term
304solution is to do the permission checks at open() time. Consider removing
305world read permissions from files that use %pK, and using dmesg_restrict
306to protect against uses of %pK in dmesg(8) if leaking kernel pointer
307values to unprivileged users is a concern.
308
309When kptr_restrict is set to (2), kernel pointers printed using
310%pK will be replaced with 0's regardless of privileges.
300 311
301============================================================== 312==============================================================
302 313