All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v9 1/4] syscalls: Verify address limit before returning to user-mode
@ 2017-04-28 15:32 ` Thomas Garnier
  0 siblings, 0 replies; 282+ messages in thread
From: Thomas Garnier @ 2017-04-28 15:32 UTC (permalink / raw)
  To: Martin Schwidefsky, Heiko Carstens, Dave Hansen, Arnd Bergmann,
	Thomas Gleixner, David Howells, Thomas Garnier,
	René Nyffenegger, Andrew Morton, Paul E . McKenney,
	Ingo Molnar, Eric W . Biederman, Oleg Nesterov, Pavel Tikhomirov,
	Ingo Molnar, H . Peter Anvin, Andy Lutomirski, Paolo Bonzini,
	Rik van Riel, Kees Cook, Josh Poimboeuf, Borislav Petkov,
	Brian Gerst, Kirill A . Shutemov, Christian Borntraeger,
	Russell King, Will Deacon, Catalin Marinas, Mark Rutland,
	James Morse
  Cc: linux-s390, linux-kernel, linux-api, x86, linux-arm-kernel,
	kernel-hardening

Ensure that a syscall does not return to user-mode with a kernel address
limit. If that happens, a process can corrupt kernel-mode memory and
elevate privileges [1].

The CONFIG_ADDR_LIMIT_CHECK option disables the generic check so each
architecture can create optimized versions. This option is enabled by
default on s390 because a similar feature already exists.

[1] https://bugs.chromium.org/p/project-zero/issues/detail?id=990

Signed-off-by: Thomas Garnier <thgarnie@google.com>
Tested-by: Kees Cook <keescook@chromium.org>
---
Based on next-20170426
---
 arch/s390/Kconfig        |  1 +
 include/linux/syscalls.h | 27 ++++++++++++++++++++++++++-
 init/Kconfig             |  6 ++++++
 kernel/sys.c             | 13 +++++++++++++
 4 files changed, 46 insertions(+), 1 deletion(-)

diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
index d25435d94b6e..3d2ec084d5fc 100644
--- a/arch/s390/Kconfig
+++ b/arch/s390/Kconfig
@@ -64,6 +64,7 @@ config ARCH_SUPPORTS_UPROBES
 
 config S390
 	def_bool y
+	select ADDR_LIMIT_CHECK
 	select ARCH_HAS_DEVMEM_IS_ALLOWED
 	select ARCH_HAS_ELF_RANDOMIZE
 	select ARCH_HAS_GCOV_PROFILE_ALL
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 980c3c9b06f8..e534b93ce43a 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -191,6 +191,28 @@ extern struct trace_event_functions exit_syscall_print_funcs;
 	SYSCALL_METADATA(sname, x, __VA_ARGS__)			\
 	__SYSCALL_DEFINEx(x, sname, __VA_ARGS__)
 
+
+/*
+ * Called before coming back to user-mode. Returning to user-mode with an
+ * address limit different than USER_DS can allow to overwrite kernel memory.
+ */
+static inline void addr_limit_check_syscall(void)
+{
+	BUG_ON(!segment_eq(get_fs(), USER_DS));
+}
+
+#ifndef CONFIG_ADDR_LIMIT_CHECK
+#define ADDR_LIMIT_CHECK_PRE() \
+	bool user_caller = segment_eq(get_fs(), USER_DS)
+#define ADDR_LIMIT_CHECK_POST() \
+	if (user_caller) addr_limit_check_syscall()
+#else
+#define ADDR_LIMIT_CHECK_PRE()
+#define ADDR_LIMIT_CHECK_POST()
+asmlinkage void addr_limit_check_failed(void) __noreturn;
+#endif
+
+
 #define __PROTECT(...) asmlinkage_protect(__VA_ARGS__)
 #define __SYSCALL_DEFINEx(x, name, ...)					\
 	asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))	\
@@ -199,7 +221,10 @@ extern struct trace_event_functions exit_syscall_print_funcs;
 	asmlinkage long SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__));	\
 	asmlinkage long SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__))	\
 	{								\
-		long ret = SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__));	\
+		long ret;						\
+		ADDR_LIMIT_CHECK_PRE();					\
+		ret = SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__));	\
+		ADDR_LIMIT_CHECK_POST();				\
 		__MAP(x,__SC_TEST,__VA_ARGS__);				\
 		__PROTECT(x, ret,__MAP(x,__SC_ARGS,__VA_ARGS__));	\
 		return ret;						\
diff --git a/init/Kconfig b/init/Kconfig
index 42a346b0df43..599d9fe30703 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -1961,6 +1961,12 @@ config PROFILING
 config TRACEPOINTS
 	bool
 
+config ADDR_LIMIT_CHECK
+	bool
+	help
+	  Disable the generic address limit check. Allow each architecture to
+	  optimize how and when the verification is done.
+
 source "arch/Kconfig"
 
 endmenu		# General setup
diff --git a/kernel/sys.c b/kernel/sys.c
index 8a94b4eabcaa..a1cbcd715d62 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -2458,3 +2458,16 @@ COMPAT_SYSCALL_DEFINE1(sysinfo, struct compat_sysinfo __user *, info)
 	return 0;
 }
 #endif /* CONFIG_COMPAT */
+
+#ifdef CONFIG_ADDR_LIMIT_CHECK
+/*
+ * Used when an architecture specific implementation detects an invalid address
+ * limit. This function does not return.
+ */
+asmlinkage void addr_limit_check_failed(void)
+{
+	/* Try to fail on the generic address limit check */
+	addr_limit_check_syscall();
+	panic("Invalid address limit before returning to user-mode");
+}
+#endif
-- 
2.13.0.rc0.306.g87b477812d-goog

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

end of thread, other threads:[~2017-05-13  7:22 UTC | newest]

Thread overview: 282+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-04-28 15:32 [PATCH v9 1/4] syscalls: Verify address limit before returning to user-mode Thomas Garnier
2017-04-28 15:32 ` Thomas Garnier
2017-04-28 15:32 ` Thomas Garnier
2017-04-28 15:32 ` [kernel-hardening] " Thomas Garnier
2017-04-28 15:32 ` [PATCH v9 2/4] x86/syscalls: Optimize address limit check Thomas Garnier
2017-04-28 15:32   ` Thomas Garnier
2017-04-28 15:32   ` Thomas Garnier
2017-04-28 15:32   ` [kernel-hardening] " Thomas Garnier
2017-04-28 15:32 ` [PATCH v9 3/4] arm/syscalls: " Thomas Garnier
2017-04-28 15:32   ` Thomas Garnier
2017-04-28 15:32   ` Thomas Garnier
2017-04-28 15:32   ` [kernel-hardening] " Thomas Garnier
2017-04-28 15:32 ` [PATCH v9 4/4] arm64/syscalls: " Thomas Garnier
2017-04-28 15:32   ` Thomas Garnier
2017-04-28 15:32   ` Thomas Garnier
2017-04-28 15:32   ` [kernel-hardening] " Thomas Garnier
2017-05-05 22:18 ` [PATCH v9 1/4] syscalls: Verify address limit before returning to user-mode Thomas Garnier
2017-05-05 22:18   ` Thomas Garnier
2017-05-05 22:18   ` Thomas Garnier
2017-05-05 22:18   ` [kernel-hardening] " Thomas Garnier
2017-05-08  7:33   ` Ingo Molnar
2017-05-08  7:33     ` Ingo Molnar
2017-05-08  7:33     ` Ingo Molnar
2017-05-08  7:33     ` [kernel-hardening] " Ingo Molnar
2017-05-08  7:52     ` Ingo Molnar
2017-05-08  7:52       ` [kernel-hardening] " Ingo Molnar
2017-05-08  7:52       ` Ingo Molnar
2017-05-08  7:52       ` Ingo Molnar
2017-05-08  7:52       ` [kernel-hardening] " Ingo Molnar
2017-05-08 15:22       ` Daniel Micay
2017-05-08 15:22         ` Daniel Micay
2017-05-08 15:22         ` Daniel Micay
2017-05-08 15:26         ` Kees Cook
2017-05-08 15:26           ` Kees Cook
2017-05-08 15:26           ` Kees Cook
2017-05-08 19:51           ` Thomas Garnier
2017-05-08 19:51             ` Thomas Garnier
2017-05-08 19:51             ` Thomas Garnier
2017-05-09  6:56           ` Ingo Molnar
2017-05-09  6:56             ` Ingo Molnar
2017-05-09  6:56             ` Ingo Molnar
2017-05-09 11:10             ` Greg KH
2017-05-09 11:10               ` Greg KH
2017-05-09 11:10               ` Greg KH
2017-05-09 14:29               ` Thomas Garnier
2017-05-09 14:29                 ` Thomas Garnier
2017-05-09 14:29                 ` Thomas Garnier
2017-05-11 23:17                 ` Thomas Garnier
2017-05-11 23:17                   ` Thomas Garnier
2017-05-11 23:17                   ` Thomas Garnier
2017-05-11 23:44                   ` Linus Torvalds
2017-05-11 23:44                     ` Linus Torvalds
2017-05-11 23:44                     ` Linus Torvalds
2017-05-12  5:28                     ` Martin Schwidefsky
2017-05-12  5:28                       ` Martin Schwidefsky
2017-05-12  5:28                       ` Martin Schwidefsky
2017-05-12  5:34                       ` Kees Cook
2017-05-12  5:34                         ` Kees Cook
2017-05-12  5:34                         ` Kees Cook
2017-05-12  5:54                         ` Martin Schwidefsky
2017-05-12  5:54                           ` Martin Schwidefsky
2017-05-12  5:54                           ` Martin Schwidefsky
2017-05-12 19:01                           ` Kees Cook
2017-05-12 19:01                             ` Kees Cook
2017-05-12 19:01                             ` Kees Cook
2017-05-12 19:08                             ` Russell King - ARM Linux
2017-05-12 19:08                               ` Russell King - ARM Linux
2017-05-12 19:08                               ` Russell King - ARM Linux
2017-05-12 19:08                             ` Linus Torvalds
2017-05-12 19:08                               ` Linus Torvalds
2017-05-12 19:08                               ` Linus Torvalds
2017-05-12 19:30                               ` Kees Cook
2017-05-12 19:30                                 ` Kees Cook
2017-05-12 19:30                                 ` Kees Cook
2017-05-12 20:21                                 ` Russell King - ARM Linux
2017-05-12 20:21                                   ` Russell King - ARM Linux
2017-05-12 20:21                                   ` Russell King - ARM Linux
2017-05-12 20:30                                   ` Peter Zijlstra
2017-05-12 20:30                                     ` Peter Zijlstra
2017-05-12 20:30                                     ` Peter Zijlstra
2017-05-12 20:45                                     ` Russell King - ARM Linux
2017-05-12 20:45                                       ` Russell King - ARM Linux
2017-05-12 20:45                                       ` Russell King - ARM Linux
2017-05-12 21:00                                       ` Kees Cook
2017-05-12 21:00                                         ` Kees Cook
2017-05-12 21:00                                         ` Kees Cook
2017-05-12 21:04                                         ` Kees Cook
2017-05-12 21:04                                           ` Kees Cook
2017-05-12 21:04                                           ` Kees Cook
2017-05-13  7:21                                     ` Christoph Hellwig
2017-05-13  7:21                                       ` Christoph Hellwig
2017-05-13  7:21                                       ` Christoph Hellwig
2017-05-12 21:06                                   ` Al Viro
2017-05-12 21:06                                     ` Al Viro
2017-05-12 21:06                                     ` Al Viro
2017-05-12 21:16                                     ` [kernel-hardening] " Daniel Micay
2017-05-12 21:16                                       ` Daniel Micay
2017-05-12 21:16                                       ` Daniel Micay
2017-05-12 21:17                                     ` Kees Cook
2017-05-12 21:17                                       ` Kees Cook
2017-05-12 21:17                                       ` Kees Cook
2017-05-12 21:23                                       ` Daniel Micay
2017-05-12 21:23                                         ` Daniel Micay
2017-05-12 21:23                                         ` Daniel Micay
2017-05-12 21:41                                       ` Al Viro
2017-05-12 21:41                                         ` Al Viro
2017-05-12 21:41                                         ` Al Viro
2017-05-12 21:47                                         ` Rik van Riel
2017-05-12 21:47                                           ` Rik van Riel
2017-05-12 21:47                                           ` Rik van Riel
2017-05-12 22:57                                           ` Al Viro
2017-05-12 22:57                                             ` Al Viro
2017-05-12 22:57                                             ` Al Viro
2017-05-12 21:50                                         ` Kees Cook
2017-05-12 21:50                                           ` Kees Cook
2017-05-12 21:50                                           ` Kees Cook
2017-05-12  6:57                         ` Ingo Molnar
2017-05-12  6:57                           ` Ingo Molnar
2017-05-12  6:57                           ` Ingo Molnar
2017-05-12  6:13                     ` Andy Lutomirski
2017-05-12  6:13                       ` Andy Lutomirski
2017-05-12  6:13                       ` Andy Lutomirski
2017-05-12  6:58                     ` Ingo Molnar
2017-05-12  6:58                       ` Ingo Molnar
2017-05-12  6:58                       ` Ingo Molnar
2017-05-12 17:05                       ` Thomas Garnier
2017-05-12 17:05                         ` Thomas Garnier
2017-05-12 17:05                         ` Thomas Garnier
2017-05-09 16:30             ` [kernel-hardening] " Kees Cook
2017-05-09 16:30               ` Kees Cook
2017-05-09 16:30               ` Kees Cook
2017-05-08 12:46     ` Greg KH
2017-05-08 12:46       ` Greg KH
2017-05-08 12:46       ` Greg KH
2017-05-09  6:45       ` Ingo Molnar
2017-05-09  6:45         ` Ingo Molnar
2017-05-09  6:45         ` Ingo Molnar
2017-05-09  8:56         ` Christoph Hellwig
2017-05-09  8:56           ` Christoph Hellwig
2017-05-09  8:56           ` Christoph Hellwig
2017-05-09 13:00           ` Andy Lutomirski
2017-05-09 13:00             ` Andy Lutomirski
2017-05-09 13:00             ` Andy Lutomirski
2017-05-09 13:02             ` [kernel-hardening] " Christoph Hellwig
2017-05-09 13:02               ` Christoph Hellwig
2017-05-09 13:02               ` Christoph Hellwig
2017-05-09 16:03               ` Christoph Hellwig
2017-05-09 16:03                 ` Christoph Hellwig
2017-05-09 16:03                 ` Christoph Hellwig
2017-05-09 16:50                 ` Kees Cook
2017-05-09 16:50                   ` Kees Cook
2017-05-09 16:50                   ` Kees Cook
2017-05-09 22:52                   ` Andy Lutomirski
2017-05-09 22:52                     ` Andy Lutomirski
2017-05-09 22:52                     ` Andy Lutomirski
2017-05-09 23:31                     ` Kees Cook
2017-05-09 23:31                       ` Kees Cook
2017-05-09 23:31                       ` Kees Cook
2017-05-10  1:59                       ` Andy Lutomirski
2017-05-10  1:59                         ` Andy Lutomirski
2017-05-10  1:59                         ` Andy Lutomirski
2017-05-10  7:15                       ` Christoph Hellwig
2017-05-10  7:15                         ` Christoph Hellwig
2017-05-10  7:15                         ` Christoph Hellwig
2017-05-11 11:22                       ` Borislav Petkov
2017-05-11 11:22                         ` Borislav Petkov
2017-05-11 11:22                         ` Borislav Petkov
2017-05-10  6:46                   ` Christoph Hellwig
2017-05-10  6:46                     ` Christoph Hellwig
2017-05-10  6:46                     ` Christoph Hellwig
2017-05-10  2:11                 ` Al Viro
2017-05-10  2:11                   ` Al Viro
2017-05-10  2:11                   ` Al Viro
2017-05-10  2:45                   ` Al Viro
2017-05-10  2:45                     ` Al Viro
2017-05-10  2:45                     ` Al Viro
2017-05-10  3:12                     ` Al Viro
2017-05-10  3:12                       ` Al Viro
2017-05-10  3:12                       ` Al Viro
2017-05-10  3:21                       ` Al Viro
2017-05-10  3:21                         ` Al Viro
2017-05-10  3:21                         ` Al Viro
2017-05-10  3:39                         ` Al Viro
2017-05-10  3:39                           ` Al Viro
2017-05-10  3:39                           ` Al Viro
2017-05-10  6:54                           ` Christoph Hellwig
2017-05-10  6:54                             ` Christoph Hellwig
2017-05-10  6:54                             ` Christoph Hellwig
2017-05-10  6:53                       ` Christoph Hellwig
2017-05-10  6:53                         ` Christoph Hellwig
2017-05-10  6:53                         ` Christoph Hellwig
2017-05-10  7:27                         ` Al Viro
2017-05-10  7:27                           ` Al Viro
2017-05-10  7:27                           ` Al Viro
2017-05-10  7:35                           ` Christoph Hellwig
2017-05-10  7:35                             ` Christoph Hellwig
2017-05-10  7:35                             ` Christoph Hellwig
2017-05-10  6:49                     ` Christoph Hellwig
2017-05-10  6:49                       ` Christoph Hellwig
2017-05-10  6:49                       ` Christoph Hellwig
2017-05-10  7:28                 ` Arnd Bergmann
2017-05-10  7:28                   ` Arnd Bergmann
2017-05-10  7:28                   ` Arnd Bergmann
2017-05-10  7:35                   ` Christoph Hellwig
2017-05-10  7:35                     ` Christoph Hellwig
2017-05-10  7:35                     ` Christoph Hellwig
2017-05-09 16:05             ` Brian Gerst
2017-05-09 16:05               ` Brian Gerst
2017-05-09 16:05               ` Brian Gerst
2017-05-10  7:37             ` [kernel-hardening] " Arnd Bergmann
2017-05-10  7:37               ` Arnd Bergmann
2017-05-10  7:37               ` Arnd Bergmann
2017-05-10  8:08               ` Al Viro
2017-05-10  8:08                 ` Al Viro
2017-05-10  8:08                 ` Al Viro
2017-05-10  8:14                 ` Christoph Hellwig
2017-05-10  8:14                   ` Christoph Hellwig
2017-05-10  8:14                   ` Christoph Hellwig
2017-05-11  0:18                   ` Andy Lutomirski
2017-05-11  0:18                     ` Andy Lutomirski
2017-05-11  0:18                     ` Andy Lutomirski
2017-05-12  7:00             ` Ingo Molnar
2017-05-12  7:00               ` Ingo Molnar
2017-05-12  7:00               ` Ingo Molnar
2017-05-12  7:15               ` Al Viro
2017-05-12  7:15                 ` Al Viro
2017-05-12  7:15                 ` Al Viro
2017-05-12  7:35                 ` Christoph Hellwig
2017-05-12  7:35                   ` Christoph Hellwig
2017-05-12  7:35                   ` Christoph Hellwig
2017-05-12  8:07                   ` Christoph Hellwig
2017-05-12  8:07                     ` Christoph Hellwig
2017-05-12  8:07                     ` Christoph Hellwig
2017-05-12  8:23                     ` Greg KH
2017-05-12  8:23                       ` Greg KH
2017-05-12  8:23                       ` Greg KH
2017-05-12  7:43                 ` [kernel-hardening] " Arnd Bergmann
2017-05-12  7:43                   ` Arnd Bergmann
2017-05-12  7:43                   ` Arnd Bergmann
2017-05-12  8:11                   ` Christoph Hellwig
2017-05-12  8:11                     ` Christoph Hellwig
2017-05-12  8:11                     ` Christoph Hellwig
2017-05-12  8:16                     ` Al Viro
2017-05-12  8:16                       ` Al Viro
2017-05-12  8:16                       ` Al Viro
2017-05-12  8:11                   ` Al Viro
2017-05-12  8:11                     ` Al Viro
2017-05-12  8:11                     ` Al Viro
2017-05-12  8:20                     ` Arnd Bergmann
2017-05-12  8:20                       ` Arnd Bergmann
2017-05-12  8:20                       ` Arnd Bergmann
2017-05-12 23:20                 ` Andy Lutomirski
2017-05-12 23:20                   ` Andy Lutomirski
2017-05-12 23:20                   ` Andy Lutomirski
2017-05-08 13:09     ` Kees Cook
2017-05-08 13:09       ` Kees Cook
2017-05-08 13:09       ` Kees Cook
2017-05-08 13:09       ` [kernel-hardening] " Kees Cook
2017-05-08 14:02       ` Ingo Molnar
2017-05-08 14:02         ` Ingo Molnar
2017-05-08 14:02         ` Ingo Molnar
2017-05-08 14:02         ` [kernel-hardening] " Ingo Molnar
2017-05-08 14:06         ` Jann Horn
2017-05-08 14:06           ` Jann Horn
2017-05-08 14:06           ` Jann Horn
2017-05-08 14:06           ` [kernel-hardening] " Jann Horn
2017-05-08 20:48           ` Al Viro
2017-05-08 20:48             ` Al Viro
2017-05-08 20:48             ` Al Viro
2017-05-08 20:48             ` [kernel-hardening] " Al Viro
2017-05-12 23:15             ` Andy Lutomirski
2017-05-12 23:15               ` Andy Lutomirski
2017-05-12 23:15               ` Andy Lutomirski
2017-05-12 23:15               ` [kernel-hardening] " Andy Lutomirski
2017-05-08 15:24         ` Kees Cook
2017-05-08 15:24           ` Kees Cook
2017-05-08 15:24           ` Kees Cook
2017-05-08 15:24           ` [kernel-hardening] " Kees Cook
2017-05-09  6:34           ` Ingo Molnar
2017-05-09  6:34             ` Ingo Molnar
2017-05-09  6:34             ` Ingo Molnar
2017-05-09  6:34             ` [kernel-hardening] " Ingo Molnar

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.