All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Garnier <thgarnie@google.com>
To: "Martin Schwidefsky" <schwidefsky@de.ibm.com>,
	"Heiko Carstens" <heiko.carstens@de.ibm.com>,
	"Dave Hansen" <dave.hansen@intel.com>,
	"Arnd Bergmann" <arnd@arndb.de>,
	"Thomas Gleixner" <tglx@linutronix.de>,
	"David Howells" <dhowells@redhat.com>,
	"Thomas Garnier" <thgarnie@google.com>,
	"René Nyffenegger" <mail@renenyffenegger.ch>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"Paul E . McKenney" <paulmck@linux.vnet.ibm.com>,
	"Ingo Molnar" <mingo@kernel.org>,
	"Eric W . Biederman" <ebiederm@xmission.com>,
	"Oleg Nesterov" <oleg@redhat.com>,
	"Pavel Tikhomirov" <ptikhomirov@virtuozzo.com>,
	"Ingo Molnar" <mingo@redhat.com>,
	"H . Peter Anvin" <hpa@zytor.com>,
	"Andy Lutomirski" <luto@kernel.org>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Rik van Riel" <riel@redhat.com>,
	"Kees Cook" <keescook@chromium.org>,
	"Josh Poimboeuf" <jpoimboe@redhat.com>,
	"Borislav Petkov" <bp@alien8.de>,
	"Brian Gerst" <brgerst@gmail.com>,
	"Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>,
	"Christian Borntraeger" <borntraeger@de.ibm.com>,
	"Russell King" <linux@armlinux.org.uk>,
	"Will Deacon" <will.deacon@arm.com>,
	"Catalin Marinas" <catalin.marinas@arm.com>,
	"Mark Rutland" <mark.rutland@arm.com>,
	"James Morse" <james.morse@arm.com>
Cc: linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-api@vger.kernel.org, x86@kernel.org,
	linux-arm-kernel@lists.infradead.org,
	kernel-hardening@lists.openwall.com
Subject: [PATCH v9 1/4] syscalls: Verify address limit before returning to user-mode
Date: Fri, 28 Apr 2017 08:32:10 -0700	[thread overview]
Message-ID: <20170428153213.137279-1-thgarnie@google.com> (raw)

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

WARNING: multiple messages have this Message-ID (diff)
From: Thomas Garnier <thgarnie@google.com>
To: "Martin Schwidefsky" <schwidefsky@de.ibm.com>,
	"Heiko Carstens" <heiko.carstens@de.ibm.com>,
	"Dave Hansen" <dave.hansen@intel.com>,
	"Arnd Bergmann" <arnd@arndb.de>,
	"Thomas Gleixner" <tglx@linutronix.de>,
	"David Howells" <dhowells@redhat.com>,
	"Thomas Garnier" <thgarnie@google.com>,
	"René Nyffenegger" <mail@renenyffenegger.ch>,
	"Andrew Morton" <akpm@linux-foundation.org>,
	"Paul E . McKenney" <paulmck@linux.vnet.ibm.com>,
	"Ingo Molnar" <mingo@kernel.org>,
	"Eric W . Biederman" <ebiederm@xmission.com>,
	"Oleg Nesterov" <oleg@redhat.com>,
	"Pavel Tikhomirov" <ptikhomirov@virtuozzo.com>,
	"Ingo Molnar" <mingo@redhat.com>,
	"H . Peter Anvin" <hpa@zytor.com>,
	"Andy Lutomirski" <luto@kernel.org>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Rik van Riel" <riel@redhat.com>,
	"Kees Cook" <keescook@chromium.org>,
	"Josh Poimboeuf" <jpoimboe@redhat.com>,
	"Borislav Petkov" <bp@alien8.de>,
	"Brian Gerst" <brgerst@gmail.com>,
	"Kirill A . Shutemov" <kirill.shutemov@linux.intel.com>,
	"Christian Borntraeger" <borntraeger@de.ibm.com>,
	"Russell King" <linux@armlinux.org.uk>,
	"Will Deacon" <will.deacon@arm.com>,
	"Catalin Marinas" <catalin.marinas@arm.com>,
	"Mark Rutland" <mark.rutland@arm.com>,
	"James Morse" <james.morse@arm.com>
Cc: linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-api@vger.kernel.org, x86@kernel.org,
	linux-arm-kernel@lists.infradead.org,
	kernel-hardening@lists.openwall.com
Subject: [kernel-hardening] [PATCH v9 1/4] syscalls: Verify address limit before returning to user-mode
Date: Fri, 28 Apr 2017 08:32:10 -0700	[thread overview]
Message-ID: <20170428153213.137279-1-thgarnie@google.com> (raw)

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

WARNING: multiple messages have this Message-ID (diff)
From: Thomas Garnier <thgarnie-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
To: "Martin Schwidefsky"
	<schwidefsky-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>,
	"Heiko Carstens"
	<heiko.carstens-tA70FqPdS9bQT0dZR+AlfA@public.gmane.org>,
	"Dave Hansen"
	<dave.hansen-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
	"Arnd Bergmann" <arnd-r2nGTMty4D4@public.gmane.org>,
	"Thomas Gleixner" <tglx-hfZtesqFncYOwBW4kG4KsQ@public.gmane.org>,
	"David Howells"
	<dhowells-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
	"Thomas Garnier"
	<thgarnie-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>,
	"René Nyffenegger"
	<mail-gLCNRsNSrVdVZEhyV+6z5nIPMjoJpjVV@public.gmane.org>,
	"Andrew Morton"
	<akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>,
	"Paul E . McKenney"
	<paulmck-23VcF4HTsmIX0ybBhKVfKdBPR1lH4CV8@public.gmane.org>,
	"Ingo Molnar" <mingo-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
	"Eric W . Biederman"
	<ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>,
	"Oleg Nesterov" <oleg-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
	"Pavel Tikhomirov"
	<ptikhomirov-5HdwGun5lf+gSpxsJD1C4w@public.gmane.org>,
	"Ingo Molnar" <mingo-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
	"H . Peter Anvin" <hpa-YMNOUZJC4hwAvxtiuMwx3w@public.gmane.org>,
	"Andy Lutomirski" <luto-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
	"Paolo Bonzini"
	<pbonzini-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
	"Rik van Riel" <riel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Cc: linux-s390-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	linux-api-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	x86-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
	kernel-hardening-ZwoEplunGu1jrUoiu81ncdBPR1lH4CV8@public.gmane.org
Subject: [PATCH v9 1/4] syscalls: Verify address limit before returning to user-mode
Date: Fri, 28 Apr 2017 08:32:10 -0700	[thread overview]
Message-ID: <20170428153213.137279-1-thgarnie@google.com> (raw)

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-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
Tested-by: Kees Cook <keescook-F7+t8E8rja9g9hUCZPvPmw@public.gmane.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

WARNING: multiple messages have this Message-ID (diff)
From: thgarnie@google.com (Thomas Garnier)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v9 1/4] syscalls: Verify address limit before returning to user-mode
Date: Fri, 28 Apr 2017 08:32:10 -0700	[thread overview]
Message-ID: <20170428153213.137279-1-thgarnie@google.com> (raw)

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

             reply	other threads:[~2017-04-28 15:32 UTC|newest]

Thread overview: 282+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-28 15:32 Thomas Garnier [this message]
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 ` [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

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=20170428153213.137279-1-thgarnie@google.com \
    --to=thgarnie@google.com \
    --cc=akpm@linux-foundation.org \
    --cc=arnd@arndb.de \
    --cc=borntraeger@de.ibm.com \
    --cc=bp@alien8.de \
    --cc=brgerst@gmail.com \
    --cc=catalin.marinas@arm.com \
    --cc=dave.hansen@intel.com \
    --cc=dhowells@redhat.com \
    --cc=ebiederm@xmission.com \
    --cc=heiko.carstens@de.ibm.com \
    --cc=hpa@zytor.com \
    --cc=james.morse@arm.com \
    --cc=jpoimboe@redhat.com \
    --cc=keescook@chromium.org \
    --cc=kernel-hardening@lists.openwall.com \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=linux@armlinux.org.uk \
    --cc=luto@kernel.org \
    --cc=mail@renenyffenegger.ch \
    --cc=mark.rutland@arm.com \
    --cc=mingo@kernel.org \
    --cc=mingo@redhat.com \
    --cc=oleg@redhat.com \
    --cc=paulmck@linux.vnet.ibm.com \
    --cc=pbonzini@redhat.com \
    --cc=ptikhomirov@virtuozzo.com \
    --cc=riel@redhat.com \
    --cc=schwidefsky@de.ibm.com \
    --cc=tglx@linutronix.de \
    --cc=will.deacon@arm.com \
    --cc=x86@kernel.org \
    /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.