Commit 260de686 authored by Andy Whitcroft's avatar Andy Whitcroft Committed by Kleber Sacilotto de Souza

Revert "x86/mm: Only set IBPB when the new thread cannot ptrace current thread"

CVE-2017-5753 (revert embargoed)
CVE-2017-5715 (revert embargoed)

This reverts commit b0c3e8bd.
Signed-off-by: default avatarAndy Whitcroft <apw@canonical.com>
Signed-off-by: default avatarKleber Sacilotto de Souza <kleber.souza@canonical.com>
parent a6fa5ed0
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/cpu.h> #include <linux/cpu.h>
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/ptrace.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
#include <asm/mmu_context.h> #include <asm/mmu_context.h>
...@@ -141,9 +140,7 @@ void switch_mm(struct mm_struct *prev, struct mm_struct *next, ...@@ -141,9 +140,7 @@ void switch_mm(struct mm_struct *prev, struct mm_struct *next,
/* Stop flush ipis for the previous mm */ /* Stop flush ipis for the previous mm */
cpumask_clear_cpu(cpu, mm_cpumask(prev)); cpumask_clear_cpu(cpu, mm_cpumask(prev));
/* Null tsk means switching to kernel, so that's safe */ if (boot_cpu_has(X86_FEATURE_SPEC_CTRL))
if (boot_cpu_has(X86_FEATURE_SPEC_CTRL) && tsk &&
___ptrace_may_access(tsk, current, PTRACE_MODE_IBPB))
native_wrmsrl(MSR_IA32_PRED_CMD, FEATURE_SET_IBPB); native_wrmsrl(MSR_IA32_PRED_CMD, FEATURE_SET_IBPB);
/* Load per-mm CR4 state */ /* Load per-mm CR4 state */
......
...@@ -59,15 +59,12 @@ extern void exit_ptrace(struct task_struct *tracer, struct list_head *dead); ...@@ -59,15 +59,12 @@ extern void exit_ptrace(struct task_struct *tracer, struct list_head *dead);
#define PTRACE_MODE_NOAUDIT 0x04 #define PTRACE_MODE_NOAUDIT 0x04
#define PTRACE_MODE_FSCREDS 0x08 #define PTRACE_MODE_FSCREDS 0x08
#define PTRACE_MODE_REALCREDS 0x10 #define PTRACE_MODE_REALCREDS 0x10
#define PTRACE_MODE_NOACCESS_CHK 0x20
/* shorthands for READ/ATTACH and FSCREDS/REALCREDS combinations */ /* shorthands for READ/ATTACH and FSCREDS/REALCREDS combinations */
#define PTRACE_MODE_READ_FSCREDS (PTRACE_MODE_READ | PTRACE_MODE_FSCREDS) #define PTRACE_MODE_READ_FSCREDS (PTRACE_MODE_READ | PTRACE_MODE_FSCREDS)
#define PTRACE_MODE_READ_REALCREDS (PTRACE_MODE_READ | PTRACE_MODE_REALCREDS) #define PTRACE_MODE_READ_REALCREDS (PTRACE_MODE_READ | PTRACE_MODE_REALCREDS)
#define PTRACE_MODE_ATTACH_FSCREDS (PTRACE_MODE_ATTACH | PTRACE_MODE_FSCREDS) #define PTRACE_MODE_ATTACH_FSCREDS (PTRACE_MODE_ATTACH | PTRACE_MODE_FSCREDS)
#define PTRACE_MODE_ATTACH_REALCREDS (PTRACE_MODE_ATTACH | PTRACE_MODE_REALCREDS) #define PTRACE_MODE_ATTACH_REALCREDS (PTRACE_MODE_ATTACH | PTRACE_MODE_REALCREDS)
#define PTRACE_MODE_IBPB (PTRACE_MODE_ATTACH | PTRACE_MODE_NOAUDIT \
| PTRACE_MODE_NOACCESS_CHK | PTRACE_MODE_REALCREDS)
/** /**
* ptrace_may_access - check whether the caller is permitted to access * ptrace_may_access - check whether the caller is permitted to access
...@@ -85,9 +82,6 @@ extern void exit_ptrace(struct task_struct *tracer, struct list_head *dead); ...@@ -85,9 +82,6 @@ extern void exit_ptrace(struct task_struct *tracer, struct list_head *dead);
*/ */
extern bool ptrace_may_access(struct task_struct *task, unsigned int mode); extern bool ptrace_may_access(struct task_struct *task, unsigned int mode);
extern int ___ptrace_may_access(struct task_struct *cur, struct task_struct *task,
unsigned int mode);
static inline int ptrace_reparented(struct task_struct *child) static inline int ptrace_reparented(struct task_struct *child)
{ {
return !same_thread_group(child->real_parent, child->parent); return !same_thread_group(child->real_parent, child->parent);
......
...@@ -235,10 +235,9 @@ static int ptrace_has_cap(struct user_namespace *ns, unsigned int mode) ...@@ -235,10 +235,9 @@ static int ptrace_has_cap(struct user_namespace *ns, unsigned int mode)
} }
/* Returns 0 on success, -errno on denial. */ /* Returns 0 on success, -errno on denial. */
int ___ptrace_may_access(struct task_struct *cur, struct task_struct *task, static int __ptrace_may_access(struct task_struct *task, unsigned int mode)
unsigned int mode)
{ {
const struct cred *cred = __task_cred(cur), *tcred; const struct cred *cred = current_cred(), *tcred;
struct mm_struct *mm; struct mm_struct *mm;
kuid_t caller_uid; kuid_t caller_uid;
kgid_t caller_gid; kgid_t caller_gid;
...@@ -258,7 +257,7 @@ int ___ptrace_may_access(struct task_struct *cur, struct task_struct *task, ...@@ -258,7 +257,7 @@ int ___ptrace_may_access(struct task_struct *cur, struct task_struct *task,
*/ */
/* Don't let security modules deny introspection */ /* Don't let security modules deny introspection */
if (same_thread_group(task, cur)) if (same_thread_group(task, current))
return 0; return 0;
rcu_read_lock(); rcu_read_lock();
if (mode & PTRACE_MODE_FSCREDS) { if (mode & PTRACE_MODE_FSCREDS) {
...@@ -296,16 +295,7 @@ int ___ptrace_may_access(struct task_struct *cur, struct task_struct *task, ...@@ -296,16 +295,7 @@ int ___ptrace_may_access(struct task_struct *cur, struct task_struct *task,
!ptrace_has_cap(mm->user_ns, mode))) !ptrace_has_cap(mm->user_ns, mode)))
return -EPERM; return -EPERM;
if (!(mode & PTRACE_MODE_NOACCESS_CHK)) return security_ptrace_access_check(task, mode);
return security_ptrace_access_check(task, mode);
return 0;
}
EXPORT_SYMBOL_GPL(___ptrace_may_access);
static int __ptrace_may_access(struct task_struct *task, unsigned int mode)
{
return ___ptrace_may_access(current, task, mode);
} }
bool ptrace_may_access(struct task_struct *task, unsigned int mode) bool ptrace_may_access(struct task_struct *task, unsigned int mode)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment