sched/fair: Don't free p->numa_faults with concurrent readers
authorJann Horn <jannh@google.com>
Tue, 16 Jul 2019 15:20:45 +0000 (17:20 +0200)
committerIngo Molnar <mingo@kernel.org>
Thu, 25 Jul 2019 13:37:04 +0000 (15:37 +0200)
commit16d51a590a8ce3befb1308e0e7ab77f3b661af33
treee147b1ad1061369a9fd8546aa18ef519474d2fc2
parent7b5cf701ea9c395c792e2a7e3b7caf4c68b87721
sched/fair: Don't free p->numa_faults with concurrent readers

When going through execve(), zero out the NUMA fault statistics instead of
freeing them.

During execve, the task is reachable through procfs and the scheduler. A
concurrent /proc/*/sched reader can read data from a freed ->numa_faults
allocation (confirmed by KASAN) and write it back to userspace.
I believe that it would also be possible for a use-after-free read to occur
through a race between a NUMA fault and execve(): task_numa_fault() can
lead to task_numa_compare(), which invokes task_weight() on the currently
running task of a different CPU.

Another way to fix this would be to make ->numa_faults RCU-managed or add
extra locking, but it seems easier to wipe the NUMA fault statistics on
execve.

Signed-off-by: Jann Horn <jannh@google.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Petr Mladek <pmladek@suse.com>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will@kernel.org>
Fixes: 82727018b0d3 ("sched/numa: Call task_numa_free() from do_execve()")
Link: https://lkml.kernel.org/r/20190716152047.14424-1-jannh@google.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
fs/exec.c
include/linux/sched/numa_balancing.h
kernel/fork.c
kernel/sched/fair.c