> On Apr 23, 2024, at 4:02 AM, Stas Sergeev <stsp2@xxxxxxxxx> wrote: > > This patch-set implements the OA2_INHERIT_CRED flag for openat2() syscall. > It is needed to perform an open operation with the creds that were in > effect when the dir_fd was opened. This allows the process to pre-open > some dirs and switch eUID (and other UIDs/GIDs) to the less-privileged > user, while still retaining the possibility to open/create files within > the pre-opened directory set. I like the concept, as it’s a sort of move toward a capability system. But I think that making a dirfd into this sort of capability would need to be much more explicit. Right now, any program could do this entirely by accident, and applying OA2_INHERIT_CRED to an fd fished out of /proc seems hazardous. So perhaps if an open file description for a directory could have something like FMODE_CRED, and if OA2_INHERIT_CRED also blocked .., magic links, symlinks to anywhere above the dirfd (or maybe all symlinks) and absolute path lookups, then this would be okay. Also, there are lots of ways that f_cred could be relevant: fsuid/fsgid, effective capabilities and security labels. And it gets more complex if this ever gets extended to support connecting or sending to a socket or if someone opens a device node. Does CAP_SYS_ADMIN carry over? > > Changes in v2: > - capture full struct cred instead of just fsuid/fsgid. > Suggested by Stefan Metzmacher <metze@xxxxxxxxx> > > CC: Stefan Metzmacher <metze@xxxxxxxxx> > CC: Eric Biederman <ebiederm@xxxxxxxxxxxx> > CC: Alexander Viro <viro@xxxxxxxxxxxxxxxxxx> > CC: Andy Lutomirski <luto@xxxxxxxxxx> > CC: Christian Brauner <brauner@xxxxxxxxxx> > CC: Jan Kara <jack@xxxxxxx> > CC: Jeff Layton <jlayton@xxxxxxxxxx> > CC: Chuck Lever <chuck.lever@xxxxxxxxxx> > CC: Alexander Aring <alex.aring@xxxxxxxxx> > CC: linux-fsdevel@xxxxxxxxxxxxxxx > CC: linux-kernel@xxxxxxxxxxxxxxx > CC: linux-api@xxxxxxxxxxxxxxx > CC: Paolo Bonzini <pbonzini@xxxxxxxxxx> > CC: Christian Göttsche <cgzones@xxxxxxxxxxxxxx> > > Stas Sergeev (2): > fs: reorganize path_openat() > openat2: add OA2_INHERIT_CRED flag > > fs/internal.h | 2 +- > fs/namei.c | 52 +++++++++++++++++++++++++++++------- > fs/open.c | 2 +- > include/linux/fcntl.h | 2 ++ > include/uapi/linux/openat2.h | 3 +++ > 5 files changed, 50 insertions(+), 11 deletions(-) > > -- > 2.44.0 > >