Re: [RFC PATCH 2/3] add statmnt(2) syscall
From: Paul Moore <paul@paul-moore.com>
Date: 2023-09-14 20:40:00
Also in:
linux-fsdevel, linux-man, linux-security-module, lkml
On Wed, Sep 13, 2023 at 11:23 AM Miklos Szeredi [off-list ref] wrote:
Add a way to query attributes of a single mount instead of having to parse the complete /proc/$PID/mountinfo, which might be huge. Lookup the mount by the old (32bit) or new (64bit) mount ID. If a mount needs to be queried based on path, then statx(2) can be used to first query the mount ID belonging to the path. Design is based on a suggestion by Linus: "So I'd suggest something that is very much like "statfsat()", which gets a buffer and a length, and returns an extended "struct statfs" *AND* just a string description at the end." The interface closely mimics that of statx. Handle ASCII attributes by appending after the end of the structure (as per above suggestion). Allow querying multiple string attributes with individual offset/length for each. String are nul terminated (termination isn't counted in length). Mount options are also delimited with nul characters. Unlike proc, special characters are not quoted. Link: https://lore.kernel.org/all/CAHk-=wh5YifP7hzKSbwJj94+DZ2czjrZsczy6GBimiogZws=rg@mail.gmail.com/ (local) Signed-off-by: Miklos Szeredi <redacted> --- arch/x86/entry/syscalls/syscall_64.tbl | 1 + fs/internal.h | 5 + fs/namespace.c | 312 ++++++++++++++++++++++++- fs/proc_namespace.c | 19 +- fs/statfs.c | 1 + include/linux/syscalls.h | 3 + include/uapi/asm-generic/unistd.h | 5 +- include/uapi/linux/mount.h | 36 +++ 8 files changed, 373 insertions(+), 9 deletions(-)
...
quoted hunk ↗ jump to hunk
diff --git a/fs/namespace.c b/fs/namespace.c index de47c5f66e17..088a52043bba 100644 --- a/fs/namespace.c +++ b/fs/namespace.c
...
+static int do_statmnt(struct stmt_state *s)
+{
+ struct statmnt *sm = &s->sm;
+ struct mount *m = real_mount(s->mnt);
+
+ if (!capable(CAP_SYS_ADMIN) &&
+ !is_path_reachable(m, m->mnt.mnt_root, &s->root))
+ return -EPERM;I realize statmnt() is different from fstatfs(), but from an access control perspective they look a lot alike to me which is why I think we should probably have a security_sb_statfs() call here. Same thing for the listmnt() syscall in patch 3/3.
+ stmt_numeric(s, STMT_SB_BASIC, stmt_sb_basic); + stmt_numeric(s, STMT_MNT_BASIC, stmt_mnt_basic); + stmt_numeric(s, STMT_PROPAGATE_FROM, stmt_propagate_from); + stmt_string(s, STMT_MNT_ROOT, stmt_mnt_root, &sm->mnt_root); + stmt_string(s, STMT_MOUNTPOINT, stmt_mountpoint, &sm->mountpoint); + stmt_string(s, STMT_FS_TYPE, stmt_fs_type, &sm->fs_type); + stmt_string(s, STMT_SB_OPTS, stmt_sb_opts, &sm->sb_opts); + + if (s->err) + return s->err; + + if (copy_to_user(s->buf, sm, min_t(size_t, s->bufsize, sizeof(*sm)))) + return -EFAULT; + + return 0; +}
-- paul-moore.com