mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 01:32:21 +02:00
proc: subset=pid: Show /proc/self/net only for CAP_NET_ADMIN
Cache the mounters credentials and allow access to the net directories contingent of the permissions of the mounter of proc. Do not show /proc/self/net when proc is mounted with subset=pid option and the mounter does not have CAP_NET_ADMIN. To avoid inadvertently allowing access to /proc/<pid>/net, updating mounter credentials is not supported. Signed-off-by: Alexey Gladkov <legion@kernel.org> Link: https://patch.msgid.link/d2466fe9085367f1e24693c437ecb8cff2789660.1777278334.git.legion@kernel.org Reviewed-by: Aleksa Sarai <aleksa@amutable.com> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
78d797520f
commit
a2a5eb6323
|
|
@ -23,6 +23,7 @@
|
|||
#include <linux/uidgid.h>
|
||||
#include <net/net_namespace.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/security.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
|
@ -270,6 +271,7 @@ static struct net *get_proc_task_net(struct inode *dir)
|
|||
struct task_struct *task;
|
||||
struct nsproxy *ns;
|
||||
struct net *net = NULL;
|
||||
struct proc_fs_info *fs_info = proc_sb_info(dir->i_sb);
|
||||
|
||||
rcu_read_lock();
|
||||
task = pid_task(proc_pid(dir), PIDTYPE_PID);
|
||||
|
|
@ -282,6 +284,12 @@ static struct net *get_proc_task_net(struct inode *dir)
|
|||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
if (net && (fs_info->pidonly == PROC_PIDONLY_ON) &&
|
||||
security_capable(fs_info->mounter_cred, net->user_ns, CAP_NET_ADMIN, CAP_OPT_NONE) < 0) {
|
||||
put_net(net);
|
||||
net = NULL;
|
||||
}
|
||||
|
||||
return net;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -254,6 +254,7 @@ static int proc_fill_super(struct super_block *s, struct fs_context *fc)
|
|||
return -ENOMEM;
|
||||
|
||||
fs_info->pid_ns = get_pid_ns(ctx->pid_ns);
|
||||
fs_info->mounter_cred = get_cred(fc->cred);
|
||||
proc_apply_options(fs_info, fc, current_user_ns());
|
||||
|
||||
/* User space would break if executables or devices appear on proc */
|
||||
|
|
@ -350,6 +351,7 @@ static void proc_kill_sb(struct super_block *sb)
|
|||
kill_anon_super(sb);
|
||||
if (fs_info) {
|
||||
put_pid_ns(fs_info->pid_ns);
|
||||
put_cred(fs_info->mounter_cred);
|
||||
kfree_rcu(fs_info, rcu);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -67,6 +67,7 @@ enum proc_pidonly {
|
|||
struct proc_fs_info {
|
||||
struct pid_namespace *pid_ns;
|
||||
kgid_t pid_gid;
|
||||
const struct cred *mounter_cred;
|
||||
enum proc_hidepid hide_pid;
|
||||
enum proc_pidonly pidonly;
|
||||
struct rcu_head rcu;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user