mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
BACKPORT: Sanitize 'move_pages()' permission checks
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 <otto.ebeling@iki.fi> Acked-by: Eric W. Biederman <ebiederm@xmission.com> Cc: Willy Tarreau <w@1wt.eu> Cc: stable@kernel.org Bug: 65468230 Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> cherry-picked from: 197e7e521384a23b9e585178f3f11c9fa08274b9 This branch does not have the PTRACE_MODE_REALCREDS flag but its default behavior is the same as PTRACE_MODE_REALCREDS. So use PTRACE_MODE_READ instead of PTRACE_MODE_READ_REALCREDS. Change-Id: I75364561d91155c01f78dd62cdd41c5f0f418854
This commit is contained in:
parent
064762f51a
commit
1ceefbf411
1 changed files with 3 additions and 8 deletions
11
mm/migrate.c
11
mm/migrate.c
|
@ -35,6 +35,7 @@
|
||||||
#include <linux/syscalls.h>
|
#include <linux/syscalls.h>
|
||||||
#include <linux/hugetlb.h>
|
#include <linux/hugetlb.h>
|
||||||
#include <linux/gfp.h>
|
#include <linux/gfp.h>
|
||||||
|
#include <linux/ptrace.h>
|
||||||
|
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
|
|
||||||
|
@ -1372,7 +1373,6 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages,
|
||||||
const int __user *, nodes,
|
const int __user *, nodes,
|
||||||
int __user *, status, int, flags)
|
int __user *, status, int, flags)
|
||||||
{
|
{
|
||||||
const struct cred *cred = current_cred(), *tcred;
|
|
||||||
struct task_struct *task;
|
struct task_struct *task;
|
||||||
struct mm_struct *mm;
|
struct mm_struct *mm;
|
||||||
int err;
|
int err;
|
||||||
|
@ -1396,14 +1396,9 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if this process has the right to modify the specified
|
* Check if this process has the right to modify the specified
|
||||||
* process. The right exists if the process has administrative
|
* process. Use the regular "ptrace_may_access()" checks.
|
||||||
* capabilities, superuser privileges or the same
|
|
||||||
* userid as the target process.
|
|
||||||
*/
|
*/
|
||||||
tcred = __task_cred(task);
|
if (!ptrace_may_access(task, PTRACE_MODE_READ)) {
|
||||||
if (cred->euid != tcred->suid && cred->euid != tcred->uid &&
|
|
||||||
cred->uid != tcred->suid && cred->uid != tcred->uid &&
|
|
||||||
!capable(CAP_SYS_NICE)) {
|
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
err = -EPERM;
|
err = -EPERM;
|
||||||
goto out;
|
goto out;
|
||||||
|
|
Loading…
Reference in a new issue