Reporting these fields on a non-current task is dangerous. If the task is in any state other than normal kernel code, they may contain garbage or even kernel addresses on some architectures. (x86_64 used to do this. I bet lots of architectures still do.) With CONFIG_THREAD_INFO_IN_TASK, it can OOPS, too.
As far as I know, there are no use programs that make any material use of these fields, so just get rid of them. Cc: Tetsuo Handa <penguin-ker...@i-love.sakura.ne.jp> Cc: Tycho Andersen <tycho.ander...@canonical.com> Cc: Kees Cook <keesc...@chromium.org> Reported-by: Jann Horn <j...@thejh.net> Signed-off-by: Andy Lutomirski <l...@kernel.org> --- fs/proc/array.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/fs/proc/array.c b/fs/proc/array.c index 88c7de12197b..1bb1097e73b7 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -417,10 +417,11 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns, mm = get_task_mm(task); if (mm) { vsize = task_vsize(mm); - if (permitted) { - eip = KSTK_EIP(task); - esp = KSTK_ESP(task); - } + /* + * esp and eip are intentionally zeroed out. There is no + * non-racy way to read them without freezing the task. + * Programs that need reliable values can use ptrace(2). + */ } get_task_comm(tcomm, task); -- 2.7.4