From: tip-bot for Thomas Garnier <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: dave.hansen@intel.com, dhowells@redhat.com,
linux@armlinux.org.uk, hpa@zytor.com, pmladek@suse.com,
catalin.marinas@arm.com, tglx@linutronix.de, oleg@redhat.com,
pbonzini@redhat.com, mingo@kernel.org, cmetcalf@mellanox.com,
riel@redhat.com, will.deacon@arm.com, mbenes@suse.cz,
jpoimboe@redhat.com, thgarnie@google.com, luto@amacapital.net,
luto@kernel.org, wad@chromium.org, linux-kernel@vger.kernel.org,
mark.rutland@arm.com, arnd@arndb.de, keescook@chromium.org,
panand@redhat.com, viro@zeniv.linux.org.uk
Subject: [tip:x86/syscall] x86/syscalls: Check address limit on user-mode return
Date: Sat, 8 Jul 2017 05:09:53 -0700 [thread overview]
Message-ID: <tip-5ea0727b163cb5575e36397a12eade68a1f35f24@git.kernel.org> (raw)
In-Reply-To: <20170615011203.144108-1-thgarnie@google.com>
Commit-ID: 5ea0727b163cb5575e36397a12eade68a1f35f24
Gitweb: http://git.kernel.org/tip/5ea0727b163cb5575e36397a12eade68a1f35f24
Author: Thomas Garnier <thgarnie@google.com>
AuthorDate: Wed, 14 Jun 2017 18:12:01 -0700
Committer: Thomas Gleixner <tglx@linutronix.de>
CommitDate: Sat, 8 Jul 2017 14:05:32 +0200
x86/syscalls: Check address limit on user-mode return
Ensure the address limit is a user-mode segment before returning to
user-mode. Otherwise a process can corrupt kernel-mode memory and elevate
privileges [1].
The set_fs function sets the TIF_SETFS flag to force a slow path on
return. In the slow path, the address limit is checked to be USER_DS if
needed.
The addr_limit_user_check function is added as a cross-architecture
function to check the address limit.
[1] https://bugs.chromium.org/p/project-zero/issues/detail?id=990
Signed-off-by: Thomas Garnier <thgarnie@google.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: kernel-hardening@lists.openwall.com
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: David Howells <dhowells@redhat.com>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: Miroslav Benes <mbenes@suse.cz>
Cc: Chris Metcalf <cmetcalf@mellanox.com>
Cc: Pratyush Anand <panand@redhat.com>
Cc: Russell King <linux@armlinux.org.uk>
Cc: Petr Mladek <pmladek@suse.com>
Cc: Rik van Riel <riel@redhat.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: linux-arm-kernel@lists.infradead.org
Cc: Will Drewry <wad@chromium.org>
Cc: linux-api@vger.kernel.org
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Link: http://lkml.kernel.org/r/20170615011203.144108-1-thgarnie@google.com
---
arch/x86/entry/common.c | 3 +++
arch/x86/include/asm/thread_info.h | 5 ++++-
arch/x86/include/asm/uaccess.h | 7 ++++++-
include/linux/syscalls.h | 16 ++++++++++++++++
4 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/arch/x86/entry/common.c b/arch/x86/entry/common.c
index cdefcfd..03505ff 100644
--- a/arch/x86/entry/common.c
+++ b/arch/x86/entry/common.c
@@ -23,6 +23,7 @@
#include <linux/user-return-notifier.h>
#include <linux/uprobes.h>
#include <linux/livepatch.h>
+#include <linux/syscalls.h>
#include <asm/desc.h>
#include <asm/traps.h>
@@ -183,6 +184,8 @@ __visible inline void prepare_exit_to_usermode(struct pt_regs *regs)
struct thread_info *ti = current_thread_info();
u32 cached_flags;
+ addr_limit_user_check();
+
if (IS_ENABLED(CONFIG_PROVE_LOCKING) && WARN_ON(!irqs_disabled()))
local_irq_disable();
diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h
index e00e1bd..5161da1a 100644
--- a/arch/x86/include/asm/thread_info.h
+++ b/arch/x86/include/asm/thread_info.h
@@ -98,6 +98,7 @@ struct thread_info {
#define TIF_SYSCALL_TRACEPOINT 28 /* syscall tracepoint instrumentation */
#define TIF_ADDR32 29 /* 32-bit address space on 64 bits */
#define TIF_X32 30 /* 32-bit native x86-64 binary */
+#define TIF_FSCHECK 31 /* Check FS is USER_DS on return */
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
@@ -122,6 +123,7 @@ struct thread_info {
#define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT)
#define _TIF_ADDR32 (1 << TIF_ADDR32)
#define _TIF_X32 (1 << TIF_X32)
+#define _TIF_FSCHECK (1 << TIF_FSCHECK)
/*
* work to do in syscall_trace_enter(). Also includes TIF_NOHZ for
@@ -137,7 +139,8 @@ struct thread_info {
(_TIF_SYSCALL_TRACE | _TIF_NOTIFY_RESUME | _TIF_SIGPENDING | \
_TIF_NEED_RESCHED | _TIF_SINGLESTEP | _TIF_SYSCALL_EMU | \
_TIF_SYSCALL_AUDIT | _TIF_USER_RETURN_NOTIFY | _TIF_UPROBE | \
- _TIF_PATCH_PENDING | _TIF_NOHZ | _TIF_SYSCALL_TRACEPOINT)
+ _TIF_PATCH_PENDING | _TIF_NOHZ | _TIF_SYSCALL_TRACEPOINT | \
+ _TIF_FSCHECK)
/* flags to check in __switch_to() */
#define _TIF_WORK_CTXSW \
diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h
index a059aac..11433f9 100644
--- a/arch/x86/include/asm/uaccess.h
+++ b/arch/x86/include/asm/uaccess.h
@@ -26,7 +26,12 @@
#define get_ds() (KERNEL_DS)
#define get_fs() (current->thread.addr_limit)
-#define set_fs(x) (current->thread.addr_limit = (x))
+static inline void set_fs(mm_segment_t fs)
+{
+ current->thread.addr_limit = fs;
+ /* On user-mode return, check fs is correct */
+ set_thread_flag(TIF_FSCHECK);
+}
#define segment_eq(a, b) ((a).seg == (b).seg)
diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
index 980c3c9..ac0cf6f 100644
--- a/include/linux/syscalls.h
+++ b/include/linux/syscalls.h
@@ -206,6 +206,22 @@ extern struct trace_event_functions exit_syscall_print_funcs;
} \
static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))
+#ifdef TIF_FSCHECK
+/*
+ * 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_user_check(void)
+{
+
+ if (!test_thread_flag(TIF_FSCHECK))
+ return;
+
+ BUG_ON(!segment_eq(get_fs(), USER_DS));
+ clear_thread_flag(TIF_FSCHECK);
+}
+#endif
+
asmlinkage long sys32_quotactl(unsigned int cmd, const char __user *special,
qid_t id, void __user *addr);
asmlinkage long sys_time(time_t __user *tloc);
prev parent reply other threads:[~2017-07-08 12:16 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-15 1:12 [kernel-hardening] [PATCH v10 1/3] x86/syscalls: Check address limit on user-mode return Thomas Garnier
2017-06-15 1:12 ` Thomas Garnier
2017-06-15 1:12 ` Thomas Garnier
2017-06-15 1:12 ` [kernel-hardening] [PATCH v10 2/3] arm/syscalls: " Thomas Garnier
2017-06-15 1:12 ` Thomas Garnier
2017-06-15 1:12 ` Thomas Garnier
2017-06-20 20:18 ` [kernel-hardening] " Kees Cook
2017-06-20 20:18 ` Kees Cook
2017-06-20 20:18 ` Kees Cook
2017-06-20 20:18 ` Kees Cook
2017-06-20 20:31 ` [kernel-hardening] " Thomas Garnier
2017-06-20 20:31 ` Thomas Garnier
2017-06-20 20:31 ` Thomas Garnier
2017-06-20 20:31 ` Thomas Garnier
2017-06-21 9:08 ` [kernel-hardening] " Will Deacon
2017-06-21 9:08 ` Will Deacon
2017-06-21 9:08 ` Will Deacon
2017-06-21 9:08 ` Will Deacon
2017-07-08 12:10 ` [tip:x86/syscall] " tip-bot for Thomas Garnier
2017-07-18 14:36 ` [kernel-hardening] Re: [PATCH v10 2/3] " Leonard Crestez
2017-07-18 14:36 ` Leonard Crestez
2017-07-18 14:36 ` Leonard Crestez
2017-07-18 14:36 ` Leonard Crestez
2017-07-18 16:04 ` [kernel-hardening] " Thomas Garnier
2017-07-18 16:04 ` Thomas Garnier
2017-07-18 16:04 ` Thomas Garnier
2017-07-18 16:04 ` Thomas Garnier
2017-07-18 17:18 ` [kernel-hardening] " Leonard Crestez
2017-07-18 17:18 ` Leonard Crestez
2017-07-18 17:18 ` Leonard Crestez
2017-07-18 17:18 ` Leonard Crestez
2017-07-18 19:04 ` [kernel-hardening] " Thomas Garnier
2017-07-18 19:04 ` Thomas Garnier
2017-07-18 19:04 ` Thomas Garnier
2017-07-18 19:04 ` Thomas Garnier
2017-07-19 14:58 ` [kernel-hardening] " Leonard Crestez
2017-07-19 14:58 ` Leonard Crestez
2017-07-19 14:58 ` Leonard Crestez
2017-07-19 14:58 ` Leonard Crestez
2017-07-19 16:51 ` [kernel-hardening] " Thomas Garnier
2017-07-19 16:51 ` Thomas Garnier
2017-07-19 16:51 ` Thomas Garnier
2017-07-19 16:51 ` Thomas Garnier
2017-07-19 17:06 ` [kernel-hardening] " Russell King - ARM Linux
2017-07-19 17:06 ` Russell King - ARM Linux
2017-07-19 17:06 ` Russell King - ARM Linux
2017-07-19 17:06 ` Russell King - ARM Linux
2017-07-19 17:20 ` [kernel-hardening] " Thomas Garnier
2017-07-19 17:20 ` Thomas Garnier
2017-07-19 17:20 ` Thomas Garnier
2017-07-19 18:35 ` Russell King - ARM Linux
2017-07-19 18:35 ` Russell King - ARM Linux
2017-07-19 18:35 ` Russell King - ARM Linux
2017-07-19 18:50 ` Thomas Garnier
2017-07-19 18:50 ` Thomas Garnier
2017-07-19 18:50 ` Thomas Garnier
2017-06-15 1:12 ` [kernel-hardening] [PATCH v10 3/3] arm64/syscalls: " Thomas Garnier
2017-06-15 1:12 ` Thomas Garnier
2017-06-15 1:12 ` Thomas Garnier
2017-06-21 8:16 ` [kernel-hardening] " Catalin Marinas
2017-06-21 8:16 ` Catalin Marinas
2017-06-21 8:16 ` Catalin Marinas
2017-06-21 8:16 ` Catalin Marinas
2017-06-21 13:57 ` [kernel-hardening] " Thomas Garnier
2017-06-21 13:57 ` Thomas Garnier
2017-06-21 13:57 ` Thomas Garnier
2017-06-21 13:57 ` Thomas Garnier
2017-07-08 12:10 ` [tip:x86/syscall] " tip-bot for Thomas Garnier
2017-06-20 20:24 ` [kernel-hardening] Re: [PATCH v10 1/3] x86/syscalls: " Kees Cook
2017-06-20 20:24 ` Kees Cook
2017-06-20 20:24 ` Kees Cook
2017-06-20 20:24 ` Kees Cook
2017-06-28 17:52 ` [kernel-hardening] " Kees Cook
2017-06-28 17:52 ` Kees Cook
2017-06-28 17:52 ` Kees Cook
2017-06-28 17:52 ` Kees Cook
2017-07-06 20:38 ` [kernel-hardening] " Thomas Garnier
2017-07-06 20:38 ` Thomas Garnier
2017-07-06 20:38 ` Thomas Garnier
2017-07-06 20:38 ` Thomas Garnier
2017-07-06 20:48 ` [kernel-hardening] " Thomas Gleixner
2017-07-06 20:48 ` Thomas Gleixner
2017-07-06 20:48 ` Thomas Gleixner
2017-07-06 20:48 ` Thomas Gleixner
2017-07-06 20:52 ` [kernel-hardening] " Thomas Garnier
2017-07-06 20:52 ` Thomas Garnier
2017-07-06 20:52 ` Thomas Garnier
2017-07-06 20:52 ` Thomas Garnier
2017-07-08 12:09 ` tip-bot for Thomas Garnier [this message]
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=tip-5ea0727b163cb5575e36397a12eade68a1f35f24@git.kernel.org \
--to=tipbot@zytor.com \
--cc=arnd@arndb.de \
--cc=catalin.marinas@arm.com \
--cc=cmetcalf@mellanox.com \
--cc=dave.hansen@intel.com \
--cc=dhowells@redhat.com \
--cc=hpa@zytor.com \
--cc=jpoimboe@redhat.com \
--cc=keescook@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=luto@amacapital.net \
--cc=luto@kernel.org \
--cc=mark.rutland@arm.com \
--cc=mbenes@suse.cz \
--cc=mingo@kernel.org \
--cc=oleg@redhat.com \
--cc=panand@redhat.com \
--cc=pbonzini@redhat.com \
--cc=pmladek@suse.com \
--cc=riel@redhat.com \
--cc=tglx@linutronix.de \
--cc=thgarnie@google.com \
--cc=viro@zeniv.linux.org.uk \
--cc=wad@chromium.org \
--cc=will.deacon@arm.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.