From: Alexey Gladkov <gladkov.alexey@gmail.com> To: LKML <linux-kernel@vger.kernel.org>, Kernel Hardening <kernel-hardening@lists.openwall.com>, Linux API <linux-api@vger.kernel.org>, Linux FS Devel <linux-fsdevel@vger.kernel.org>, Linux Security Module <linux-security-module@vger.kernel.org> Cc: Akinobu Mita <akinobu.mita@gmail.com>, Alexander Viro <viro@zeniv.linux.org.uk>, Alexey Dobriyan <adobriyan@gmail.com>, Alexey Gladkov <gladkov.alexey@gmail.com>, Andrew Morton <akpm@linux-foundation.org>, Andy Lutomirski <luto@kernel.org>, Daniel Micay <danielmicay@gmail.com>, Djalal Harouni <tixxdz@gmail.com>, "Dmitry V . Levin" <ldv@altlinux.org>, "Eric W . Biederman" <ebiederm@xmission.com>, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Ingo Molnar <mingo@kernel.org>, "J . Bruce Fields" <bfields@fieldses.org>, Jeff Layton <jlayton@poochiereds.net>, Jonathan Corbet <corbet@lwn.net>, Kees Cook <keescook@chromium.org>, Linus Torvalds <torvalds@linux-foundation.org>, Oleg Nesterov <oleg@redhat.com>, Solar Designer <solar@openwall.com> Subject: [PATCH v8 09/11] proc: add option to mount only a pids subset Date: Mon, 10 Feb 2020 16:05:17 +0100 Message-ID: <20200210150519.538333-10-gladkov.alexey@gmail.com> (raw) In-Reply-To: <20200210150519.538333-1-gladkov.alexey@gmail.com> This allows to hide all files and directories in the procfs that are not related to tasks. Signed-off-by: Alexey Gladkov <gladkov.alexey@gmail.com> --- fs/proc/generic.c | 9 +++++++++ fs/proc/inode.c | 7 +++++++ fs/proc/internal.h | 10 ++++++++++ fs/proc/root.c | 36 ++++++++++++++++++++++++++++++++++++ include/linux/proc_fs.h | 7 +++++++ 5 files changed, 69 insertions(+) diff --git a/fs/proc/generic.c b/fs/proc/generic.c index 64e9ee1b129e..6f6517d63053 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c @@ -267,6 +267,11 @@ struct dentry *proc_lookup_de(struct inode *dir, struct dentry *dentry, struct dentry *proc_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) { + struct proc_fs_info *fs_info = proc_sb_info(dir->i_sb); + + if (proc_fs_pidonly(fs_info) == PROC_PIDONLY_ON) + return ERR_PTR(-ENOENT); + return proc_lookup_de(dir, dentry, PDE(dir)); } @@ -323,6 +328,10 @@ int proc_readdir_de(struct file *file, struct dir_context *ctx, int proc_readdir(struct file *file, struct dir_context *ctx) { struct inode *inode = file_inode(file); + struct proc_fs_info *fs_info = proc_sb_info(inode->i_sb); + + if (proc_fs_pidonly(fs_info) == PROC_PIDONLY_ON) + return 1; return proc_readdir_de(file, ctx, PDE(inode)); } diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 70b722fb8811..f35eef117775 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c @@ -114,6 +114,9 @@ static int proc_show_options(struct seq_file *seq, struct dentry *root) if (hidepid != HIDEPID_OFF) seq_printf(seq, ",hidepid=%u", hidepid); + if (proc_fs_pidonly(fs_info) != PROC_PIDONLY_OFF) + seq_printf(seq, ",subset=pidfs"); + return 0; } @@ -333,12 +336,16 @@ proc_reg_get_unmapped_area(struct file *file, unsigned long orig_addr, static int proc_reg_open(struct inode *inode, struct file *file) { + struct proc_fs_info *fs_info = proc_sb_info(inode->i_sb); struct proc_dir_entry *pde = PDE(inode); int rv = 0; typeof_member(struct file_operations, open) open; typeof_member(struct file_operations, release) release; struct pde_opener *pdeo; + if (proc_fs_pidonly(fs_info) == PROC_PIDONLY_ON) + return -ENOENT; + /* * Ensure that * 1) PDE's ->release hook will be called no matter what diff --git a/fs/proc/internal.h b/fs/proc/internal.h index ff2f274b2e0d..e2c729267317 100644 --- a/fs/proc/internal.h +++ b/fs/proc/internal.h @@ -126,6 +126,11 @@ static inline void proc_fs_set_hide_pid(struct proc_fs_info *fs_info, int hide_p fs_info->hide_pid = hide_pid; } +static inline void proc_fs_set_pidonly(struct proc_fs_info *fs_info, int value) +{ + fs_info->pidonly = value; +} + static inline void proc_fs_set_pid_gid(struct proc_fs_info *fs_info, kgid_t gid) { fs_info->pid_gid = gid; @@ -141,6 +146,11 @@ static inline kgid_t proc_fs_pid_gid(struct proc_fs_info *fs_info) return fs_info->pid_gid; } +static inline int proc_fs_pidonly(struct proc_fs_info *fs_info) +{ + return fs_info->pidonly; +} + void task_dump_owner(struct task_struct *task, umode_t mode, kuid_t *ruid, kgid_t *rgid); diff --git a/fs/proc/root.c b/fs/proc/root.c index 5e27bb31f125..4dce77639c2b 100644 --- a/fs/proc/root.c +++ b/fs/proc/root.c @@ -34,16 +34,19 @@ struct proc_fs_context { unsigned int mask; int hidepid; int gid; + int pidonly; }; enum proc_param { Opt_gid, Opt_hidepid, + Opt_subset, }; static const struct fs_parameter_spec proc_param_specs[] = { fsparam_u32("gid", Opt_gid), fsparam_u32("hidepid", Opt_hidepid), + fsparam_string("subset", Opt_subset), {} }; @@ -61,6 +64,30 @@ valid_hidepid(unsigned int value) value == HIDEPID_NOT_PTRACABLE); } +static inline int +proc_parse_subset_param(struct fs_context *fc, char *value) +{ + struct proc_fs_context *ctx = fc->fs_private; + + while (value) { + char *ptr = strchr(value, ','); + + if (ptr != NULL) + *ptr++ = '\0'; + + if (*value != '\0') { + if (!strcmp(value, "pidfs")) { + ctx->pidonly = PROC_PIDONLY_ON; + } else { + return invalf(fc, "proc: unsupported subset option - %s\n", value); + } + } + value = ptr; + } + + return 0; +} + static int proc_parse_param(struct fs_context *fc, struct fs_parameter *param) { struct proc_fs_context *ctx = fc->fs_private; @@ -82,6 +109,11 @@ static int proc_parse_param(struct fs_context *fc, struct fs_parameter *param) ctx->hidepid = result.uint_32; break; + case Opt_subset: + if (proc_parse_subset_param(fc, param->string) < 0) + return -EINVAL; + break; + default: return -EINVAL; } @@ -102,6 +134,7 @@ static void proc_apply_options(struct proc_fs_info *fs_info, proc_fs_set_pid_gid(fs_info, proc_fs_pid_gid(pidns_fs_info)); proc_fs_set_hide_pid(fs_info, proc_fs_hide_pid(pidns_fs_info)); + proc_fs_set_pidonly(fs_info, proc_fs_pidonly(pidns_fs_info)); } if (ctx->mask & (1 << Opt_gid)) @@ -109,6 +142,9 @@ static void proc_apply_options(struct proc_fs_info *fs_info, if (ctx->mask & (1 << Opt_hidepid)) proc_fs_set_hide_pid(fs_info, ctx->hidepid); + + if (ctx->mask & (1 << Opt_subset)) + proc_fs_set_pidonly(fs_info, ctx->pidonly); } static int proc_fill_super(struct super_block *s, struct fs_context *fc) diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index 6822548405a7..3ad0a47c3556 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h @@ -20,6 +20,12 @@ enum { HIDEPID_NOT_PTRACABLE = 4, /* Limit pids to only ptracable pids */ }; +/* definitions for proc mount option pidonly */ +enum { + PROC_PIDONLY_OFF = 0, + PROC_PIDONLY_ON = 1, +}; + struct proc_fs_info { struct list_head pidns_entry; /* Node in procfs_mounts of a pidns */ struct super_block *m_super; @@ -28,6 +34,7 @@ struct proc_fs_info { struct dentry *proc_thread_self; /* For /proc/thread-self */ kgid_t pid_gid; int hide_pid; + int pidonly; }; static inline struct proc_fs_info *proc_sb_info(struct super_block *sb) -- 2.24.1
next prev parent reply index Thread overview: 85+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-02-10 15:05 [PATCH v8 00/11] proc: modernize proc to support multiple private instances Alexey Gladkov 2020-02-10 15:05 ` [PATCH v8 01/11] proc: Rename struct proc_fs_info to proc_fs_opts Alexey Gladkov 2020-02-10 15:05 ` [PATCH v8 02/11] proc: add proc_fs_info struct to store proc information Alexey Gladkov 2020-02-10 15:05 ` [PATCH v8 03/11] proc: move /proc/{self|thread-self} dentries to proc_fs_info Alexey Gladkov 2020-02-10 18:23 ` Andy Lutomirski 2020-02-12 15:00 ` Alexey Gladkov 2020-02-10 15:05 ` [PATCH v8 04/11] proc: move hide_pid, pid_gid from pid_namespace " Alexey Gladkov 2020-02-10 15:05 ` [PATCH v8 05/11] proc: add helpers to set and get proc hidepid and gid mount options Alexey Gladkov 2020-02-10 18:30 ` Andy Lutomirski 2020-02-12 14:57 ` Alexey Gladkov 2020-02-10 15:05 ` [PATCH v8 06/11] proc: support mounting procfs instances inside same pid namespace Alexey Gladkov 2020-02-10 15:05 ` [PATCH v8 07/11] proc: flush task dcache entries from all procfs instances Alexey Gladkov 2020-02-10 17:46 ` Linus Torvalds 2020-02-10 19:23 ` Al Viro 2020-02-11 1:36 ` Eric W. Biederman 2020-02-11 4:01 ` Eric W. Biederman 2020-02-12 14:49 ` Alexey Gladkov 2020-02-12 14:59 ` Eric W. Biederman 2020-02-12 17:08 ` Alexey Gladkov 2020-02-12 18:45 ` Linus Torvalds 2020-02-12 19:16 ` Eric W. Biederman 2020-02-12 19:49 ` Linus Torvalds 2020-02-12 20:03 ` Al Viro 2020-02-12 20:35 ` Linus Torvalds 2020-02-12 20:38 ` Al Viro 2020-02-12 20:41 ` Al Viro 2020-02-12 21:02 ` Linus Torvalds 2020-02-12 21:46 ` Eric W. Biederman 2020-02-13 0:48 ` Linus Torvalds 2020-02-13 4:37 ` Eric W. Biederman 2020-02-13 5:55 ` Al Viro 2020-02-13 21:30 ` Linus Torvalds 2020-02-13 22:23 ` Al Viro 2020-02-13 22:47 ` Linus Torvalds 2020-02-14 14:15 ` Eric W. Biederman 2020-02-14 3:48 ` Eric W. Biederman 2020-02-20 20:46 ` [PATCH 0/7] proc: Dentry flushing without proc_mnt Eric W. Biederman 2020-02-20 20:47 ` [PATCH 1/7] proc: Rename in proc_inode rename sysctl_inodes sibling_inodes Eric W. Biederman 2020-02-20 20:48 ` [PATCH 2/7] proc: Generalize proc_sys_prune_dcache into proc_prune_siblings_dcache Eric W. Biederman 2020-02-20 20:49 ` [PATCH 3/7] proc: Mov rcu_read_(lock|unlock) in proc_prune_siblings_dcache Eric W. Biederman 2020-02-20 22:33 ` Linus Torvalds 2020-02-20 20:49 ` [PATCH 4/7] proc: Use d_invalidate " Eric W. Biederman 2020-02-20 22:43 ` Linus Torvalds 2020-02-20 22:54 ` Al Viro 2020-02-20 23:00 ` Linus Torvalds 2020-02-20 23:03 ` Al Viro 2020-02-20 23:39 ` Eric W. Biederman 2020-02-20 20:51 ` [PATCH 5/7] proc: Clear the pieces of proc_inode that proc_evict_inode cares about Eric W. Biederman 2020-02-20 20:52 ` [PATCH 6/7] proc: Use a list of inodes to flush from proc Eric W. Biederman 2020-02-20 20:52 ` [PATCH 7/7] proc: Ensure we see the exit of each process tid exactly once Eric W. Biederman 2020-02-21 16:50 ` Oleg Nesterov 2020-02-22 15:46 ` Eric W. Biederman 2020-02-20 23:02 ` [PATCH 0/7] proc: Dentry flushing without proc_mnt Linus Torvalds 2020-02-20 23:07 ` Al Viro 2020-02-20 23:37 ` Eric W. Biederman 2020-02-24 16:25 ` [PATCH v2 0/6] " Eric W. Biederman 2020-02-24 16:26 ` [PATCH v2 1/6] proc: Rename in proc_inode rename sysctl_inodes sibling_inodes Eric W. Biederman 2020-02-24 16:27 ` [PATCH v2 2/6] proc: Generalize proc_sys_prune_dcache into proc_prune_siblings_dcache Eric W. Biederman 2020-02-24 16:27 ` [PATCH v2 3/6] proc: In proc_prune_siblings_dcache cache an aquired super block Eric W. Biederman 2020-02-24 16:28 ` [PATCH v2 4/6] proc: Use d_invalidate in proc_prune_siblings_dcache Eric W. Biederman 2020-02-24 16:28 ` [PATCH v2 5/6] proc: Clear the pieces of proc_inode that proc_evict_inode cares about Eric W. Biederman 2020-02-24 16:29 ` [PATCH v2 6/6] proc: Use a list of inodes to flush from proc Eric W. Biederman 2020-02-28 20:17 ` [PATCH 0/3] proc: Actually honor the mount options Eric W. Biederman 2020-02-28 20:18 ` [PATCH 1/3] uml: Don't consult current to find the proc_mnt in mconsole_proc Eric W. Biederman 2020-02-28 20:18 ` [PATCH 2/3] uml: Create a private mount of proc for mconsole Eric W. Biederman 2020-02-28 20:30 ` Christian Brauner 2020-02-28 21:28 ` Eric W. Biederman 2020-02-28 21:59 ` Christian Brauner 2020-02-28 20:19 ` [PATCH 3/3] proc: Remove the now unnecessary internal mount of proc Eric W. Biederman 2020-02-28 20:39 ` Christian Brauner 2020-02-28 21:40 ` Eric W. Biederman 2020-02-28 22:34 ` [PATCH 4/3] pid: Improve the comment about waiting in zap_pid_ns_processes Eric W. Biederman 2020-02-29 2:59 ` Christian Brauner 2020-02-14 3:49 ` [PATCH v8 07/11] proc: flush task dcache entries from all procfs instances Eric W. Biederman 2020-02-12 19:47 ` Al Viro 2020-02-11 22:45 ` Al Viro 2020-02-12 14:26 ` Alexey Gladkov 2020-02-10 15:05 ` [PATCH v8 08/11] proc: instantiate only pids that we can ptrace on 'hidepid=4' mount option Alexey Gladkov 2020-02-10 16:29 ` Jordan Glover 2020-02-12 14:34 ` Alexey Gladkov 2020-02-10 15:05 ` Alexey Gladkov [this message] 2020-02-10 15:05 ` [PATCH v8 10/11] docs: proc: add documentation for "hidepid=4" and "subset=pidfs" options and new mount behavior Alexey Gladkov 2020-02-10 18:29 ` Andy Lutomirski 2020-02-12 16:03 ` Alexey Gladkov 2020-02-10 15:05 ` [PATCH v8 11/11] proc: Move hidepid values to uapi as they are user interface to mount Alexey Gladkov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200210150519.538333-10-gladkov.alexey@gmail.com \ --to=gladkov.alexey@gmail.com \ --cc=adobriyan@gmail.com \ --cc=akinobu.mita@gmail.com \ --cc=akpm@linux-foundation.org \ --cc=bfields@fieldses.org \ --cc=corbet@lwn.net \ --cc=danielmicay@gmail.com \ --cc=ebiederm@xmission.com \ --cc=gregkh@linuxfoundation.org \ --cc=jlayton@poochiereds.net \ --cc=keescook@chromium.org \ --cc=kernel-hardening@lists.openwall.com \ --cc=ldv@altlinux.org \ --cc=linux-api@vger.kernel.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-security-module@vger.kernel.org \ --cc=luto@kernel.org \ --cc=mingo@kernel.org \ --cc=oleg@redhat.com \ --cc=solar@openwall.com \ --cc=tixxdz@gmail.com \ --cc=torvalds@linux-foundation.org \ --cc=viro@zeniv.linux.org.uk \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Linux-Fsdevel Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/linux-fsdevel/0 linux-fsdevel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 linux-fsdevel linux-fsdevel/ https://lore.kernel.org/linux-fsdevel \ linux-fsdevel@vger.kernel.org public-inbox-index linux-fsdevel Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.kernel.vger.linux-fsdevel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git