public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] kernel: escape non-ASCII and control characters in printk()
@ 2011-06-23 15:21 Vasiliy Kulikov
  2011-06-26 10:39 ` Ingo Molnar
  0 siblings, 1 reply; 31+ messages in thread
From: Vasiliy Kulikov @ 2011-06-23 15:21 UTC (permalink / raw)
  To: Andrew Morton, James Morris, Ingo Molnar, Namhyung Kim,
	Greg Kroah-Hartman, kernel-hardening, linux-kernel, Alan Cox

This patch escapes control characters fed to printk() except '\n' and '\t'.

There are numerous printk() instances with user supplied input as "%s"
data, and unprivileged user may craft log messages with substrings
containing control characters via these printk()s.  Control characters
might fool root viewing the logs via tty, e.g. using ^[1A to suppress
the previous log line.

On the testing Samsung Q310 laptop there are no users of chars outside
of the restricted charset. 

v2 - Allow chars with code >127.  Allow tabs.

Reported-by: Solar Designer <solar@openwall.com>
Signed-off-by: Vasiliy Kulikov <segoon@openwall.com>
---
 kernel/printk.c |   17 ++++++++++++++++-
 1 files changed, 16 insertions(+), 1 deletions(-)

---
diff --git a/kernel/printk.c b/kernel/printk.c
index 3518539..727ff7d 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -41,6 +41,7 @@
 #include <linux/cpu.h>
 #include <linux/notifier.h>
 #include <linux/rculist.h>
+#include <linux/ctype.h>
 
 #include <asm/uaccess.h>
 
@@ -671,6 +672,20 @@ static void emit_log_char(char c)
 		logged_chars++;
 }
 
+static void emit_log_char_escaped(char c)
+{
+	char buffer[8];
+	int i, len;
+
+	if (!iscntrl(c) || (c == '\n') || (c == '\t'))
+		emit_log_char(c);
+	else {
+		len = sprintf(buffer, "#x%02x", c);
+		for (i = 0; i < len; i++)
+			emit_log_char(buffer[i]);
+	}
+}
+
 /*
  * Zap console related locks when oopsing. Only zap at most once
  * every 10 seconds, to leave time for slow consoles to print a
@@ -938,7 +953,7 @@ asmlinkage int vprintk(const char *fmt, va_list args)
 				break;
 		}
 
-		emit_log_char(*p);
+		emit_log_char_escaped(*p);
 		if (*p == '\n')
 			new_text_line = 1;
 	}
---

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

end of thread, other threads:[~2011-07-05 17:49 UTC | newest]

Thread overview: 31+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-23 15:21 [PATCH v2] kernel: escape non-ASCII and control characters in printk() Vasiliy Kulikov
2011-06-26 10:39 ` Ingo Molnar
2011-06-26 16:54   ` Vasiliy Kulikov
2011-06-26 18:26     ` Ingo Molnar
2011-06-26 19:06       ` Vasiliy Kulikov
2011-06-26 19:46         ` Ingo Molnar
2011-06-26 20:25           ` Vasiliy Kulikov
2011-06-26 22:01             ` Ingo Molnar
2011-06-27  8:36               ` Vasiliy Kulikov
2011-06-27  9:20                 ` Vasiliy Kulikov
2011-06-27  9:40                 ` Alan Cox
2011-06-27 18:38                   ` Vasiliy Kulikov
2011-06-28 19:30                     ` Linus Torvalds
2011-07-01 12:00                       ` Ingo Molnar
2011-07-01 12:54                         ` [kernel-hardening] " Vasiliy Kulikov
2011-07-01 14:20                           ` Alan Cox
2011-07-02 16:42                             ` Solar Designer
2011-07-02 19:33                               ` Alan Cox
2011-07-02 20:34                                 ` Linus Torvalds
2011-07-01 14:37                       ` Vasiliy Kulikov
2011-07-01 14:49                         ` Alan Cox
2011-07-02  8:10                           ` Vasiliy Kulikov
2011-07-02 15:08                             ` Greg KH
2011-07-03 10:01                           ` Vasiliy Kulikov
2011-07-03 11:42                             ` Vasiliy Kulikov
2011-07-03 12:23                             ` Alan Cox
2011-07-03 17:42                             ` Linus Torvalds
2011-07-03 21:10                               ` Alan Cox
2011-07-03 21:34                                 ` Linus Torvalds
2011-07-05 17:49                               ` [kernel-hardening] " Vasiliy Kulikov
2011-07-01 12:12                 ` Ingo Molnar

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox