From: Greg Kroah-Hartman Date: Mon, 21 Aug 2017 00:29:01 +0000 (-0700) Subject: 4.12-stable patches X-Git-Tag: v3.18.67~11 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c70c55420c20a65ec08a8e0f2eec4b486f5eba1b;p=thirdparty%2Fkernel%2Fstable-queue.git 4.12-stable patches added patches: sanitize-move_pages-permission-checks.patch --- diff --git a/queue-4.12/sanitize-move_pages-permission-checks.patch b/queue-4.12/sanitize-move_pages-permission-checks.patch new file mode 100644 index 00000000000..e84a026a4c3 --- /dev/null +++ b/queue-4.12/sanitize-move_pages-permission-checks.patch @@ -0,0 +1,75 @@ +From 197e7e521384a23b9e585178f3f11c9fa08274b9 Mon Sep 17 00:00:00 2001 +From: Linus Torvalds +Date: Sun, 20 Aug 2017 13:26:27 -0700 +Subject: Sanitize 'move_pages()' permission checks + +From: Linus Torvalds + +commit 197e7e521384a23b9e585178f3f11c9fa08274b9 upstream. + +The 'move_paghes()' system call was introduced long long ago with the +same permission checks as for sending a signal (except using +CAP_SYS_NICE instead of CAP_SYS_KILL for the overriding capability). + +That turns out to not be a great choice - while the system call really +only moves physical page allocations around (and you need other +capabilities to do a lot of it), you can check the return value to map +out some the virtual address choices and defeat ASLR of a binary that +still shares your uid. + +So change the access checks to the more common 'ptrace_may_access()' +model instead. + +This tightens the access checks for the uid, and also effectively +changes the CAP_SYS_NICE check to CAP_SYS_PTRACE, but it's unlikely that +anybody really _uses_ this legacy system call any more (we hav ebetter +NUMA placement models these days), so I expect nobody to notice. + +Famous last words. + +Reported-by: Otto Ebeling +Acked-by: Eric W. Biederman +Cc: Willy Tarreau +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + mm/migrate.c | 13 ++++--------- + 1 file changed, 4 insertions(+), 9 deletions(-) + +--- a/mm/migrate.c ++++ b/mm/migrate.c +@@ -41,6 +41,7 @@ + #include + #include + #include ++#include + + #include + +@@ -1649,7 +1650,6 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, + const int __user *, nodes, + int __user *, status, int, flags) + { +- const struct cred *cred = current_cred(), *tcred; + struct task_struct *task; + struct mm_struct *mm; + int err; +@@ -1673,14 +1673,9 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, + + /* + * Check if this process has the right to modify the specified +- * process. The right exists if the process has administrative +- * capabilities, superuser privileges or the same +- * userid as the target process. +- */ +- tcred = __task_cred(task); +- if (!uid_eq(cred->euid, tcred->suid) && !uid_eq(cred->euid, tcred->uid) && +- !uid_eq(cred->uid, tcred->suid) && !uid_eq(cred->uid, tcred->uid) && +- !capable(CAP_SYS_NICE)) { ++ * process. Use the regular "ptrace_may_access()" checks. ++ */ ++ if (!ptrace_may_access(task, PTRACE_MODE_READ_REALCREDS)) { + rcu_read_unlock(); + err = -EPERM; + goto out; diff --git a/queue-4.12/series b/queue-4.12/series index 98106a6b550..de0373519d0 100644 --- a/queue-4.12/series +++ b/queue-4.12/series @@ -34,3 +34,4 @@ irqchip-atmel-aic-fix-unbalanced-refcount-in-aic_common_rtc_irq_fixup.patch genirq-restore-trigger-settings-in-irq_modify_status.patch genirq-ipi-fixup-checks-against-nr_cpu_ids.patch kernel-watchdog-prevent-false-positives-with-turbo-modes.patch +sanitize-move_pages-permission-checks.patch