Jann Horn <ja...@google.com> writes: > Restore the read memory barrier in __ptrace_may_access() that was deleted > a couple years ago. Also add comments on this barrier and the one it pairs > with to explain why they're there (as far as I understand).
My bad. When I made that change I could not figure out what that barrier was for, and it did not appear necessary. Do you happen to know of any real world problems? Reviewed-by: "Eric W. Biederman" <ebied...@xmission.com> If no one else would prefer to pick this up I will grab it. I have another bug fix I already queueing for 5.2-rcX. Thank you, Eric > > Fixes: bfedb589252c ("mm: Add a user_ns owner to mm_struct and fix ptrace > permission checks") > Cc: sta...@vger.kernel.org > Signed-off-by: Jann Horn <ja...@google.com> > --- > (I have no clue whatsoever what the relevant tree for this is, but I > guess Oleg is the relevant maintainer?) > > kernel/cred.c | 9 +++++++++ > kernel/ptrace.c | 10 ++++++++++ > 2 files changed, 19 insertions(+) > > diff --git a/kernel/cred.c b/kernel/cred.c > index 45d77284aed0..07e069d00696 100644 > --- a/kernel/cred.c > +++ b/kernel/cred.c > @@ -450,6 +450,15 @@ int commit_creds(struct cred *new) > if (task->mm) > set_dumpable(task->mm, suid_dumpable); > task->pdeath_signal = 0; > + /* > + * If a task drops privileges and becomes nondumpable, > + * the dumpability change must become visible before > + * the credential change; otherwise, a __ptrace_may_access() > + * racing with this change may be able to attach to a task it > + * shouldn't be able to attach to (as if the task had dropped > + * privileges without becoming nondumpable). > + * Pairs with a read barrier in __ptrace_may_access(). > + */ > smp_wmb(); > } > > diff --git a/kernel/ptrace.c b/kernel/ptrace.c > index 5710d07e67cf..e54452c2954b 100644 > --- a/kernel/ptrace.c > +++ b/kernel/ptrace.c > @@ -324,6 +324,16 @@ static int __ptrace_may_access(struct task_struct *task, > unsigned int mode) > return -EPERM; > ok: > rcu_read_unlock(); > + /* > + * If a task drops privileges and becomes nondumpable (through a syscall > + * like setresuid()) while we are trying to access it, we must ensure > + * that the dumpability is read after the credentials; otherwise, > + * we may be able to attach to a task that we shouldn't be able to > + * attach to (as if the task had dropped privileges without becoming > + * nondumpable). > + * Pairs with a write barrier in commit_creds(). > + */ > + smp_rmb(); > mm = task->mm; > if (mm && > ((get_dumpable(mm) != SUID_DUMP_USER) &&