1  /* SPDX-License-Identifier: GPL-2.0 */
2  #ifndef _LINUX_USER_NAMESPACE_H
3  #define _LINUX_USER_NAMESPACE_H
4  
5  #include <linux/kref.h>
6  #include <linux/nsproxy.h>
7  #include <linux/ns_common.h>
8  #include <linux/sched.h>
9  #include <linux/workqueue.h>
10  #include <linux/rwsem.h>
11  #include <linux/sysctl.h>
12  #include <linux/err.h>
13  
14  #define UID_GID_MAP_MAX_BASE_EXTENTS 5
15  #define UID_GID_MAP_MAX_EXTENTS 340
16  
17  struct uid_gid_extent {
18  	u32 first;
19  	u32 lower_first;
20  	u32 count;
21  };
22  
23  struct uid_gid_map { /* 64 bytes -- 1 cache line */
24  	union {
25  		struct {
26  			struct uid_gid_extent extent[UID_GID_MAP_MAX_BASE_EXTENTS];
27  			u32 nr_extents;
28  		};
29  		struct {
30  			struct uid_gid_extent *forward;
31  			struct uid_gid_extent *reverse;
32  		};
33  	};
34  };
35  
36  #define USERNS_SETGROUPS_ALLOWED 1UL
37  
38  #define USERNS_INIT_FLAGS USERNS_SETGROUPS_ALLOWED
39  
40  struct ucounts;
41  
42  enum ucount_type {
43  	UCOUNT_USER_NAMESPACES,
44  	UCOUNT_PID_NAMESPACES,
45  	UCOUNT_UTS_NAMESPACES,
46  	UCOUNT_IPC_NAMESPACES,
47  	UCOUNT_NET_NAMESPACES,
48  	UCOUNT_MNT_NAMESPACES,
49  	UCOUNT_CGROUP_NAMESPACES,
50  	UCOUNT_TIME_NAMESPACES,
51  #ifdef CONFIG_INOTIFY_USER
52  	UCOUNT_INOTIFY_INSTANCES,
53  	UCOUNT_INOTIFY_WATCHES,
54  #endif
55  #ifdef CONFIG_FANOTIFY
56  	UCOUNT_FANOTIFY_GROUPS,
57  	UCOUNT_FANOTIFY_MARKS,
58  #endif
59  	UCOUNT_COUNTS,
60  };
61  
62  enum rlimit_type {
63  	UCOUNT_RLIMIT_NPROC,
64  	UCOUNT_RLIMIT_MSGQUEUE,
65  	UCOUNT_RLIMIT_SIGPENDING,
66  	UCOUNT_RLIMIT_MEMLOCK,
67  	UCOUNT_RLIMIT_COUNTS,
68  };
69  
70  #if IS_ENABLED(CONFIG_BINFMT_MISC)
71  struct binfmt_misc;
72  #endif
73  
74  struct user_namespace {
75  	struct uid_gid_map	uid_map;
76  	struct uid_gid_map	gid_map;
77  	struct uid_gid_map	projid_map;
78  	struct user_namespace	*parent;
79  	int			level;
80  	kuid_t			owner;
81  	kgid_t			group;
82  	struct ns_common	ns;
83  	unsigned long		flags;
84  	/* parent_could_setfcap: true if the creator if this ns had CAP_SETFCAP
85  	 * in its effective capability set at the child ns creation time. */
86  	bool			parent_could_setfcap;
87  
88  #ifdef CONFIG_KEYS
89  	/* List of joinable keyrings in this namespace.  Modification access of
90  	 * these pointers is controlled by keyring_sem.  Once
91  	 * user_keyring_register is set, it won't be changed, so it can be
92  	 * accessed directly with READ_ONCE().
93  	 */
94  	struct list_head	keyring_name_list;
95  	struct key		*user_keyring_register;
96  	struct rw_semaphore	keyring_sem;
97  #endif
98  
99  	/* Register of per-UID persistent keyrings for this namespace */
100  #ifdef CONFIG_PERSISTENT_KEYRINGS
101  	struct key		*persistent_keyring_register;
102  #endif
103  	struct work_struct	work;
104  #ifdef CONFIG_SYSCTL
105  	struct ctl_table_set	set;
106  	struct ctl_table_header *sysctls;
107  #endif
108  	struct ucounts		*ucounts;
109  	long ucount_max[UCOUNT_COUNTS];
110  	long rlimit_max[UCOUNT_RLIMIT_COUNTS];
111  
112  #if IS_ENABLED(CONFIG_BINFMT_MISC)
113  	struct binfmt_misc *binfmt_misc;
114  #endif
115  } __randomize_layout;
116  
117  struct ucounts {
118  	struct hlist_node node;
119  	struct user_namespace *ns;
120  	kuid_t uid;
121  	atomic_t count;
122  	atomic_long_t ucount[UCOUNT_COUNTS];
123  	atomic_long_t rlimit[UCOUNT_RLIMIT_COUNTS];
124  };
125  
126  extern struct user_namespace init_user_ns;
127  extern struct ucounts init_ucounts;
128  
129  bool setup_userns_sysctls(struct user_namespace *ns);
130  void retire_userns_sysctls(struct user_namespace *ns);
131  struct ucounts *inc_ucount(struct user_namespace *ns, kuid_t uid, enum ucount_type type);
132  void dec_ucount(struct ucounts *ucounts, enum ucount_type type);
133  struct ucounts *alloc_ucounts(struct user_namespace *ns, kuid_t uid);
134  struct ucounts * __must_check get_ucounts(struct ucounts *ucounts);
135  void put_ucounts(struct ucounts *ucounts);
136  
get_rlimit_value(struct ucounts * ucounts,enum rlimit_type type)137  static inline long get_rlimit_value(struct ucounts *ucounts, enum rlimit_type type)
138  {
139  	return atomic_long_read(&ucounts->rlimit[type]);
140  }
141  
142  long inc_rlimit_ucounts(struct ucounts *ucounts, enum rlimit_type type, long v);
143  bool dec_rlimit_ucounts(struct ucounts *ucounts, enum rlimit_type type, long v);
144  long inc_rlimit_get_ucounts(struct ucounts *ucounts, enum rlimit_type type,
145  			    bool override_rlimit);
146  void dec_rlimit_put_ucounts(struct ucounts *ucounts, enum rlimit_type type);
147  bool is_rlimit_overlimit(struct ucounts *ucounts, enum rlimit_type type, unsigned long max);
148  
get_userns_rlimit_max(struct user_namespace * ns,enum rlimit_type type)149  static inline long get_userns_rlimit_max(struct user_namespace *ns, enum rlimit_type type)
150  {
151  	return READ_ONCE(ns->rlimit_max[type]);
152  }
153  
set_userns_rlimit_max(struct user_namespace * ns,enum rlimit_type type,unsigned long max)154  static inline void set_userns_rlimit_max(struct user_namespace *ns,
155  		enum rlimit_type type, unsigned long max)
156  {
157  	ns->rlimit_max[type] = max <= LONG_MAX ? max : LONG_MAX;
158  }
159  
160  #ifdef CONFIG_USER_NS
161  
get_user_ns(struct user_namespace * ns)162  static inline struct user_namespace *get_user_ns(struct user_namespace *ns)
163  {
164  	if (ns)
165  		refcount_inc(&ns->ns.count);
166  	return ns;
167  }
168  
169  extern int create_user_ns(struct cred *new);
170  extern int unshare_userns(unsigned long unshare_flags, struct cred **new_cred);
171  extern void __put_user_ns(struct user_namespace *ns);
172  
put_user_ns(struct user_namespace * ns)173  static inline void put_user_ns(struct user_namespace *ns)
174  {
175  	if (ns && refcount_dec_and_test(&ns->ns.count))
176  		__put_user_ns(ns);
177  }
178  
179  struct seq_operations;
180  extern const struct seq_operations proc_uid_seq_operations;
181  extern const struct seq_operations proc_gid_seq_operations;
182  extern const struct seq_operations proc_projid_seq_operations;
183  extern ssize_t proc_uid_map_write(struct file *, const char __user *, size_t, loff_t *);
184  extern ssize_t proc_gid_map_write(struct file *, const char __user *, size_t, loff_t *);
185  extern ssize_t proc_projid_map_write(struct file *, const char __user *, size_t, loff_t *);
186  extern ssize_t proc_setgroups_write(struct file *, const char __user *, size_t, loff_t *);
187  extern int proc_setgroups_show(struct seq_file *m, void *v);
188  extern bool userns_may_setgroups(const struct user_namespace *ns);
189  extern bool in_userns(const struct user_namespace *ancestor,
190  		       const struct user_namespace *child);
191  extern bool current_in_userns(const struct user_namespace *target_ns);
192  struct ns_common *ns_get_owner(struct ns_common *ns);
193  #else
194  
get_user_ns(struct user_namespace * ns)195  static inline struct user_namespace *get_user_ns(struct user_namespace *ns)
196  {
197  	return &init_user_ns;
198  }
199  
create_user_ns(struct cred * new)200  static inline int create_user_ns(struct cred *new)
201  {
202  	return -EINVAL;
203  }
204  
unshare_userns(unsigned long unshare_flags,struct cred ** new_cred)205  static inline int unshare_userns(unsigned long unshare_flags,
206  				 struct cred **new_cred)
207  {
208  	if (unshare_flags & CLONE_NEWUSER)
209  		return -EINVAL;
210  	return 0;
211  }
212  
put_user_ns(struct user_namespace * ns)213  static inline void put_user_ns(struct user_namespace *ns)
214  {
215  }
216  
userns_may_setgroups(const struct user_namespace * ns)217  static inline bool userns_may_setgroups(const struct user_namespace *ns)
218  {
219  	return true;
220  }
221  
in_userns(const struct user_namespace * ancestor,const struct user_namespace * child)222  static inline bool in_userns(const struct user_namespace *ancestor,
223  			     const struct user_namespace *child)
224  {
225  	return true;
226  }
227  
current_in_userns(const struct user_namespace * target_ns)228  static inline bool current_in_userns(const struct user_namespace *target_ns)
229  {
230  	return true;
231  }
232  
ns_get_owner(struct ns_common * ns)233  static inline struct ns_common *ns_get_owner(struct ns_common *ns)
234  {
235  	return ERR_PTR(-EPERM);
236  }
237  #endif
238  
239  #endif /* _LINUX_USER_H */
240