From: Jinliang Zheng When reading /proc/[pid]/stat, do_task_stat() accesses task->real_parent without proper RCU protection, which leads: cpu 0 cpu 1 ----- ----- do_task_stat var = task->real_parent release_task call_rcu(delayed_put_task_struct) task_tgid_nr_ns(var) rcu_read_lock <--- Too late! task_pid_ptr <--- UAF! rcu_read_unlock This fix adds proper RCU protection similar to getppid() in kernel/sys.c which correctly uses rcu_dereference() when accessing current->real_parent. Fixes: 06fffb1267c9 ("do_task_stat: don't take rcu_read_lock()") Signed-off-by: Jinliang Zheng --- fs/proc/array.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fs/proc/array.c b/fs/proc/array.c index 42932f88141a..3c2eea2c551a 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -528,7 +528,9 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, } sid = task_session_nr_ns(task, ns); - ppid = task_tgid_nr_ns(task->real_parent, ns); + rcu_read_lock(); + ppid = task_tgid_nr_ns(rcu_dereference(task->real_parent), ns); + rcu_read_unlock(); pgid = task_pgrp_nr_ns(task, ns); unlock_task_sighand(task, &flags); -- 2.39.3