From: Greg Kroah-Hartman Date: Mon, 21 Aug 2017 00:29:07 +0000 (-0700) Subject: 4.4-stable patches X-Git-Tag: v3.18.67~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a0d27d643cb5c421138af6bbe82254e1a1e6ff1f;p=thirdparty%2Fkernel%2Fstable-queue.git 4.4-stable patches added patches: sanitize-move_pages-permission-checks.patch --- diff --git a/queue-4.4/sanitize-move_pages-permission-checks.patch b/queue-4.4/sanitize-move_pages-permission-checks.patch new file mode 100644 index 00000000000..0545856a28c --- /dev/null +++ b/queue-4.4/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 +@@ -38,6 +38,7 @@ + #include + #include + #include ++#include + + #include + +@@ -1483,7 +1484,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; +@@ -1507,14 +1507,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.4/series b/queue-4.4/series index fe1f1bc39bf..8bc07c8f73e 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -13,3 +13,4 @@ xen-fix-bio-vec-merging.patch x86-asm-64-clear-ac-on-nmi-entries.patch irqchip-atmel-aic-fix-unbalanced-of_node_put-in-aic_common_irq_fixup.patch irqchip-atmel-aic-fix-unbalanced-refcount-in-aic_common_rtc_irq_fixup.patch +sanitize-move_pages-permission-checks.patch