Sanitize 'move_pages()' permission checks
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. Change-Id: I033691ba22e3bd606e61e94d54c4f6def301b8a8 Reported-by: Otto Ebeling <otto.ebeling@iki.fi> Acked-by: Eric W. Biederman <ebiederm@xmission.com> Cc: Willy Tarreau <w@1wt.eu> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> [bwh: Backported to 3.16: adjust context] Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
This commit is contained in:
parent
7abc0b32da
commit
d284770333
|
@ -1424,7 +1424,7 @@ 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. Use the regular "ptrace_may_access()" checks.
|
* process. Use the regular "ptrace_may_access()" checks.
|
||||||
*/
|
*/
|
||||||
if (!ptrace_may_access(task, PTRACE_MODE_READ)) {
|
if (!ptrace_may_access(task, PTRACE_MODE_READ_REALCREDS)) {
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
err = -EPERM;
|
err = -EPERM;
|
||||||
goto out;
|
goto out;
|
||||||
|
|
Loading…
Reference in New Issue