Re: [PATCH 2/3] proc: query LSMs for introspective mem access (if PROC_MEM_FORCE_ALWAYS)
Jann Horn <[email protected]>
| Newsgroups | gmane.linux.kernel.lsm,gmane.linux.file-systems,gmane.linux.kernel.mm |
|---|---|
| Message-ID | <CAG48ez00PjoaXt4xJn1DCNdZfmFn4faya++=U2EeW0_vcYXcqg@mail.gmail.com> |
On Tue, Aug 25, 2026 at 3:42 PM Lorenzo Stoakes (ARM) <[email protected]> wrote: > On Mon, Aug 24, 2026 at 07:43:02PM +0200, Jann Horn wrote: > > On Mon, Aug 24, 2026 at 7:33 PM Lorenzo Stoakes (ARM) <[email protected]> wrote: > > > On Mon, Aug 24, 2026 at 07:06:04PM +0200, Jann Horn wrote: > > > > On Fri, Aug 21, 2026 at 8:52 PM Lorenzo Stoakes (ARM) <[email protected]> wrote: > > > > > The sharing a /proc/mem fd seems like that's a pretty dumb thing to do in > > > > > general :) but I guess you have to protect against that. > > > > > > > > Yeah, it's a kinda weird thing to do... > > > > > > Yup :)) but I guess we have to account for people doing weird stuff... > > > > > > In this case (I do mention it in a reply elsewhere I think) it does seem > > > like perhaps you should separately check for current->mm != mm of (what was > > > originally /proc/self/mm)? > > > > I wouldn't want to do it for this access check, since that could lead > > to "confused deputy" problems. > > I guess if it got the decision wrong somehow that'd be a problem? Or wrongly > OK'd it on one level but then that led to the fd being passed on assumption it > was OK to do it or something? The problematic scenario would be something like: 1. process A opens fd1=open("/proc/self/mem",O_RDWR) 2. process A does lseek(fd1, <address of libc>, SEEK_SET) 3. A sends fd1 to privileged daemon B as a "log output" FD 4. privileged daemon B write()s into fd1 In this scenario, daemon B is just trying to write log output into a file descriptor. If we checked the current credentials on write(), we might enable FOLL_FORCE just because daemon B is generally permitted to use ptrace. This illustrates why, in general, the "ambient privilege" that a process has must not influence write() access decisions. For a similar historical example, see https://project-zero.issues.chromium.org/issues/42450869 where we used to do capability checks in the old expand_downwards() logic, which could be reached by writing into /proc/$pid/mem. That made it possible for an unprivileged process to map virtual address 0 by providing /proc/$pid/mem as stderr to a setuid root binary.