All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Tobin C. Harding" <me@tobin.cc>
To: Greg KH <gregkh@linuxfoundation.org>,
	Petr Mladek <pmladek@suse.com>, Joe Perches <joe@perches.com>,
	Ian Campbell <ijc@hellion.org.uk>,
	Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: "Tobin C. Harding" <me@tobin.cc>,
	kernel-hardening@lists.openwall.com,
	linux-kernel@vger.kernel.org,
	Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will.deacon@arm.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	William Roberts <william.c.roberts@intel.com>,
	Chris Fries <cfries@google.com>,
	Dave Weinstein <olorin@google.com>
Subject: [kernel-hardening] [RFC V2 3/6] lib: vsprintf: physical address kernel pointer filtering options
Date: Sun,  1 Oct 2017 11:06:47 +1100	[thread overview]
Message-ID: <1506816410-10230-4-git-send-email-me@tobin.cc> (raw)
In-Reply-To: <1506816410-10230-1-git-send-email-me@tobin.cc>

Add the kptr_restrict setting of 4 which results in %pa and
%p[rR] values being cleansed.

Address types printed with %pa are replaced by zeros. Resources printed
with %p[rR] have the starting address replaced by zeros, resource size
is still shown.

Signed-off-by: Tobin C. Harding <me@tobin.cc>
---
 Documentation/sysctl/kernel.txt |  5 +++++
 kernel/sysctl.c                 |  3 +--
 lib/vsprintf.c                  | 31 +++++++++++++++++++++++++++++--
 3 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt
index 7ee183af..b6d45bc 100644
--- a/Documentation/sysctl/kernel.txt
+++ b/Documentation/sysctl/kernel.txt
@@ -398,6 +398,11 @@ When kptr_restrict is set to (3), kernel pointers printed using
 %p and %pK will be replaced with 0's regardless of privileges,
 however kernel pointers printed using %pP will continue to be printed.
 
+When kptr_restrict is set to (4), kernel pointers printed with
+%p, %pK, %pa, and %p[rR] will be replaced with 0's regardless of
+privileges. Kernel pointers printed using %pP will continue to be
+printed.
+
 ==============================================================
 
 l2cr: (PPC only)
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index 37ba637..f777b32 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -129,7 +129,6 @@ static unsigned long one_ul = 1;
 static int one_hundred = 100;
 static int one_thousand = 1000;
 #ifdef CONFIG_PRINTK
-static int three = 3;
 static int ten_thousand = 10000;
 #endif
 #ifdef CONFIG_PERF_EVENTS
@@ -852,7 +851,7 @@ static struct ctl_table kern_table[] = {
 		.mode		= 0644,
 		.proc_handler	= proc_dointvec_minmax_sysadmin,
 		.extra1		= &zero,
-		.extra2		= &three,
+		.extra2		= &four,
 	},
 #endif
 	{
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index e6eace0..0271223 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -406,6 +406,22 @@ static inline int kptr_restrict_cleanse_kernel_pointers(void)
 	return kptr_restrict >= 3;
 }
 
+/*
+ * return non-zero if we should cleanse pointers for %pa* specifiers.
+ */
+static inline int kptr_restrict_cleanse_addresses(void)
+{
+	return kptr_restrict >= 4;
+}
+
+/*
+ * return non-zero if we should cleanse pointers for %p[rR] specifiers.
+ */
+static inline int kptr_restrict_cleanse_resources(void)
+{
+	return kptr_restrict >= 4;
+}
+
 static noinline_for_stack
 char *number(char *buf, char *end, unsigned long long num,
 	     struct printf_spec spec)
@@ -758,6 +774,7 @@ char *resource_string(char *buf, char *end, struct resource *res,
 
 	char *p = sym, *pend = sym + sizeof(sym);
 	int decode = (fmt[0] == 'R') ? 1 : 0;
+	int cleanse = kptr_restrict_cleanse_resources();
 	const struct printf_spec *specp;
 
 	*p++ = '[';
@@ -785,10 +802,11 @@ char *resource_string(char *buf, char *end, struct resource *res,
 		p = string(p, pend, "size ", str_spec);
 		p = number(p, pend, resource_size(res), *specp);
 	} else {
-		p = number(p, pend, res->start, *specp);
+		p = number(p, pend, cleanse ? 0UL : res->start, *specp);
 		if (res->start != res->end) {
 			*p++ = '-';
-			p = number(p, pend, res->end, *specp);
+			p = number(p, pend, cleanse ?
+				res->end - res->start : res->end, *specp);
 		}
 	}
 	if (decode) {
@@ -1391,6 +1409,9 @@ char *address_val(char *buf, char *end, const void *addr, const char *fmt)
 		break;
 	}
 
+	if (kptr_restrict_cleanse_addresses())
+		num = 0UL;
+
 	return special_hex_number(buf, end, num, size);
 }
 
@@ -1714,6 +1735,12 @@ char *device_node_string(char *buf, char *end, struct device_node *dn,
  * pointer to the real address.
  *
  * Note: That for kptr_restrict set to 3, %p and %pK have the same meaning.
+ *
+ * Note: That for kptr_restrict set to 4, %pa will null out the physical
+ * address.
+ *
+ * Note: That for kptr_restrict set to 4, %p[rR] will null out the memory
+ * address.
  */
 static noinline_for_stack
 char *pointer(const char *fmt, char *buf, char *end, void *ptr,
-- 
2.7.4

  parent reply	other threads:[~2017-10-01  0:07 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-01  0:06 [kernel-hardening] [RFC V2 0/6] add more kernel pointer filter options Tobin C. Harding
2017-10-01  0:06 ` [kernel-hardening] [RFC V2 1/6] lib: vsprintf: additional kernel pointer filtering options Tobin C. Harding
2017-10-04  8:55   ` Greg KH
2017-10-04 13:08     ` Steven Rostedt
2017-10-04 13:26       ` Greg KH
2017-10-04 13:29         ` Steven Rostedt
2017-10-04 13:54           ` Greg KH
2017-10-01  0:06 ` [kernel-hardening] [RFC V2 2/6] lib: vsprintf: whitelist stack traces Tobin C. Harding
2017-10-02 10:42   ` Will Deacon
2017-10-02 21:49     ` Tobin C. Harding
2017-10-04  8:56     ` Greg KH
2017-10-04  8:58       ` Will Deacon
2017-10-04  9:02         ` Greg KH
2017-10-04 10:42           ` Tobin C. Harding
2017-10-01  0:06 ` Tobin C. Harding [this message]
2017-10-04  8:58   ` [kernel-hardening] [RFC V2 3/6] lib: vsprintf: physical address kernel pointer filtering options Greg KH
2017-10-01  0:06 ` [kernel-hardening] [RFC V2 4/6] lib: vsprintf: default kptr_restrict to the maximum value Tobin C. Harding
2017-10-04  8:55   ` Greg KH
2017-10-04 16:42   ` Kees Cook
2017-10-04 16:42     ` Kees Cook
2017-10-04 16:48     ` Roberts, William C
2017-10-04 16:48       ` Roberts, William C
2017-10-04 17:08     ` Linus Torvalds
2017-10-04 17:08       ` Linus Torvalds
2017-10-04 17:28       ` Linus Torvalds
2017-10-04 17:28         ` Linus Torvalds
2017-10-04 19:13         ` Jann Horn
2017-10-04 19:13           ` Jann Horn
2017-10-04 19:23           ` Linus Torvalds
2017-10-04 19:23             ` Linus Torvalds
2017-10-01  0:06 ` [kernel-hardening] [RFC V2 5/6] lib: vsprintf: add "%paP", "%papP", and "%padP" specifiers Tobin C. Harding
2017-10-04  8:58   ` Greg KH
2017-10-01  0:06 ` [kernel-hardening] [RFC V2 6/6] drivers: uio: un-restrict sysfs pointers for UIO Tobin C. Harding
2017-10-04  8:58   ` Greg KH
2017-10-01  0:11 ` [kernel-hardening] [RFC V2 0/6] add more kernel pointer filter options Tobin C. Harding
2017-10-04  8:57   ` Greg KH
2017-10-04 10:45     ` Tobin C. Harding
2017-10-04  8:58 ` Greg KH
2017-10-04 10:50   ` Tobin C. Harding
2017-10-04 12:42     ` Greg KH
2017-10-04 13:28       ` Steven Rostedt
2017-10-04 13:28         ` Steven Rostedt
2017-10-04 13:31         ` Steven Rostedt
2017-10-04 16:17   ` Roberts, William C
2017-10-04 16:17     ` Roberts, William C
2017-10-04 15:41 ` Linus Torvalds
2017-10-04 15:41   ` Linus Torvalds
2017-10-04 16:22   ` Boris Lukashev
2017-10-04 16:22     ` Boris Lukashev
2017-10-04 16:29     ` Linus Torvalds
2017-10-04 16:29       ` Linus Torvalds
2017-10-04 16:54       ` Steven Rostedt
2017-10-04 16:54         ` Steven Rostedt
2017-10-04 18:58   ` Jordan Glover
2017-10-04 19:19     ` Linus Torvalds
2017-10-04 21:58       ` Roberts, William C
2017-10-04 23:21         ` Daniel Micay
2017-10-04 23:52         ` Linus Torvalds
2017-10-05  0:09           ` Linus Torvalds
2017-10-05 13:55             ` Bjorn Helgaas
2017-10-05  0:29           ` Daniel Micay
2017-10-05  0:35             ` Kees Cook
2017-10-06  8:33               ` Djalal Harouni
2017-10-05  2:19           ` Tobin C. Harding
2017-10-05  3:10             ` Linus Torvalds
2017-10-05  3:15               ` Kees Cook
2017-10-05 15:12               ` Roberts, William C
2017-10-05 16:19                 ` Linus Torvalds
2017-10-05 17:10                   ` Dave Weinstein
2017-10-07 23:44                   ` Theodore Ts'o
2017-10-08  0:08                     ` Linus Torvalds
2017-10-13 16:32                       ` Roberts, William C
2017-10-13 18:11                         ` Linus Torvalds
2017-10-13 19:34                           ` Kees Cook
2017-10-13 20:22                             ` Linus Torvalds
2017-10-13 20:47                               ` Kees Cook
2017-10-13 21:45                                 ` Linus Torvalds
2017-10-13 22:48                                 ` Theodore Ts'o
2017-10-13 16:14             ` Roberts, William C
2017-10-04 16:32 ` Ian Campbell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1506816410-10230-4-git-send-email-me@tobin.cc \
    --to=me@tobin.cc \
    --cc=catalin.marinas@arm.com \
    --cc=cfries@google.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=ijc@hellion.org.uk \
    --cc=joe@perches.com \
    --cc=kernel-hardening@lists.openwall.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=olorin@google.com \
    --cc=pmladek@suse.com \
    --cc=rostedt@goodmis.org \
    --cc=sergey.senozhatsky@gmail.com \
    --cc=will.deacon@arm.com \
    --cc=william.c.roberts@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.