linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/3] add support for never printing hashed addresses
@ 2021-02-10  5:05 Timur Tabi
  2021-02-10  5:05 ` [PATCH 1/3] lib/test_printf: use KSTM_MODULE_GLOBALS macro Timur Tabi
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Timur Tabi @ 2021-02-10  5:05 UTC (permalink / raw)
  To: Petr Mladek, Steven Rostedt, Sergey Senozhatsky, Vlastimil Babka,
	Andy Shevchenko, Matthew Wilcox, akpm, Linus Torvalds,
	roman.fietze, Kees Cook, John Ogness, akinobu.mita, glider,
	Andrey Konovalov, Marco Elver, Rasmus Villemoes, Pavel Machek,
	linux-kernel, linux-mm

[The list of email addresses on CC: is getting quite lengthy,
so I hope I've included everyone.]

Although hashing addresses printed via printk does make the
kernel more secure, it interferes with debugging, especially
with some functions like print_hex_dump() which always uses
hashed addresses.

To avoid having to choose between %p and %px, it's easier to
add a kernel command line that treats all %p as %px.  This
encourages developers to use %p more without making debugging
more difficult.

Patches #1 and #2 upgrade the kselftest framework so that
it can report on tests that were skipped outright.  This
is needed for the test_printf module which will now skip
%p hashing tests if hashing is disabled.

Patch #2 upgrades the printf library to check the command
line.  It also updates test_printf().

Timur Tabi (3):
  lib/test_printf: use KSTM_MODULE_GLOBALS macro
  kselftest: add support for skipped tests
  [v2] lib/vsprintf: make-printk-non-secret printks all addresses as
    unhashed

 .../admin-guide/kernel-parameters.txt         | 15 +++++++
 lib/test_printf.c                             | 12 +++++-
 lib/vsprintf.c                                | 40 ++++++++++++++++++-
 tools/testing/selftests/kselftest_module.h    | 18 ++++++---
 4 files changed, 75 insertions(+), 10 deletions(-)

-- 
2.25.1



^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/3] lib/test_printf: use KSTM_MODULE_GLOBALS macro
  2021-02-10  5:05 [PATCH 0/3] add support for never printing hashed addresses Timur Tabi
@ 2021-02-10  5:05 ` Timur Tabi
  2021-02-10  5:05 ` [PATCH 2/3] kselftest: add support for skipped tests Timur Tabi
  2021-02-10  5:05 ` [PATCH 3/3] [v2] lib/vsprintf: make-printk-non-secret printks all addresses as unhashed Timur Tabi
  2 siblings, 0 replies; 7+ messages in thread
From: Timur Tabi @ 2021-02-10  5:05 UTC (permalink / raw)
  To: Petr Mladek, Steven Rostedt, Sergey Senozhatsky, Vlastimil Babka,
	Andy Shevchenko, Matthew Wilcox, akpm, Linus Torvalds,
	roman.fietze, Kees Cook, John Ogness, akinobu.mita, glider,
	Andrey Konovalov, Marco Elver, Rasmus Villemoes, Pavel Machek,
	linux-kernel, linux-mm

Instead of defining the total/failed test counters manually,
test_printf should use the kselftest macro created for this
purpose.

Signed-off-by: Timur Tabi <ttabi@nvidia.com>
---
 lib/test_printf.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/test_printf.c b/lib/test_printf.c
index 7ac87f18a10f..ad2bcfa8caa1 100644
--- a/lib/test_printf.c
+++ b/lib/test_printf.c
@@ -30,8 +30,8 @@
 #define PAD_SIZE 16
 #define FILL_CHAR '$'
 
-static unsigned total_tests __initdata;
-static unsigned failed_tests __initdata;
+KSTM_MODULE_GLOBALS();
+
 static char *test_buffer __initdata;
 static char *alloced_buffer __initdata;
 
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/3] kselftest: add support for skipped tests
  2021-02-10  5:05 [PATCH 0/3] add support for never printing hashed addresses Timur Tabi
  2021-02-10  5:05 ` [PATCH 1/3] lib/test_printf: use KSTM_MODULE_GLOBALS macro Timur Tabi
@ 2021-02-10  5:05 ` Timur Tabi
  2021-02-10  5:05 ` [PATCH 3/3] [v2] lib/vsprintf: make-printk-non-secret printks all addresses as unhashed Timur Tabi
  2 siblings, 0 replies; 7+ messages in thread
From: Timur Tabi @ 2021-02-10  5:05 UTC (permalink / raw)
  To: Petr Mladek, Steven Rostedt, Sergey Senozhatsky, Vlastimil Babka,
	Andy Shevchenko, Matthew Wilcox, akpm, Linus Torvalds,
	roman.fietze, Kees Cook, John Ogness, akinobu.mita, glider,
	Andrey Konovalov, Marco Elver, Rasmus Villemoes, Pavel Machek,
	linux-kernel, linux-mm

Update the kselftest framework to all testing clients to
specify that some tests were skipped.

Signed-off-by: Timur Tabi <ttabi@nvidia.com>
---
 tools/testing/selftests/kselftest_module.h | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/tools/testing/selftests/kselftest_module.h b/tools/testing/selftests/kselftest_module.h
index e8eafaf0941a..e2ea41de3f35 100644
--- a/tools/testing/selftests/kselftest_module.h
+++ b/tools/testing/selftests/kselftest_module.h
@@ -11,7 +11,8 @@
 
 #define KSTM_MODULE_GLOBALS()			\
 static unsigned int total_tests __initdata;	\
-static unsigned int failed_tests __initdata
+static unsigned int failed_tests __initdata;	\
+static unsigned int skipped_tests __initdata
 
 #define KSTM_CHECK_ZERO(x) do {						\
 	total_tests++;							\
@@ -21,11 +22,16 @@ static unsigned int failed_tests __initdata
 	}								\
 } while (0)
 
-static inline int kstm_report(unsigned int total_tests, unsigned int failed_tests)
+static inline int kstm_report(unsigned int total_tests, unsigned int failed_tests,
+			      unsigned int skipped_tests)
 {
-	if (failed_tests == 0)
-		pr_info("all %u tests passed\n", total_tests);
-	else
+	if (failed_tests == 0) {
+		if (skipped_tests) {
+			pr_info("skipped %u tests\n", skipped_tests);
+			pr_info("remaining %u tests passed\n", total_tests);
+		} else
+			pr_info("all %u tests passed\n", total_tests);
+	} else
 		pr_warn("failed %u out of %u tests\n", failed_tests, total_tests);
 
 	return failed_tests ? -EINVAL : 0;
@@ -36,7 +42,7 @@ static int __init __module##_init(void)			\
 {							\
 	pr_info("loaded.\n");				\
 	selftest();					\
-	return kstm_report(total_tests, failed_tests);	\
+	return kstm_report(total_tests, failed_tests, skipped_tests);	\
 }							\
 static void __exit __module##_exit(void)		\
 {							\
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/3] [v2] lib/vsprintf: make-printk-non-secret printks all addresses as unhashed
  2021-02-10  5:05 [PATCH 0/3] add support for never printing hashed addresses Timur Tabi
  2021-02-10  5:05 ` [PATCH 1/3] lib/test_printf: use KSTM_MODULE_GLOBALS macro Timur Tabi
  2021-02-10  5:05 ` [PATCH 2/3] kselftest: add support for skipped tests Timur Tabi
@ 2021-02-10  5:05 ` Timur Tabi
  2 siblings, 0 replies; 7+ messages in thread
From: Timur Tabi @ 2021-02-10  5:05 UTC (permalink / raw)
  To: Petr Mladek, Steven Rostedt, Sergey Senozhatsky, Vlastimil Babka,
	Andy Shevchenko, Matthew Wilcox, akpm, Linus Torvalds,
	roman.fietze, Kees Cook, John Ogness, akinobu.mita, glider,
	Andrey Konovalov, Marco Elver, Rasmus Villemoes, Pavel Machek,
	linux-kernel, linux-mm

From: Timur Tabi <timur@kernel.org>

If the make-printk-non-secret command line parameter is set, then
printk("%p") will print pointers as unhashed.  This is useful for
debugging purposes.

A large warning message is displayed if this option is enabled.
Unhashed pointers, while useful for debugging, expose kernel
addresses which can be a security risk.

Also update test_printf to skip the hashed pointer tests if the
command-line option is set.

Signed-off-by: Timur Tabi <timur@kernel.org>
Acked-by: Petr Mladek <pmladek@suse.com>
Acked-by: Randy Dunlap <rdunlap@infradead.org>
Acked-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
---
 .../admin-guide/kernel-parameters.txt         | 15 ++++++++
 lib/test_printf.c                             |  8 ++++
 lib/vsprintf.c                                | 38 ++++++++++++++++++-
 3 files changed, 59 insertions(+), 2 deletions(-)

diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 9e3cdb271d06..e639b0f32a6c 100644
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@ -2613,6 +2613,21 @@
 			different yeeloong laptops.
 			Example: machtype=lemote-yeeloong-2f-7inch
 
+        make-printk-non-secret
+			Force pointers printed to the console to be unhashed.
+			By default, when a pointer is printed to the kernel
+			console (via %p format string), that pointer is
+			"hashed", i.e. obscured by hashing the pointer value.
+			This is a security feature that hides actual kernel
+			addresses from unprivileged users, but it also makes
+			debugging the kernel more difficult since unequal
+			pointers can no longer be compared.  If this option is
+			specified, then all normal pointers will have their
+			true value printed.  Pointers printed via %pK may
+			still be hashed.  This option should only be specified
+			when debugging the kernel.  Please do not use on
+			production kernels.
+
 	max_addr=nn[KMG]	[KNL,BOOT,ia64] All physical memory greater
 			than or equal to this physical address is ignored.
 
diff --git a/lib/test_printf.c b/lib/test_printf.c
index ad2bcfa8caa1..b0b62d76e598 100644
--- a/lib/test_printf.c
+++ b/lib/test_printf.c
@@ -35,6 +35,8 @@ KSTM_MODULE_GLOBALS();
 static char *test_buffer __initdata;
 static char *alloced_buffer __initdata;
 
+extern bool debug_never_hash_pointers;
+
 static int __printf(4, 0) __init
 do_test(int bufsize, const char *expect, int elen,
 	const char *fmt, va_list ap)
@@ -301,6 +303,12 @@ plain(void)
 {
 	int err;
 
+	if (debug_never_hash_pointers) {
+		pr_warn("skipping plain 'p' tests");
+		skipped_tests += 2;
+		return;
+	}
+
 	err = plain_hash();
 	if (err) {
 		pr_warn("plain 'p' does not appear to be hashed\n");
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 3b53c73580c5..1296d9b0b328 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -2090,6 +2090,34 @@ char *fwnode_string(char *buf, char *end, struct fwnode_handle *fwnode,
 	return widen_string(buf, buf - buf_start, end, spec);
 }
 
+/* Disable pointer hashing if requested */
+bool debug_never_hash_pointers __ro_after_init;
+EXPORT_SYMBOL_GPL(debug_never_hash_pointers);
+
+static int __init debug_never_hash_pointers_enable(char *str)
+{
+	debug_never_hash_pointers = true;
+
+	pr_warn("**********************************************************\n");
+	pr_warn("**   NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE   **\n");
+	pr_warn("**                                                      **\n");
+	pr_warn("** All pointers that are printed to the console will    **\n");
+	pr_warn("** be printed as unhashed.                              **\n");
+	pr_warn("**                                                      **\n");
+	pr_warn("** Kernel memory addresses are exposed, which may       **\n");
+	pr_warn("** reduce the security of your system.                  **\n");
+	pr_warn("**                                                      **\n");
+	pr_warn("** If you see this message and you are not debugging    **\n");
+	pr_warn("** the kernel, report this immediately to your system   **\n");
+	pr_warn("** administrator!                                       **\n");
+	pr_warn("**                                                      **\n");
+	pr_warn("**   NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE NOTICE   **\n");
+	pr_warn("**********************************************************\n");
+
+	return 0;
+}
+early_param("make-printk-non-secret", debug_never_hash_pointers_enable);
+
 /*
  * Show a '%p' thing.  A kernel extension is that the '%p' is followed
  * by an extra set of alphanumeric characters that are extended format
@@ -2297,8 +2325,14 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
 		}
 	}
 
-	/* default is to _not_ leak addresses, hash before printing */
-	return ptr_to_id(buf, end, ptr, spec);
+	/*
+	 * default is to _not_ leak addresses, so hash before printing unless
+	 * make-printk-non-secret is specified on the command line.
+	 */
+	if (unlikely(debug_never_hash_pointers))
+		return pointer_string(buf, end, ptr, spec);
+	else
+		return ptr_to_id(buf, end, ptr, spec);
 }
 
 /*
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/3] lib/test_printf: use KSTM_MODULE_GLOBALS macro
  2021-02-10  5:18 ` [PATCH 1/3] lib/test_printf: use KSTM_MODULE_GLOBALS macro Timur Tabi
  2021-02-10  5:21   ` Timur Tabi
@ 2021-02-10 13:14   ` Petr Mladek
  1 sibling, 0 replies; 7+ messages in thread
From: Petr Mladek @ 2021-02-10 13:14 UTC (permalink / raw)
  To: Timur Tabi
  Cc: Steven Rostedt, Sergey Senozhatsky, Vlastimil Babka,
	Andy Shevchenko, Matthew Wilcox, akpm, Linus Torvalds,
	roman.fietze, Kees Cook, John Ogness, akinobu.mita, glider,
	Andrey Konovalov, Marco Elver, Rasmus Villemoes, Pavel Machek,
	linux-kernel, linux-mm

On Tue 2021-02-09 23:18:12, Timur Tabi wrote:
> Instead of defining the total/failed test counters manually,
> test_printf should use the kselftest macro created for this
> purpose.
> 
> Signed-off-by: Timur Tabi <ttabi@nvidia.com>

Reviewed-by: Petr Mladek <pmladek@suse.com>

Best Regards,
Petr


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/3] lib/test_printf: use KSTM_MODULE_GLOBALS macro
  2021-02-10  5:18 ` [PATCH 1/3] lib/test_printf: use KSTM_MODULE_GLOBALS macro Timur Tabi
@ 2021-02-10  5:21   ` Timur Tabi
  2021-02-10 13:14   ` Petr Mladek
  1 sibling, 0 replies; 7+ messages in thread
From: Timur Tabi @ 2021-02-10  5:21 UTC (permalink / raw)
  To: Petr Mladek, Steven Rostedt, Sergey Senozhatsky, Vlastimil Babka,
	Andy Shevchenko, Matthew Wilcox, akpm, Linus Torvalds,
	roman.fietze, Kees Cook, John Ogness, akinobu.mita, glider,
	Andrey Konovalov, Marco Elver, Rasmus Villemoes, Pavel Machek,
	linux-kernel, linux-mm

On 2/9/21 11:18 PM, Timur Tabi wrote:
> Instead of defining the total/failed test counters manually,
> test_printf should use the kselftest macro created for this
> purpose.
> 
> Signed-off-by: Timur Tabi<ttabi@nvidia.com>

Ugh, I really need to stop sending patches late at night.  This is again 
the wrong email address.

I'm sure I'll need to post another version of these patches, so I'll 
just fix it then.


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/3] lib/test_printf: use KSTM_MODULE_GLOBALS macro
  2021-02-10  5:18 [PATCH 0/3][RESEND] add support for never printing hashed addresses Timur Tabi
@ 2021-02-10  5:18 ` Timur Tabi
  2021-02-10  5:21   ` Timur Tabi
  2021-02-10 13:14   ` Petr Mladek
  0 siblings, 2 replies; 7+ messages in thread
From: Timur Tabi @ 2021-02-10  5:18 UTC (permalink / raw)
  To: Petr Mladek, Steven Rostedt, Sergey Senozhatsky, Vlastimil Babka,
	Andy Shevchenko, Matthew Wilcox, akpm, Linus Torvalds,
	roman.fietze, Kees Cook, John Ogness, akinobu.mita, glider,
	Andrey Konovalov, Marco Elver, Rasmus Villemoes, Pavel Machek,
	linux-kernel, linux-mm

Instead of defining the total/failed test counters manually,
test_printf should use the kselftest macro created for this
purpose.

Signed-off-by: Timur Tabi <ttabi@nvidia.com>
---
 lib/test_printf.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/test_printf.c b/lib/test_printf.c
index 7ac87f18a10f..ad2bcfa8caa1 100644
--- a/lib/test_printf.c
+++ b/lib/test_printf.c
@@ -30,8 +30,8 @@
 #define PAD_SIZE 16
 #define FILL_CHAR '$'
 
-static unsigned total_tests __initdata;
-static unsigned failed_tests __initdata;
+KSTM_MODULE_GLOBALS();
+
 static char *test_buffer __initdata;
 static char *alloced_buffer __initdata;
 
-- 
2.25.1



^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2021-02-10 13:14 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-10  5:05 [PATCH 0/3] add support for never printing hashed addresses Timur Tabi
2021-02-10  5:05 ` [PATCH 1/3] lib/test_printf: use KSTM_MODULE_GLOBALS macro Timur Tabi
2021-02-10  5:05 ` [PATCH 2/3] kselftest: add support for skipped tests Timur Tabi
2021-02-10  5:05 ` [PATCH 3/3] [v2] lib/vsprintf: make-printk-non-secret printks all addresses as unhashed Timur Tabi
2021-02-10  5:18 [PATCH 0/3][RESEND] add support for never printing hashed addresses Timur Tabi
2021-02-10  5:18 ` [PATCH 1/3] lib/test_printf: use KSTM_MODULE_GLOBALS macro Timur Tabi
2021-02-10  5:21   ` Timur Tabi
2021-02-10 13:14   ` Petr Mladek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).