xref: /linux/security/selinux/hooks.c (revision 33fc69a05c50f00f1218408a56348bcab95b831d)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  *  Security-Enhanced Linux (SELinux) security module
4  *
5  *  This file contains the SELinux hook function implementations.
6  *
7  *  Authors:  Stephen Smalley, <stephen.smalley.work@gmail.com>
8  *	      Chris Vance, <cvance@nai.com>
9  *	      Wayne Salamon, <wsalamon@nai.com>
10  *	      James Morris <jmorris@redhat.com>
11  *
12  *  Copyright (C) 2001,2002 Networks Associates Technology, Inc.
13  *  Copyright (C) 2003-2008 Red Hat, Inc., James Morris <jmorris@redhat.com>
14  *					   Eric Paris <eparis@redhat.com>
15  *  Copyright (C) 2004-2005 Trusted Computer Solutions, Inc.
16  *			    <dgoeddel@trustedcs.com>
17  *  Copyright (C) 2006, 2007, 2009 Hewlett-Packard Development Company, L.P.
18  *	Paul Moore <paul@paul-moore.com>
19  *  Copyright (C) 2007 Hitachi Software Engineering Co., Ltd.
20  *		       Yuichi Nakamura <ynakam@hitachisoft.jp>
21  *  Copyright (C) 2016 Mellanox Technologies
22  */
23 
24 #include <linux/init.h>
25 #include <linux/kd.h>
26 #include <linux/kernel.h>
27 #include <linux/kernel_read_file.h>
28 #include <linux/errno.h>
29 #include <linux/sched/signal.h>
30 #include <linux/sched/task.h>
31 #include <linux/lsm_hooks.h>
32 #include <linux/xattr.h>
33 #include <linux/capability.h>
34 #include <linux/unistd.h>
35 #include <linux/mm.h>
36 #include <linux/mman.h>
37 #include <linux/slab.h>
38 #include <linux/pagemap.h>
39 #include <linux/proc_fs.h>
40 #include <linux/swap.h>
41 #include <linux/spinlock.h>
42 #include <linux/syscalls.h>
43 #include <linux/dcache.h>
44 #include <linux/file.h>
45 #include <linux/fdtable.h>
46 #include <linux/namei.h>
47 #include <linux/mount.h>
48 #include <linux/fs_context.h>
49 #include <linux/fs_parser.h>
50 #include <linux/netfilter_ipv4.h>
51 #include <linux/netfilter_ipv6.h>
52 #include <linux/tty.h>
53 #include <net/icmp.h>
54 #include <net/ip.h>		/* for local_port_range[] */
55 #include <net/tcp.h>		/* struct or_callable used in sock_rcv_skb */
56 #include <net/inet_connection_sock.h>
57 #include <net/net_namespace.h>
58 #include <net/netlabel.h>
59 #include <linux/uaccess.h>
60 #include <asm/ioctls.h>
61 #include <linux/atomic.h>
62 #include <linux/bitops.h>
63 #include <linux/interrupt.h>
64 #include <linux/netdevice.h>	/* for network interface checks */
65 #include <net/netlink.h>
66 #include <linux/tcp.h>
67 #include <linux/udp.h>
68 #include <linux/sctp.h>
69 #include <net/sctp/structs.h>
70 #include <linux/quota.h>
71 #include <linux/un.h>		/* for Unix socket types */
72 #include <net/af_unix.h>	/* for Unix socket types */
73 #include <linux/parser.h>
74 #include <linux/nfs_mount.h>
75 #include <net/ipv6.h>
76 #include <linux/hugetlb.h>
77 #include <linux/personality.h>
78 #include <linux/audit.h>
79 #include <linux/string.h>
80 #include <linux/mutex.h>
81 #include <linux/posix-timers.h>
82 #include <linux/syslog.h>
83 #include <linux/user_namespace.h>
84 #include <linux/export.h>
85 #include <linux/msg.h>
86 #include <linux/shm.h>
87 #include <uapi/linux/shm.h>
88 #include <linux/bpf.h>
89 #include <linux/kernfs.h>
90 #include <linux/stringhash.h>	/* for hashlen_string() */
91 #include <uapi/linux/mount.h>
92 #include <linux/fsnotify.h>
93 #include <linux/fanotify.h>
94 #include <linux/io_uring/cmd.h>
95 #include <uapi/linux/lsm.h>
96 
97 #include "avc.h"
98 #include "objsec.h"
99 #include "netif.h"
100 #include "netnode.h"
101 #include "netport.h"
102 #include "ibpkey.h"
103 #include "xfrm.h"
104 #include "netlabel.h"
105 #include "audit.h"
106 #include "avc_ss.h"
107 
108 #define SELINUX_INODE_INIT_XATTRS 1
109 
110 struct selinux_state selinux_state;
111 
112 /* SECMARK reference count */
113 static atomic_t selinux_secmark_refcount = ATOMIC_INIT(0);
114 
115 #ifdef CONFIG_SECURITY_SELINUX_DEVELOP
116 static int selinux_enforcing_boot __initdata;
117 
enforcing_setup(char * str)118 static int __init enforcing_setup(char *str)
119 {
120 	unsigned long enforcing;
121 	if (!kstrtoul(str, 0, &enforcing))
122 		selinux_enforcing_boot = enforcing ? 1 : 0;
123 	return 1;
124 }
125 __setup("enforcing=", enforcing_setup);
126 #else
127 #define selinux_enforcing_boot 1
128 #endif
129 
130 int selinux_enabled_boot __initdata = 1;
131 #ifdef CONFIG_SECURITY_SELINUX_BOOTPARAM
selinux_enabled_setup(char * str)132 static int __init selinux_enabled_setup(char *str)
133 {
134 	unsigned long enabled;
135 	if (!kstrtoul(str, 0, &enabled))
136 		selinux_enabled_boot = enabled ? 1 : 0;
137 	return 1;
138 }
139 __setup("selinux=", selinux_enabled_setup);
140 #endif
141 
checkreqprot_setup(char * str)142 static int __init checkreqprot_setup(char *str)
143 {
144 	unsigned long checkreqprot;
145 
146 	if (!kstrtoul(str, 0, &checkreqprot)) {
147 		if (checkreqprot)
148 			pr_err("SELinux: checkreqprot set to 1 via kernel parameter.  This is no longer supported.\n");
149 	}
150 	return 1;
151 }
152 __setup("checkreqprot=", checkreqprot_setup);
153 
154 /**
155  * selinux_secmark_enabled - Check to see if SECMARK is currently enabled
156  *
157  * Description:
158  * This function checks the SECMARK reference counter to see if any SECMARK
159  * targets are currently configured, if the reference counter is greater than
160  * zero SECMARK is considered to be enabled.  Returns true (1) if SECMARK is
161  * enabled, false (0) if SECMARK is disabled.  If the always_check_network
162  * policy capability is enabled, SECMARK is always considered enabled.
163  *
164  */
selinux_secmark_enabled(void)165 static int selinux_secmark_enabled(void)
166 {
167 	return (selinux_policycap_alwaysnetwork() ||
168 		atomic_read(&selinux_secmark_refcount));
169 }
170 
171 /**
172  * selinux_peerlbl_enabled - Check to see if peer labeling is currently enabled
173  *
174  * Description:
175  * This function checks if NetLabel or labeled IPSEC is enabled.  Returns true
176  * (1) if any are enabled or false (0) if neither are enabled.  If the
177  * always_check_network policy capability is enabled, peer labeling
178  * is always considered enabled.
179  *
180  */
selinux_peerlbl_enabled(void)181 static int selinux_peerlbl_enabled(void)
182 {
183 	return (selinux_policycap_alwaysnetwork() ||
184 		netlbl_enabled() || selinux_xfrm_enabled());
185 }
186 
selinux_netcache_avc_callback(u32 event)187 static int selinux_netcache_avc_callback(u32 event)
188 {
189 	if (event == AVC_CALLBACK_RESET) {
190 		sel_netif_flush();
191 		sel_netnode_flush();
192 		sel_netport_flush();
193 		synchronize_net();
194 	}
195 	return 0;
196 }
197 
selinux_lsm_notifier_avc_callback(u32 event)198 static int selinux_lsm_notifier_avc_callback(u32 event)
199 {
200 	if (event == AVC_CALLBACK_RESET) {
201 		sel_ib_pkey_flush();
202 		call_blocking_lsm_notifier(LSM_POLICY_CHANGE, NULL);
203 	}
204 
205 	return 0;
206 }
207 
208 /*
209  * initialise the security for the init task
210  */
cred_init_security(void)211 static void cred_init_security(void)
212 {
213 	struct task_security_struct *tsec;
214 
215 	/* NOTE: the lsm framework zeros out the buffer on allocation */
216 
217 	tsec = selinux_cred(unrcu_pointer(current->real_cred));
218 	tsec->osid = tsec->sid = tsec->avdcache.sid = SECINITSID_KERNEL;
219 }
220 
221 /*
222  * get the security ID of a set of credentials
223  */
cred_sid(const struct cred * cred)224 static inline u32 cred_sid(const struct cred *cred)
225 {
226 	const struct task_security_struct *tsec;
227 
228 	tsec = selinux_cred(cred);
229 	return tsec->sid;
230 }
231 
__ad_net_init(struct common_audit_data * ad,struct lsm_network_audit * net,int ifindex,struct sock * sk,u16 family)232 static void __ad_net_init(struct common_audit_data *ad,
233 			  struct lsm_network_audit *net,
234 			  int ifindex, struct sock *sk, u16 family)
235 {
236 	ad->type = LSM_AUDIT_DATA_NET;
237 	ad->u.net = net;
238 	net->netif = ifindex;
239 	net->sk = sk;
240 	net->family = family;
241 }
242 
ad_net_init_from_sk(struct common_audit_data * ad,struct lsm_network_audit * net,struct sock * sk)243 static void ad_net_init_from_sk(struct common_audit_data *ad,
244 				struct lsm_network_audit *net,
245 				struct sock *sk)
246 {
247 	__ad_net_init(ad, net, 0, sk, 0);
248 }
249 
ad_net_init_from_iif(struct common_audit_data * ad,struct lsm_network_audit * net,int ifindex,u16 family)250 static void ad_net_init_from_iif(struct common_audit_data *ad,
251 				 struct lsm_network_audit *net,
252 				 int ifindex, u16 family)
253 {
254 	__ad_net_init(ad, net, ifindex, NULL, family);
255 }
256 
257 /*
258  * get the objective security ID of a task
259  */
task_sid_obj(const struct task_struct * task)260 static inline u32 task_sid_obj(const struct task_struct *task)
261 {
262 	u32 sid;
263 
264 	rcu_read_lock();
265 	sid = cred_sid(__task_cred(task));
266 	rcu_read_unlock();
267 	return sid;
268 }
269 
270 static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry);
271 
272 /*
273  * Try reloading inode security labels that have been marked as invalid.  The
274  * @may_sleep parameter indicates when sleeping and thus reloading labels is
275  * allowed; when set to false, returns -ECHILD when the label is
276  * invalid.  The @dentry parameter should be set to a dentry of the inode.
277  */
__inode_security_revalidate(struct inode * inode,struct dentry * dentry,bool may_sleep)278 static int __inode_security_revalidate(struct inode *inode,
279 				       struct dentry *dentry,
280 				       bool may_sleep)
281 {
282 	if (!selinux_initialized())
283 		return 0;
284 
285 	if (may_sleep)
286 		might_sleep();
287 	else
288 		return -ECHILD;
289 
290 	/*
291 	 * Check to ensure that an inode's SELinux state is valid and try
292 	 * reloading the inode security label if necessary.  This will fail if
293 	 * @dentry is NULL and no dentry for this inode can be found; in that
294 	 * case, continue using the old label.
295 	 */
296 	inode_doinit_with_dentry(inode, dentry);
297 	return 0;
298 }
299 
inode_security_novalidate(struct inode * inode)300 static struct inode_security_struct *inode_security_novalidate(struct inode *inode)
301 {
302 	return selinux_inode(inode);
303 }
304 
inode_security_rcu(struct inode * inode,bool rcu)305 static inline struct inode_security_struct *inode_security_rcu(struct inode *inode,
306 							       bool rcu)
307 {
308 	int rc;
309 	struct inode_security_struct *isec = selinux_inode(inode);
310 
311 	/* check below is racy, but revalidate will recheck with lock held */
312 	if (data_race(likely(isec->initialized == LABEL_INITIALIZED)))
313 		return isec;
314 	rc = __inode_security_revalidate(inode, NULL, !rcu);
315 	if (rc)
316 		return ERR_PTR(rc);
317 	return isec;
318 }
319 
320 /*
321  * Get the security label of an inode.
322  */
inode_security(struct inode * inode)323 static inline struct inode_security_struct *inode_security(struct inode *inode)
324 {
325 	struct inode_security_struct *isec = selinux_inode(inode);
326 
327 	/* check below is racy, but revalidate will recheck with lock held */
328 	if (data_race(likely(isec->initialized == LABEL_INITIALIZED)))
329 		return isec;
330 	__inode_security_revalidate(inode, NULL, true);
331 	return isec;
332 }
333 
backing_inode_security_novalidate(struct dentry * dentry)334 static inline struct inode_security_struct *backing_inode_security_novalidate(struct dentry *dentry)
335 {
336 	return selinux_inode(d_backing_inode(dentry));
337 }
338 
339 /*
340  * Get the security label of a dentry's backing inode.
341  */
backing_inode_security(struct dentry * dentry)342 static inline struct inode_security_struct *backing_inode_security(struct dentry *dentry)
343 {
344 	struct inode *inode = d_backing_inode(dentry);
345 	struct inode_security_struct *isec = selinux_inode(inode);
346 
347 	/* check below is racy, but revalidate will recheck with lock held */
348 	if (data_race(likely(isec->initialized == LABEL_INITIALIZED)))
349 		return isec;
350 	__inode_security_revalidate(inode, dentry, true);
351 	return isec;
352 }
353 
inode_free_security(struct inode * inode)354 static void inode_free_security(struct inode *inode)
355 {
356 	struct inode_security_struct *isec = selinux_inode(inode);
357 	struct superblock_security_struct *sbsec;
358 
359 	if (!isec)
360 		return;
361 	sbsec = selinux_superblock(inode->i_sb);
362 	/*
363 	 * As not all inode security structures are in a list, we check for
364 	 * empty list outside of the lock to make sure that we won't waste
365 	 * time taking a lock doing nothing.
366 	 *
367 	 * The list_del_init() function can be safely called more than once.
368 	 * It should not be possible for this function to be called with
369 	 * concurrent list_add(), but for better safety against future changes
370 	 * in the code, we use list_empty_careful() here.
371 	 */
372 	if (!list_empty_careful(&isec->list)) {
373 		spin_lock(&sbsec->isec_lock);
374 		list_del_init(&isec->list);
375 		spin_unlock(&sbsec->isec_lock);
376 	}
377 }
378 
379 struct selinux_mnt_opts {
380 	u32 fscontext_sid;
381 	u32 context_sid;
382 	u32 rootcontext_sid;
383 	u32 defcontext_sid;
384 };
385 
selinux_free_mnt_opts(void * mnt_opts)386 static void selinux_free_mnt_opts(void *mnt_opts)
387 {
388 	kfree(mnt_opts);
389 }
390 
391 enum {
392 	Opt_error = -1,
393 	Opt_context = 0,
394 	Opt_defcontext = 1,
395 	Opt_fscontext = 2,
396 	Opt_rootcontext = 3,
397 	Opt_seclabel = 4,
398 };
399 
400 #define A(s, has_arg) {#s, sizeof(#s) - 1, Opt_##s, has_arg}
401 static const struct {
402 	const char *name;
403 	int len;
404 	int opt;
405 	bool has_arg;
406 } tokens[] = {
407 	A(context, true),
408 	A(fscontext, true),
409 	A(defcontext, true),
410 	A(rootcontext, true),
411 	A(seclabel, false),
412 };
413 #undef A
414 
match_opt_prefix(char * s,int l,char ** arg)415 static int match_opt_prefix(char *s, int l, char **arg)
416 {
417 	unsigned int i;
418 
419 	for (i = 0; i < ARRAY_SIZE(tokens); i++) {
420 		size_t len = tokens[i].len;
421 		if (len > l || memcmp(s, tokens[i].name, len))
422 			continue;
423 		if (tokens[i].has_arg) {
424 			if (len == l || s[len] != '=')
425 				continue;
426 			*arg = s + len + 1;
427 		} else if (len != l)
428 			continue;
429 		return tokens[i].opt;
430 	}
431 	return Opt_error;
432 }
433 
434 #define SEL_MOUNT_FAIL_MSG "SELinux:  duplicate or incompatible mount options\n"
435 
may_context_mount_sb_relabel(u32 sid,struct superblock_security_struct * sbsec,const struct cred * cred)436 static int may_context_mount_sb_relabel(u32 sid,
437 			struct superblock_security_struct *sbsec,
438 			const struct cred *cred)
439 {
440 	const struct task_security_struct *tsec = selinux_cred(cred);
441 	int rc;
442 
443 	rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
444 			  FILESYSTEM__RELABELFROM, NULL);
445 	if (rc)
446 		return rc;
447 
448 	rc = avc_has_perm(tsec->sid, sid, SECCLASS_FILESYSTEM,
449 			  FILESYSTEM__RELABELTO, NULL);
450 	return rc;
451 }
452 
may_context_mount_inode_relabel(u32 sid,struct superblock_security_struct * sbsec,const struct cred * cred)453 static int may_context_mount_inode_relabel(u32 sid,
454 			struct superblock_security_struct *sbsec,
455 			const struct cred *cred)
456 {
457 	const struct task_security_struct *tsec = selinux_cred(cred);
458 	int rc;
459 	rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
460 			  FILESYSTEM__RELABELFROM, NULL);
461 	if (rc)
462 		return rc;
463 
464 	rc = avc_has_perm(sid, sbsec->sid, SECCLASS_FILESYSTEM,
465 			  FILESYSTEM__ASSOCIATE, NULL);
466 	return rc;
467 }
468 
selinux_is_genfs_special_handling(struct super_block * sb)469 static int selinux_is_genfs_special_handling(struct super_block *sb)
470 {
471 	/* Special handling. Genfs but also in-core setxattr handler */
472 	return	!strcmp(sb->s_type->name, "sysfs") ||
473 		!strcmp(sb->s_type->name, "pstore") ||
474 		!strcmp(sb->s_type->name, "debugfs") ||
475 		!strcmp(sb->s_type->name, "tracefs") ||
476 		!strcmp(sb->s_type->name, "rootfs") ||
477 		(selinux_policycap_cgroupseclabel() &&
478 		 (!strcmp(sb->s_type->name, "cgroup") ||
479 		  !strcmp(sb->s_type->name, "cgroup2"))) ||
480 		(selinux_policycap_functionfs_seclabel() &&
481 		 !strcmp(sb->s_type->name, "functionfs"));
482 }
483 
selinux_is_sblabel_mnt(struct super_block * sb)484 static int selinux_is_sblabel_mnt(struct super_block *sb)
485 {
486 	struct superblock_security_struct *sbsec = selinux_superblock(sb);
487 
488 	/*
489 	 * IMPORTANT: Double-check logic in this function when adding a new
490 	 * SECURITY_FS_USE_* definition!
491 	 */
492 	BUILD_BUG_ON(SECURITY_FS_USE_MAX != 7);
493 
494 	switch (sbsec->behavior) {
495 	case SECURITY_FS_USE_XATTR:
496 	case SECURITY_FS_USE_TRANS:
497 	case SECURITY_FS_USE_TASK:
498 	case SECURITY_FS_USE_NATIVE:
499 		return 1;
500 
501 	case SECURITY_FS_USE_GENFS:
502 		return selinux_is_genfs_special_handling(sb);
503 
504 	/* Never allow relabeling on context mounts */
505 	case SECURITY_FS_USE_MNTPOINT:
506 	case SECURITY_FS_USE_NONE:
507 	default:
508 		return 0;
509 	}
510 }
511 
sb_check_xattr_support(struct super_block * sb)512 static int sb_check_xattr_support(struct super_block *sb)
513 {
514 	struct superblock_security_struct *sbsec = selinux_superblock(sb);
515 	struct dentry *root = sb->s_root;
516 	struct inode *root_inode = d_backing_inode(root);
517 	u32 sid;
518 	int rc;
519 
520 	/*
521 	 * Make sure that the xattr handler exists and that no
522 	 * error other than -ENODATA is returned by getxattr on
523 	 * the root directory.  -ENODATA is ok, as this may be
524 	 * the first boot of the SELinux kernel before we have
525 	 * assigned xattr values to the filesystem.
526 	 */
527 	if (!(root_inode->i_opflags & IOP_XATTR)) {
528 		pr_warn("SELinux: (dev %s, type %s) has no xattr support\n",
529 			sb->s_id, sb->s_type->name);
530 		goto fallback;
531 	}
532 
533 	rc = __vfs_getxattr(root, root_inode, XATTR_NAME_SELINUX, NULL, 0);
534 	if (rc < 0 && rc != -ENODATA) {
535 		if (rc == -EOPNOTSUPP) {
536 			pr_warn("SELinux: (dev %s, type %s) has no security xattr handler\n",
537 				sb->s_id, sb->s_type->name);
538 			goto fallback;
539 		} else {
540 			pr_warn("SELinux: (dev %s, type %s) getxattr errno %d\n",
541 				sb->s_id, sb->s_type->name, -rc);
542 			return rc;
543 		}
544 	}
545 	return 0;
546 
547 fallback:
548 	/* No xattr support - try to fallback to genfs if possible. */
549 	rc = security_genfs_sid(sb->s_type->name, "/",
550 				SECCLASS_DIR, &sid);
551 	if (rc)
552 		return -EOPNOTSUPP;
553 
554 	pr_warn("SELinux: (dev %s, type %s) falling back to genfs\n",
555 		sb->s_id, sb->s_type->name);
556 	sbsec->behavior = SECURITY_FS_USE_GENFS;
557 	sbsec->sid = sid;
558 	return 0;
559 }
560 
sb_finish_set_opts(struct super_block * sb)561 static int sb_finish_set_opts(struct super_block *sb)
562 {
563 	struct superblock_security_struct *sbsec = selinux_superblock(sb);
564 	struct dentry *root = sb->s_root;
565 	struct inode *root_inode = d_backing_inode(root);
566 	int rc = 0;
567 
568 	if (sbsec->behavior == SECURITY_FS_USE_XATTR) {
569 		rc = sb_check_xattr_support(sb);
570 		if (rc)
571 			return rc;
572 	}
573 
574 	sbsec->flags |= SE_SBINITIALIZED;
575 
576 	/*
577 	 * Explicitly set or clear SBLABEL_MNT.  It's not sufficient to simply
578 	 * leave the flag untouched because sb_clone_mnt_opts might be handing
579 	 * us a superblock that needs the flag to be cleared.
580 	 */
581 	if (selinux_is_sblabel_mnt(sb))
582 		sbsec->flags |= SBLABEL_MNT;
583 	else
584 		sbsec->flags &= ~SBLABEL_MNT;
585 
586 	/* Initialize the root inode. */
587 	rc = inode_doinit_with_dentry(root_inode, root);
588 
589 	/* Initialize any other inodes associated with the superblock, e.g.
590 	   inodes created prior to initial policy load or inodes created
591 	   during get_sb by a pseudo filesystem that directly
592 	   populates itself. */
593 	spin_lock(&sbsec->isec_lock);
594 	while (!list_empty(&sbsec->isec_head)) {
595 		struct inode_security_struct *isec =
596 				list_first_entry(&sbsec->isec_head,
597 					   struct inode_security_struct, list);
598 		struct inode *inode = isec->inode;
599 		list_del_init(&isec->list);
600 		spin_unlock(&sbsec->isec_lock);
601 		inode = igrab(inode);
602 		if (inode) {
603 			if (!IS_PRIVATE(inode))
604 				inode_doinit_with_dentry(inode, NULL);
605 			iput(inode);
606 		}
607 		spin_lock(&sbsec->isec_lock);
608 	}
609 	spin_unlock(&sbsec->isec_lock);
610 	return rc;
611 }
612 
bad_option(struct superblock_security_struct * sbsec,char flag,u32 old_sid,u32 new_sid)613 static int bad_option(struct superblock_security_struct *sbsec, char flag,
614 		      u32 old_sid, u32 new_sid)
615 {
616 	char mnt_flags = sbsec->flags & SE_MNTMASK;
617 
618 	/* check if the old mount command had the same options */
619 	if (sbsec->flags & SE_SBINITIALIZED)
620 		if (!(sbsec->flags & flag) ||
621 		    (old_sid != new_sid))
622 			return 1;
623 
624 	/* check if we were passed the same options twice,
625 	 * aka someone passed context=a,context=b
626 	 */
627 	if (!(sbsec->flags & SE_SBINITIALIZED))
628 		if (mnt_flags & flag)
629 			return 1;
630 	return 0;
631 }
632 
633 /*
634  * Allow filesystems with binary mount data to explicitly set mount point
635  * labeling information.
636  */
selinux_set_mnt_opts(struct super_block * sb,void * mnt_opts,unsigned long kern_flags,unsigned long * set_kern_flags)637 static int selinux_set_mnt_opts(struct super_block *sb,
638 				void *mnt_opts,
639 				unsigned long kern_flags,
640 				unsigned long *set_kern_flags)
641 {
642 	const struct cred *cred = current_cred();
643 	struct superblock_security_struct *sbsec = selinux_superblock(sb);
644 	struct dentry *root = sb->s_root;
645 	struct selinux_mnt_opts *opts = mnt_opts;
646 	struct inode_security_struct *root_isec;
647 	u32 fscontext_sid = 0, context_sid = 0, rootcontext_sid = 0;
648 	u32 defcontext_sid = 0;
649 	int rc = 0;
650 
651 	/*
652 	 * Specifying internal flags without providing a place to
653 	 * place the results is not allowed
654 	 */
655 	if (kern_flags && !set_kern_flags)
656 		return -EINVAL;
657 
658 	mutex_lock(&sbsec->lock);
659 
660 	if (!selinux_initialized()) {
661 		if (!opts) {
662 			/* Defer initialization until selinux_complete_init,
663 			   after the initial policy is loaded and the security
664 			   server is ready to handle calls. */
665 			if (kern_flags & SECURITY_LSM_NATIVE_LABELS) {
666 				sbsec->flags |= SE_SBNATIVE;
667 				*set_kern_flags |= SECURITY_LSM_NATIVE_LABELS;
668 			}
669 			goto out;
670 		}
671 		rc = -EINVAL;
672 		pr_warn("SELinux: Unable to set superblock options "
673 			"before the security server is initialized\n");
674 		goto out;
675 	}
676 
677 	/*
678 	 * Binary mount data FS will come through this function twice.  Once
679 	 * from an explicit call and once from the generic calls from the vfs.
680 	 * Since the generic VFS calls will not contain any security mount data
681 	 * we need to skip the double mount verification.
682 	 *
683 	 * This does open a hole in which we will not notice if the first
684 	 * mount using this sb set explicit options and a second mount using
685 	 * this sb does not set any security options.  (The first options
686 	 * will be used for both mounts)
687 	 */
688 	if ((sbsec->flags & SE_SBINITIALIZED) && (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA)
689 	    && !opts)
690 		goto out;
691 
692 	root_isec = backing_inode_security_novalidate(root);
693 
694 	/*
695 	 * parse the mount options, check if they are valid sids.
696 	 * also check if someone is trying to mount the same sb more
697 	 * than once with different security options.
698 	 */
699 	if (opts) {
700 		if (opts->fscontext_sid) {
701 			fscontext_sid = opts->fscontext_sid;
702 			if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid,
703 					fscontext_sid))
704 				goto out_double_mount;
705 			sbsec->flags |= FSCONTEXT_MNT;
706 		}
707 		if (opts->context_sid) {
708 			context_sid = opts->context_sid;
709 			if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid,
710 					context_sid))
711 				goto out_double_mount;
712 			sbsec->flags |= CONTEXT_MNT;
713 		}
714 		if (opts->rootcontext_sid) {
715 			rootcontext_sid = opts->rootcontext_sid;
716 			if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid,
717 					rootcontext_sid))
718 				goto out_double_mount;
719 			sbsec->flags |= ROOTCONTEXT_MNT;
720 		}
721 		if (opts->defcontext_sid) {
722 			defcontext_sid = opts->defcontext_sid;
723 			if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid,
724 					defcontext_sid))
725 				goto out_double_mount;
726 			sbsec->flags |= DEFCONTEXT_MNT;
727 		}
728 	}
729 
730 	if (sbsec->flags & SE_SBINITIALIZED) {
731 		/* previously mounted with options, but not on this attempt? */
732 		if ((sbsec->flags & SE_MNTMASK) && !opts)
733 			goto out_double_mount;
734 		rc = 0;
735 		goto out;
736 	}
737 
738 	if (strcmp(sb->s_type->name, "proc") == 0)
739 		sbsec->flags |= SE_SBPROC | SE_SBGENFS;
740 
741 	if (!strcmp(sb->s_type->name, "debugfs") ||
742 	    !strcmp(sb->s_type->name, "tracefs") ||
743 	    !strcmp(sb->s_type->name, "binder") ||
744 	    !strcmp(sb->s_type->name, "bpf") ||
745 	    !strcmp(sb->s_type->name, "pstore") ||
746 	    !strcmp(sb->s_type->name, "securityfs") ||
747 	    (selinux_policycap_functionfs_seclabel() &&
748 	     !strcmp(sb->s_type->name, "functionfs")))
749 		sbsec->flags |= SE_SBGENFS;
750 
751 	if (!strcmp(sb->s_type->name, "sysfs") ||
752 	    !strcmp(sb->s_type->name, "cgroup") ||
753 	    !strcmp(sb->s_type->name, "cgroup2"))
754 		sbsec->flags |= SE_SBGENFS | SE_SBGENFS_XATTR;
755 
756 	if (!sbsec->behavior) {
757 		/*
758 		 * Determine the labeling behavior to use for this
759 		 * filesystem type.
760 		 */
761 		rc = security_fs_use(sb);
762 		if (rc) {
763 			pr_warn("%s: security_fs_use(%s) returned %d\n",
764 					__func__, sb->s_type->name, rc);
765 			goto out;
766 		}
767 	}
768 
769 	/*
770 	 * If this is a user namespace mount and the filesystem type is not
771 	 * explicitly whitelisted, then no contexts are allowed on the command
772 	 * line and security labels must be ignored.
773 	 */
774 	if (sb->s_user_ns != &init_user_ns &&
775 	    strcmp(sb->s_type->name, "tmpfs") &&
776 	    strcmp(sb->s_type->name, "ramfs") &&
777 	    strcmp(sb->s_type->name, "devpts") &&
778 	    strcmp(sb->s_type->name, "overlay")) {
779 		if (context_sid || fscontext_sid || rootcontext_sid ||
780 		    defcontext_sid) {
781 			rc = -EACCES;
782 			goto out;
783 		}
784 		if (sbsec->behavior == SECURITY_FS_USE_XATTR) {
785 			sbsec->behavior = SECURITY_FS_USE_MNTPOINT;
786 			rc = security_transition_sid(current_sid(),
787 						     current_sid(),
788 						     SECCLASS_FILE, NULL,
789 						     &sbsec->mntpoint_sid);
790 			if (rc)
791 				goto out;
792 		}
793 		goto out_set_opts;
794 	}
795 
796 	/* sets the context of the superblock for the fs being mounted. */
797 	if (fscontext_sid) {
798 		rc = may_context_mount_sb_relabel(fscontext_sid, sbsec, cred);
799 		if (rc)
800 			goto out;
801 
802 		sbsec->sid = fscontext_sid;
803 	}
804 
805 	/*
806 	 * Switch to using mount point labeling behavior.
807 	 * sets the label used on all file below the mountpoint, and will set
808 	 * the superblock context if not already set.
809 	 */
810 	if (sbsec->flags & SE_SBNATIVE) {
811 		/*
812 		 * This means we are initializing a superblock that has been
813 		 * mounted before the SELinux was initialized and the
814 		 * filesystem requested native labeling. We had already
815 		 * returned SECURITY_LSM_NATIVE_LABELS in *set_kern_flags
816 		 * in the original mount attempt, so now we just need to set
817 		 * the SECURITY_FS_USE_NATIVE behavior.
818 		 */
819 		sbsec->behavior = SECURITY_FS_USE_NATIVE;
820 	} else if (kern_flags & SECURITY_LSM_NATIVE_LABELS && !context_sid) {
821 		sbsec->behavior = SECURITY_FS_USE_NATIVE;
822 		*set_kern_flags |= SECURITY_LSM_NATIVE_LABELS;
823 	}
824 
825 	if (context_sid) {
826 		if (!fscontext_sid) {
827 			rc = may_context_mount_sb_relabel(context_sid, sbsec,
828 							  cred);
829 			if (rc)
830 				goto out;
831 			sbsec->sid = context_sid;
832 		} else {
833 			rc = may_context_mount_inode_relabel(context_sid, sbsec,
834 							     cred);
835 			if (rc)
836 				goto out;
837 		}
838 		if (!rootcontext_sid)
839 			rootcontext_sid = context_sid;
840 
841 		sbsec->mntpoint_sid = context_sid;
842 		sbsec->behavior = SECURITY_FS_USE_MNTPOINT;
843 	}
844 
845 	if (rootcontext_sid) {
846 		rc = may_context_mount_inode_relabel(rootcontext_sid, sbsec,
847 						     cred);
848 		if (rc)
849 			goto out;
850 
851 		root_isec->sid = rootcontext_sid;
852 		root_isec->initialized = LABEL_INITIALIZED;
853 	}
854 
855 	if (defcontext_sid) {
856 		if (sbsec->behavior != SECURITY_FS_USE_XATTR &&
857 			sbsec->behavior != SECURITY_FS_USE_NATIVE) {
858 			rc = -EINVAL;
859 			pr_warn("SELinux: defcontext option is "
860 			       "invalid for this filesystem type\n");
861 			goto out;
862 		}
863 
864 		if (defcontext_sid != sbsec->def_sid) {
865 			rc = may_context_mount_inode_relabel(defcontext_sid,
866 							     sbsec, cred);
867 			if (rc)
868 				goto out;
869 		}
870 
871 		sbsec->def_sid = defcontext_sid;
872 	}
873 
874 out_set_opts:
875 	rc = sb_finish_set_opts(sb);
876 out:
877 	mutex_unlock(&sbsec->lock);
878 	return rc;
879 out_double_mount:
880 	rc = -EINVAL;
881 	pr_warn("SELinux: mount invalid.  Same superblock, different "
882 	       "security settings for (dev %s, type %s)\n", sb->s_id,
883 	       sb->s_type->name);
884 	goto out;
885 }
886 
selinux_cmp_sb_context(const struct super_block * oldsb,const struct super_block * newsb)887 static int selinux_cmp_sb_context(const struct super_block *oldsb,
888 				    const struct super_block *newsb)
889 {
890 	struct superblock_security_struct *old = selinux_superblock(oldsb);
891 	struct superblock_security_struct *new = selinux_superblock(newsb);
892 	char oldflags = old->flags & SE_MNTMASK;
893 	char newflags = new->flags & SE_MNTMASK;
894 
895 	if (oldflags != newflags)
896 		goto mismatch;
897 	if ((oldflags & FSCONTEXT_MNT) && old->sid != new->sid)
898 		goto mismatch;
899 	if ((oldflags & CONTEXT_MNT) && old->mntpoint_sid != new->mntpoint_sid)
900 		goto mismatch;
901 	if ((oldflags & DEFCONTEXT_MNT) && old->def_sid != new->def_sid)
902 		goto mismatch;
903 	if (oldflags & ROOTCONTEXT_MNT) {
904 		struct inode_security_struct *oldroot = backing_inode_security(oldsb->s_root);
905 		struct inode_security_struct *newroot = backing_inode_security(newsb->s_root);
906 		if (oldroot->sid != newroot->sid)
907 			goto mismatch;
908 	}
909 	return 0;
910 mismatch:
911 	pr_warn("SELinux: mount invalid.  Same superblock, "
912 			    "different security settings for (dev %s, "
913 			    "type %s)\n", newsb->s_id, newsb->s_type->name);
914 	return -EBUSY;
915 }
916 
selinux_sb_clone_mnt_opts(const struct super_block * oldsb,struct super_block * newsb,unsigned long kern_flags,unsigned long * set_kern_flags)917 static int selinux_sb_clone_mnt_opts(const struct super_block *oldsb,
918 					struct super_block *newsb,
919 					unsigned long kern_flags,
920 					unsigned long *set_kern_flags)
921 {
922 	int rc = 0;
923 	const struct superblock_security_struct *oldsbsec =
924 						selinux_superblock(oldsb);
925 	struct superblock_security_struct *newsbsec = selinux_superblock(newsb);
926 
927 	int set_fscontext =	(oldsbsec->flags & FSCONTEXT_MNT);
928 	int set_context =	(oldsbsec->flags & CONTEXT_MNT);
929 	int set_rootcontext =	(oldsbsec->flags & ROOTCONTEXT_MNT);
930 
931 	/*
932 	 * Specifying internal flags without providing a place to
933 	 * place the results is not allowed.
934 	 */
935 	if (kern_flags && !set_kern_flags)
936 		return -EINVAL;
937 
938 	mutex_lock(&newsbsec->lock);
939 
940 	/*
941 	 * if the parent was able to be mounted it clearly had no special lsm
942 	 * mount options.  thus we can safely deal with this superblock later
943 	 */
944 	if (!selinux_initialized()) {
945 		if (kern_flags & SECURITY_LSM_NATIVE_LABELS) {
946 			newsbsec->flags |= SE_SBNATIVE;
947 			*set_kern_flags |= SECURITY_LSM_NATIVE_LABELS;
948 		}
949 		goto out;
950 	}
951 
952 	/* how can we clone if the old one wasn't set up?? */
953 	BUG_ON(!(oldsbsec->flags & SE_SBINITIALIZED));
954 
955 	/* if fs is reusing a sb, make sure that the contexts match */
956 	if (newsbsec->flags & SE_SBINITIALIZED) {
957 		mutex_unlock(&newsbsec->lock);
958 		if ((kern_flags & SECURITY_LSM_NATIVE_LABELS) && !set_context)
959 			*set_kern_flags |= SECURITY_LSM_NATIVE_LABELS;
960 		return selinux_cmp_sb_context(oldsb, newsb);
961 	}
962 
963 	newsbsec->flags = oldsbsec->flags;
964 
965 	newsbsec->sid = oldsbsec->sid;
966 	newsbsec->def_sid = oldsbsec->def_sid;
967 	newsbsec->behavior = oldsbsec->behavior;
968 
969 	if (newsbsec->behavior == SECURITY_FS_USE_NATIVE &&
970 		!(kern_flags & SECURITY_LSM_NATIVE_LABELS) && !set_context) {
971 		rc = security_fs_use(newsb);
972 		if (rc)
973 			goto out;
974 	}
975 
976 	if (kern_flags & SECURITY_LSM_NATIVE_LABELS && !set_context) {
977 		newsbsec->behavior = SECURITY_FS_USE_NATIVE;
978 		*set_kern_flags |= SECURITY_LSM_NATIVE_LABELS;
979 	}
980 
981 	if (set_context) {
982 		u32 sid = oldsbsec->mntpoint_sid;
983 
984 		if (!set_fscontext)
985 			newsbsec->sid = sid;
986 		if (!set_rootcontext) {
987 			struct inode_security_struct *newisec = backing_inode_security(newsb->s_root);
988 			newisec->sid = sid;
989 		}
990 		newsbsec->mntpoint_sid = sid;
991 	}
992 	if (set_rootcontext) {
993 		const struct inode_security_struct *oldisec = backing_inode_security(oldsb->s_root);
994 		struct inode_security_struct *newisec = backing_inode_security(newsb->s_root);
995 
996 		newisec->sid = oldisec->sid;
997 	}
998 
999 	sb_finish_set_opts(newsb);
1000 out:
1001 	mutex_unlock(&newsbsec->lock);
1002 	return rc;
1003 }
1004 
1005 /*
1006  * NOTE: the caller is responsible for freeing the memory even if on error.
1007  */
selinux_add_opt(int token,const char * s,void ** mnt_opts)1008 static int selinux_add_opt(int token, const char *s, void **mnt_opts)
1009 {
1010 	struct selinux_mnt_opts *opts = *mnt_opts;
1011 	u32 *dst_sid;
1012 	int rc;
1013 
1014 	if (token == Opt_seclabel)
1015 		/* eaten and completely ignored */
1016 		return 0;
1017 	if (!s)
1018 		return -EINVAL;
1019 
1020 	if (!selinux_initialized()) {
1021 		pr_warn("SELinux: Unable to set superblock options before the security server is initialized\n");
1022 		return -EINVAL;
1023 	}
1024 
1025 	if (!opts) {
1026 		opts = kzalloc(sizeof(*opts), GFP_KERNEL);
1027 		if (!opts)
1028 			return -ENOMEM;
1029 		*mnt_opts = opts;
1030 	}
1031 
1032 	switch (token) {
1033 	case Opt_context:
1034 		if (opts->context_sid || opts->defcontext_sid)
1035 			goto err;
1036 		dst_sid = &opts->context_sid;
1037 		break;
1038 	case Opt_fscontext:
1039 		if (opts->fscontext_sid)
1040 			goto err;
1041 		dst_sid = &opts->fscontext_sid;
1042 		break;
1043 	case Opt_rootcontext:
1044 		if (opts->rootcontext_sid)
1045 			goto err;
1046 		dst_sid = &opts->rootcontext_sid;
1047 		break;
1048 	case Opt_defcontext:
1049 		if (opts->context_sid || opts->defcontext_sid)
1050 			goto err;
1051 		dst_sid = &opts->defcontext_sid;
1052 		break;
1053 	default:
1054 		WARN_ON(1);
1055 		return -EINVAL;
1056 	}
1057 	rc = security_context_str_to_sid(s, dst_sid, GFP_KERNEL);
1058 	if (rc)
1059 		pr_warn("SELinux: security_context_str_to_sid (%s) failed with errno=%d\n",
1060 			s, rc);
1061 	return rc;
1062 
1063 err:
1064 	pr_warn(SEL_MOUNT_FAIL_MSG);
1065 	return -EINVAL;
1066 }
1067 
show_sid(struct seq_file * m,u32 sid)1068 static int show_sid(struct seq_file *m, u32 sid)
1069 {
1070 	char *context = NULL;
1071 	u32 len;
1072 	int rc;
1073 
1074 	rc = security_sid_to_context(sid, &context, &len);
1075 	if (!rc) {
1076 		bool has_comma = strchr(context, ',');
1077 
1078 		seq_putc(m, '=');
1079 		if (has_comma)
1080 			seq_putc(m, '\"');
1081 		seq_escape(m, context, "\"\n\\");
1082 		if (has_comma)
1083 			seq_putc(m, '\"');
1084 	}
1085 	kfree(context);
1086 	return rc;
1087 }
1088 
selinux_sb_show_options(struct seq_file * m,struct super_block * sb)1089 static int selinux_sb_show_options(struct seq_file *m, struct super_block *sb)
1090 {
1091 	struct superblock_security_struct *sbsec = selinux_superblock(sb);
1092 	int rc;
1093 
1094 	if (!(sbsec->flags & SE_SBINITIALIZED))
1095 		return 0;
1096 
1097 	if (!selinux_initialized())
1098 		return 0;
1099 
1100 	if (sbsec->flags & FSCONTEXT_MNT) {
1101 		seq_putc(m, ',');
1102 		seq_puts(m, FSCONTEXT_STR);
1103 		rc = show_sid(m, sbsec->sid);
1104 		if (rc)
1105 			return rc;
1106 	}
1107 	if (sbsec->flags & CONTEXT_MNT) {
1108 		seq_putc(m, ',');
1109 		seq_puts(m, CONTEXT_STR);
1110 		rc = show_sid(m, sbsec->mntpoint_sid);
1111 		if (rc)
1112 			return rc;
1113 	}
1114 	if (sbsec->flags & DEFCONTEXT_MNT) {
1115 		seq_putc(m, ',');
1116 		seq_puts(m, DEFCONTEXT_STR);
1117 		rc = show_sid(m, sbsec->def_sid);
1118 		if (rc)
1119 			return rc;
1120 	}
1121 	if (sbsec->flags & ROOTCONTEXT_MNT) {
1122 		struct dentry *root = sb->s_root;
1123 		struct inode_security_struct *isec = backing_inode_security(root);
1124 		seq_putc(m, ',');
1125 		seq_puts(m, ROOTCONTEXT_STR);
1126 		rc = show_sid(m, isec->sid);
1127 		if (rc)
1128 			return rc;
1129 	}
1130 	if (sbsec->flags & SBLABEL_MNT) {
1131 		seq_putc(m, ',');
1132 		seq_puts(m, SECLABEL_STR);
1133 	}
1134 	return 0;
1135 }
1136 
inode_mode_to_security_class(umode_t mode)1137 static inline u16 inode_mode_to_security_class(umode_t mode)
1138 {
1139 	switch (mode & S_IFMT) {
1140 	case S_IFSOCK:
1141 		return SECCLASS_SOCK_FILE;
1142 	case S_IFLNK:
1143 		return SECCLASS_LNK_FILE;
1144 	case S_IFREG:
1145 		return SECCLASS_FILE;
1146 	case S_IFBLK:
1147 		return SECCLASS_BLK_FILE;
1148 	case S_IFDIR:
1149 		return SECCLASS_DIR;
1150 	case S_IFCHR:
1151 		return SECCLASS_CHR_FILE;
1152 	case S_IFIFO:
1153 		return SECCLASS_FIFO_FILE;
1154 
1155 	}
1156 
1157 	return SECCLASS_FILE;
1158 }
1159 
default_protocol_stream(int protocol)1160 static inline int default_protocol_stream(int protocol)
1161 {
1162 	return (protocol == IPPROTO_IP || protocol == IPPROTO_TCP ||
1163 		protocol == IPPROTO_MPTCP);
1164 }
1165 
default_protocol_dgram(int protocol)1166 static inline int default_protocol_dgram(int protocol)
1167 {
1168 	return (protocol == IPPROTO_IP || protocol == IPPROTO_UDP);
1169 }
1170 
socket_type_to_security_class(int family,int type,int protocol)1171 static inline u16 socket_type_to_security_class(int family, int type, int protocol)
1172 {
1173 	bool extsockclass = selinux_policycap_extsockclass();
1174 
1175 	switch (family) {
1176 	case PF_UNIX:
1177 		switch (type) {
1178 		case SOCK_STREAM:
1179 		case SOCK_SEQPACKET:
1180 			return SECCLASS_UNIX_STREAM_SOCKET;
1181 		case SOCK_DGRAM:
1182 		case SOCK_RAW:
1183 			return SECCLASS_UNIX_DGRAM_SOCKET;
1184 		}
1185 		break;
1186 	case PF_INET:
1187 	case PF_INET6:
1188 		switch (type) {
1189 		case SOCK_STREAM:
1190 		case SOCK_SEQPACKET:
1191 			if (default_protocol_stream(protocol))
1192 				return SECCLASS_TCP_SOCKET;
1193 			else if (extsockclass && protocol == IPPROTO_SCTP)
1194 				return SECCLASS_SCTP_SOCKET;
1195 			else
1196 				return SECCLASS_RAWIP_SOCKET;
1197 		case SOCK_DGRAM:
1198 			if (default_protocol_dgram(protocol))
1199 				return SECCLASS_UDP_SOCKET;
1200 			else if (extsockclass && (protocol == IPPROTO_ICMP ||
1201 						  protocol == IPPROTO_ICMPV6))
1202 				return SECCLASS_ICMP_SOCKET;
1203 			else
1204 				return SECCLASS_RAWIP_SOCKET;
1205 		default:
1206 			return SECCLASS_RAWIP_SOCKET;
1207 		}
1208 		break;
1209 	case PF_NETLINK:
1210 		switch (protocol) {
1211 		case NETLINK_ROUTE:
1212 			return SECCLASS_NETLINK_ROUTE_SOCKET;
1213 		case NETLINK_SOCK_DIAG:
1214 			return SECCLASS_NETLINK_TCPDIAG_SOCKET;
1215 		case NETLINK_NFLOG:
1216 			return SECCLASS_NETLINK_NFLOG_SOCKET;
1217 		case NETLINK_XFRM:
1218 			return SECCLASS_NETLINK_XFRM_SOCKET;
1219 		case NETLINK_SELINUX:
1220 			return SECCLASS_NETLINK_SELINUX_SOCKET;
1221 		case NETLINK_ISCSI:
1222 			return SECCLASS_NETLINK_ISCSI_SOCKET;
1223 		case NETLINK_AUDIT:
1224 			return SECCLASS_NETLINK_AUDIT_SOCKET;
1225 		case NETLINK_FIB_LOOKUP:
1226 			return SECCLASS_NETLINK_FIB_LOOKUP_SOCKET;
1227 		case NETLINK_CONNECTOR:
1228 			return SECCLASS_NETLINK_CONNECTOR_SOCKET;
1229 		case NETLINK_NETFILTER:
1230 			return SECCLASS_NETLINK_NETFILTER_SOCKET;
1231 		case NETLINK_DNRTMSG:
1232 			return SECCLASS_NETLINK_DNRT_SOCKET;
1233 		case NETLINK_KOBJECT_UEVENT:
1234 			return SECCLASS_NETLINK_KOBJECT_UEVENT_SOCKET;
1235 		case NETLINK_GENERIC:
1236 			return SECCLASS_NETLINK_GENERIC_SOCKET;
1237 		case NETLINK_SCSITRANSPORT:
1238 			return SECCLASS_NETLINK_SCSITRANSPORT_SOCKET;
1239 		case NETLINK_RDMA:
1240 			return SECCLASS_NETLINK_RDMA_SOCKET;
1241 		case NETLINK_CRYPTO:
1242 			return SECCLASS_NETLINK_CRYPTO_SOCKET;
1243 		default:
1244 			return SECCLASS_NETLINK_SOCKET;
1245 		}
1246 	case PF_PACKET:
1247 		return SECCLASS_PACKET_SOCKET;
1248 	case PF_KEY:
1249 		return SECCLASS_KEY_SOCKET;
1250 	case PF_APPLETALK:
1251 		return SECCLASS_APPLETALK_SOCKET;
1252 	}
1253 
1254 	if (extsockclass) {
1255 		switch (family) {
1256 		case PF_AX25:
1257 			return SECCLASS_AX25_SOCKET;
1258 		case PF_IPX:
1259 			return SECCLASS_IPX_SOCKET;
1260 		case PF_NETROM:
1261 			return SECCLASS_NETROM_SOCKET;
1262 		case PF_ATMPVC:
1263 			return SECCLASS_ATMPVC_SOCKET;
1264 		case PF_X25:
1265 			return SECCLASS_X25_SOCKET;
1266 		case PF_ROSE:
1267 			return SECCLASS_ROSE_SOCKET;
1268 		case PF_DECnet:
1269 			return SECCLASS_DECNET_SOCKET;
1270 		case PF_ATMSVC:
1271 			return SECCLASS_ATMSVC_SOCKET;
1272 		case PF_RDS:
1273 			return SECCLASS_RDS_SOCKET;
1274 		case PF_IRDA:
1275 			return SECCLASS_IRDA_SOCKET;
1276 		case PF_PPPOX:
1277 			return SECCLASS_PPPOX_SOCKET;
1278 		case PF_LLC:
1279 			return SECCLASS_LLC_SOCKET;
1280 		case PF_CAN:
1281 			return SECCLASS_CAN_SOCKET;
1282 		case PF_TIPC:
1283 			return SECCLASS_TIPC_SOCKET;
1284 		case PF_BLUETOOTH:
1285 			return SECCLASS_BLUETOOTH_SOCKET;
1286 		case PF_IUCV:
1287 			return SECCLASS_IUCV_SOCKET;
1288 		case PF_RXRPC:
1289 			return SECCLASS_RXRPC_SOCKET;
1290 		case PF_ISDN:
1291 			return SECCLASS_ISDN_SOCKET;
1292 		case PF_PHONET:
1293 			return SECCLASS_PHONET_SOCKET;
1294 		case PF_IEEE802154:
1295 			return SECCLASS_IEEE802154_SOCKET;
1296 		case PF_CAIF:
1297 			return SECCLASS_CAIF_SOCKET;
1298 		case PF_ALG:
1299 			return SECCLASS_ALG_SOCKET;
1300 		case PF_NFC:
1301 			return SECCLASS_NFC_SOCKET;
1302 		case PF_VSOCK:
1303 			return SECCLASS_VSOCK_SOCKET;
1304 		case PF_KCM:
1305 			return SECCLASS_KCM_SOCKET;
1306 		case PF_QIPCRTR:
1307 			return SECCLASS_QIPCRTR_SOCKET;
1308 		case PF_SMC:
1309 			return SECCLASS_SMC_SOCKET;
1310 		case PF_XDP:
1311 			return SECCLASS_XDP_SOCKET;
1312 		case PF_MCTP:
1313 			return SECCLASS_MCTP_SOCKET;
1314 #if PF_MAX > 46
1315 #error New address family defined, please update this function.
1316 #endif
1317 		}
1318 	}
1319 
1320 	return SECCLASS_SOCKET;
1321 }
1322 
selinux_genfs_get_sid(struct dentry * dentry,u16 tclass,u16 flags,u32 * sid)1323 static int selinux_genfs_get_sid(struct dentry *dentry,
1324 				 u16 tclass,
1325 				 u16 flags,
1326 				 u32 *sid)
1327 {
1328 	int rc;
1329 	struct super_block *sb = dentry->d_sb;
1330 	char *buffer, *path;
1331 
1332 	buffer = (char *)__get_free_page(GFP_KERNEL);
1333 	if (!buffer)
1334 		return -ENOMEM;
1335 
1336 	path = dentry_path_raw(dentry, buffer, PAGE_SIZE);
1337 	if (IS_ERR(path))
1338 		rc = PTR_ERR(path);
1339 	else {
1340 		if (flags & SE_SBPROC) {
1341 			/* each process gets a /proc/PID/ entry. Strip off the
1342 			 * PID part to get a valid selinux labeling.
1343 			 * e.g. /proc/1/net/rpc/nfs -> /net/rpc/nfs */
1344 			while (path[1] >= '0' && path[1] <= '9') {
1345 				path[1] = '/';
1346 				path++;
1347 			}
1348 		}
1349 		rc = security_genfs_sid(sb->s_type->name,
1350 					path, tclass, sid);
1351 		if (rc == -ENOENT) {
1352 			/* No match in policy, mark as unlabeled. */
1353 			*sid = SECINITSID_UNLABELED;
1354 			rc = 0;
1355 		}
1356 	}
1357 	free_page((unsigned long)buffer);
1358 	return rc;
1359 }
1360 
inode_doinit_use_xattr(struct inode * inode,struct dentry * dentry,u32 def_sid,u32 * sid)1361 static int inode_doinit_use_xattr(struct inode *inode, struct dentry *dentry,
1362 				  u32 def_sid, u32 *sid)
1363 {
1364 #define INITCONTEXTLEN 255
1365 	char *context;
1366 	unsigned int len;
1367 	int rc;
1368 
1369 	len = INITCONTEXTLEN;
1370 	context = kmalloc(len + 1, GFP_NOFS);
1371 	if (!context)
1372 		return -ENOMEM;
1373 
1374 	context[len] = '\0';
1375 	rc = __vfs_getxattr(dentry, inode, XATTR_NAME_SELINUX, context, len);
1376 	if (rc == -ERANGE) {
1377 		kfree(context);
1378 
1379 		/* Need a larger buffer.  Query for the right size. */
1380 		rc = __vfs_getxattr(dentry, inode, XATTR_NAME_SELINUX, NULL, 0);
1381 		if (rc < 0)
1382 			return rc;
1383 
1384 		len = rc;
1385 		context = kmalloc(len + 1, GFP_NOFS);
1386 		if (!context)
1387 			return -ENOMEM;
1388 
1389 		context[len] = '\0';
1390 		rc = __vfs_getxattr(dentry, inode, XATTR_NAME_SELINUX,
1391 				    context, len);
1392 	}
1393 	if (rc < 0) {
1394 		kfree(context);
1395 		if (rc != -ENODATA) {
1396 			pr_warn("SELinux: %s:  getxattr returned %d for dev=%s ino=%ld\n",
1397 				__func__, -rc, inode->i_sb->s_id, inode->i_ino);
1398 			return rc;
1399 		}
1400 		*sid = def_sid;
1401 		return 0;
1402 	}
1403 
1404 	rc = security_context_to_sid_default(context, rc, sid,
1405 					     def_sid, GFP_NOFS);
1406 	if (rc) {
1407 		char *dev = inode->i_sb->s_id;
1408 		unsigned long ino = inode->i_ino;
1409 
1410 		if (rc == -EINVAL) {
1411 			pr_notice_ratelimited("SELinux: inode=%lu on dev=%s was found to have an invalid context=%s.  This indicates you may need to relabel the inode or the filesystem in question.\n",
1412 					      ino, dev, context);
1413 		} else {
1414 			pr_warn("SELinux: %s:  context_to_sid(%s) returned %d for dev=%s ino=%ld\n",
1415 				__func__, context, -rc, dev, ino);
1416 		}
1417 	}
1418 	kfree(context);
1419 	return 0;
1420 }
1421 
1422 /* The inode's security attributes must be initialized before first use. */
inode_doinit_with_dentry(struct inode * inode,struct dentry * opt_dentry)1423 static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry)
1424 {
1425 	struct superblock_security_struct *sbsec = NULL;
1426 	struct inode_security_struct *isec = selinux_inode(inode);
1427 	u32 task_sid, sid = 0;
1428 	u16 sclass;
1429 	struct dentry *dentry;
1430 	int rc = 0;
1431 
1432 	if (isec->initialized == LABEL_INITIALIZED)
1433 		return 0;
1434 
1435 	spin_lock(&isec->lock);
1436 	if (isec->initialized == LABEL_INITIALIZED)
1437 		goto out_unlock;
1438 
1439 	if (isec->sclass == SECCLASS_FILE)
1440 		isec->sclass = inode_mode_to_security_class(inode->i_mode);
1441 
1442 	sbsec = selinux_superblock(inode->i_sb);
1443 	if (!(sbsec->flags & SE_SBINITIALIZED)) {
1444 		/* Defer initialization until selinux_complete_init,
1445 		   after the initial policy is loaded and the security
1446 		   server is ready to handle calls. */
1447 		spin_lock(&sbsec->isec_lock);
1448 		if (list_empty(&isec->list))
1449 			list_add(&isec->list, &sbsec->isec_head);
1450 		spin_unlock(&sbsec->isec_lock);
1451 		goto out_unlock;
1452 	}
1453 
1454 	sclass = isec->sclass;
1455 	task_sid = isec->task_sid;
1456 	sid = isec->sid;
1457 	isec->initialized = LABEL_PENDING;
1458 	spin_unlock(&isec->lock);
1459 
1460 	switch (sbsec->behavior) {
1461 	/*
1462 	 * In case of SECURITY_FS_USE_NATIVE we need to re-fetch the labels
1463 	 * via xattr when called from delayed_superblock_init().
1464 	 */
1465 	case SECURITY_FS_USE_NATIVE:
1466 	case SECURITY_FS_USE_XATTR:
1467 		if (!(inode->i_opflags & IOP_XATTR)) {
1468 			sid = sbsec->def_sid;
1469 			break;
1470 		}
1471 		/* Need a dentry, since the xattr API requires one.
1472 		   Life would be simpler if we could just pass the inode. */
1473 		if (opt_dentry) {
1474 			/* Called from d_instantiate or d_splice_alias. */
1475 			dentry = dget(opt_dentry);
1476 		} else {
1477 			/*
1478 			 * Called from selinux_complete_init, try to find a dentry.
1479 			 * Some filesystems really want a connected one, so try
1480 			 * that first.  We could split SECURITY_FS_USE_XATTR in
1481 			 * two, depending upon that...
1482 			 */
1483 			dentry = d_find_alias(inode);
1484 			if (!dentry)
1485 				dentry = d_find_any_alias(inode);
1486 		}
1487 		if (!dentry) {
1488 			/*
1489 			 * this is can be hit on boot when a file is accessed
1490 			 * before the policy is loaded.  When we load policy we
1491 			 * may find inodes that have no dentry on the
1492 			 * sbsec->isec_head list.  No reason to complain as these
1493 			 * will get fixed up the next time we go through
1494 			 * inode_doinit with a dentry, before these inodes could
1495 			 * be used again by userspace.
1496 			 */
1497 			goto out_invalid;
1498 		}
1499 
1500 		rc = inode_doinit_use_xattr(inode, dentry, sbsec->def_sid,
1501 					    &sid);
1502 		dput(dentry);
1503 		if (rc)
1504 			goto out;
1505 		break;
1506 	case SECURITY_FS_USE_TASK:
1507 		sid = task_sid;
1508 		break;
1509 	case SECURITY_FS_USE_TRANS:
1510 		/* Default to the fs SID. */
1511 		sid = sbsec->sid;
1512 
1513 		/* Try to obtain a transition SID. */
1514 		rc = security_transition_sid(task_sid, sid,
1515 					     sclass, NULL, &sid);
1516 		if (rc)
1517 			goto out;
1518 		break;
1519 	case SECURITY_FS_USE_MNTPOINT:
1520 		sid = sbsec->mntpoint_sid;
1521 		break;
1522 	default:
1523 		/* Default to the fs superblock SID. */
1524 		sid = sbsec->sid;
1525 
1526 		if ((sbsec->flags & SE_SBGENFS) &&
1527 		     (!S_ISLNK(inode->i_mode) ||
1528 		      selinux_policycap_genfs_seclabel_symlinks())) {
1529 			/* We must have a dentry to determine the label on
1530 			 * procfs inodes */
1531 			if (opt_dentry) {
1532 				/* Called from d_instantiate or
1533 				 * d_splice_alias. */
1534 				dentry = dget(opt_dentry);
1535 			} else {
1536 				/* Called from selinux_complete_init, try to
1537 				 * find a dentry.  Some filesystems really want
1538 				 * a connected one, so try that first.
1539 				 */
1540 				dentry = d_find_alias(inode);
1541 				if (!dentry)
1542 					dentry = d_find_any_alias(inode);
1543 			}
1544 			/*
1545 			 * This can be hit on boot when a file is accessed
1546 			 * before the policy is loaded.  When we load policy we
1547 			 * may find inodes that have no dentry on the
1548 			 * sbsec->isec_head list.  No reason to complain as
1549 			 * these will get fixed up the next time we go through
1550 			 * inode_doinit() with a dentry, before these inodes
1551 			 * could be used again by userspace.
1552 			 */
1553 			if (!dentry)
1554 				goto out_invalid;
1555 			rc = selinux_genfs_get_sid(dentry, sclass,
1556 						   sbsec->flags, &sid);
1557 			if (rc) {
1558 				dput(dentry);
1559 				goto out;
1560 			}
1561 
1562 			if ((sbsec->flags & SE_SBGENFS_XATTR) &&
1563 			    (inode->i_opflags & IOP_XATTR)) {
1564 				rc = inode_doinit_use_xattr(inode, dentry,
1565 							    sid, &sid);
1566 				if (rc) {
1567 					dput(dentry);
1568 					goto out;
1569 				}
1570 			}
1571 			dput(dentry);
1572 		}
1573 		break;
1574 	}
1575 
1576 out:
1577 	spin_lock(&isec->lock);
1578 	if (isec->initialized == LABEL_PENDING) {
1579 		if (rc) {
1580 			isec->initialized = LABEL_INVALID;
1581 			goto out_unlock;
1582 		}
1583 		isec->initialized = LABEL_INITIALIZED;
1584 		isec->sid = sid;
1585 	}
1586 
1587 out_unlock:
1588 	spin_unlock(&isec->lock);
1589 	return rc;
1590 
1591 out_invalid:
1592 	spin_lock(&isec->lock);
1593 	if (isec->initialized == LABEL_PENDING) {
1594 		isec->initialized = LABEL_INVALID;
1595 		isec->sid = sid;
1596 	}
1597 	spin_unlock(&isec->lock);
1598 	return 0;
1599 }
1600 
1601 /* Convert a Linux signal to an access vector. */
signal_to_av(int sig)1602 static inline u32 signal_to_av(int sig)
1603 {
1604 	u32 perm = 0;
1605 
1606 	switch (sig) {
1607 	case SIGCHLD:
1608 		/* Commonly granted from child to parent. */
1609 		perm = PROCESS__SIGCHLD;
1610 		break;
1611 	case SIGKILL:
1612 		/* Cannot be caught or ignored */
1613 		perm = PROCESS__SIGKILL;
1614 		break;
1615 	case SIGSTOP:
1616 		/* Cannot be caught or ignored */
1617 		perm = PROCESS__SIGSTOP;
1618 		break;
1619 	default:
1620 		/* All other signals. */
1621 		perm = PROCESS__SIGNAL;
1622 		break;
1623 	}
1624 
1625 	return perm;
1626 }
1627 
1628 #if CAP_LAST_CAP > 63
1629 #error Fix SELinux to handle capabilities > 63.
1630 #endif
1631 
1632 /* Check whether a task is allowed to use a capability. */
cred_has_capability(const struct cred * cred,int cap,unsigned int opts,bool initns)1633 static int cred_has_capability(const struct cred *cred,
1634 			       int cap, unsigned int opts, bool initns)
1635 {
1636 	struct common_audit_data ad;
1637 	struct av_decision avd;
1638 	u16 sclass;
1639 	u32 sid = cred_sid(cred);
1640 	u32 av = CAP_TO_MASK(cap);
1641 	int rc;
1642 
1643 	ad.type = LSM_AUDIT_DATA_CAP;
1644 	ad.u.cap = cap;
1645 
1646 	switch (CAP_TO_INDEX(cap)) {
1647 	case 0:
1648 		sclass = initns ? SECCLASS_CAPABILITY : SECCLASS_CAP_USERNS;
1649 		break;
1650 	case 1:
1651 		sclass = initns ? SECCLASS_CAPABILITY2 : SECCLASS_CAP2_USERNS;
1652 		break;
1653 	default:
1654 		pr_err("SELinux:  out of range capability %d\n", cap);
1655 		BUG();
1656 		return -EINVAL;
1657 	}
1658 
1659 	rc = avc_has_perm_noaudit(sid, sid, sclass, av, 0, &avd);
1660 	if (!(opts & CAP_OPT_NOAUDIT)) {
1661 		int rc2 = avc_audit(sid, sid, sclass, av, &avd, rc, &ad);
1662 		if (rc2)
1663 			return rc2;
1664 	}
1665 	return rc;
1666 }
1667 
1668 /* Check whether a task has a particular permission to an inode.
1669    The 'adp' parameter is optional and allows other audit
1670    data to be passed (e.g. the dentry). */
inode_has_perm(const struct cred * cred,struct inode * inode,u32 perms,struct common_audit_data * adp)1671 static int inode_has_perm(const struct cred *cred,
1672 			  struct inode *inode,
1673 			  u32 perms,
1674 			  struct common_audit_data *adp)
1675 {
1676 	struct inode_security_struct *isec;
1677 	u32 sid;
1678 
1679 	if (unlikely(IS_PRIVATE(inode)))
1680 		return 0;
1681 
1682 	sid = cred_sid(cred);
1683 	isec = selinux_inode(inode);
1684 
1685 	return avc_has_perm(sid, isec->sid, isec->sclass, perms, adp);
1686 }
1687 
1688 /* Same as inode_has_perm, but pass explicit audit data containing
1689    the dentry to help the auditing code to more easily generate the
1690    pathname if needed. */
dentry_has_perm(const struct cred * cred,struct dentry * dentry,u32 av)1691 static inline int dentry_has_perm(const struct cred *cred,
1692 				  struct dentry *dentry,
1693 				  u32 av)
1694 {
1695 	struct common_audit_data ad;
1696 	struct inode *inode = d_backing_inode(dentry);
1697 	struct inode_security_struct *isec = selinux_inode(inode);
1698 
1699 	ad.type = LSM_AUDIT_DATA_DENTRY;
1700 	ad.u.dentry = dentry;
1701 	/* check below is racy, but revalidate will recheck with lock held */
1702 	if (data_race(unlikely(isec->initialized != LABEL_INITIALIZED)))
1703 		__inode_security_revalidate(inode, dentry, true);
1704 	return inode_has_perm(cred, inode, av, &ad);
1705 }
1706 
1707 /* Same as inode_has_perm, but pass explicit audit data containing
1708    the path to help the auditing code to more easily generate the
1709    pathname if needed. */
path_has_perm(const struct cred * cred,const struct path * path,u32 av)1710 static inline int path_has_perm(const struct cred *cred,
1711 				const struct path *path,
1712 				u32 av)
1713 {
1714 	struct common_audit_data ad;
1715 	struct inode *inode = d_backing_inode(path->dentry);
1716 	struct inode_security_struct *isec = selinux_inode(inode);
1717 
1718 	ad.type = LSM_AUDIT_DATA_PATH;
1719 	ad.u.path = *path;
1720 	/* check below is racy, but revalidate will recheck with lock held */
1721 	if (data_race(unlikely(isec->initialized != LABEL_INITIALIZED)))
1722 		__inode_security_revalidate(inode, path->dentry, true);
1723 	return inode_has_perm(cred, inode, av, &ad);
1724 }
1725 
1726 /* Same as path_has_perm, but uses the inode from the file struct. */
file_path_has_perm(const struct cred * cred,struct file * file,u32 av)1727 static inline int file_path_has_perm(const struct cred *cred,
1728 				     struct file *file,
1729 				     u32 av)
1730 {
1731 	struct common_audit_data ad;
1732 
1733 	ad.type = LSM_AUDIT_DATA_FILE;
1734 	ad.u.file = file;
1735 	return inode_has_perm(cred, file_inode(file), av, &ad);
1736 }
1737 
1738 #ifdef CONFIG_BPF_SYSCALL
1739 static int bpf_fd_pass(const struct file *file, u32 sid);
1740 #endif
1741 
1742 /* Check whether a task can use an open file descriptor to
1743    access an inode in a given way.  Check access to the
1744    descriptor itself, and then use dentry_has_perm to
1745    check a particular permission to the file.
1746    Access to the descriptor is implicitly granted if it
1747    has the same SID as the process.  If av is zero, then
1748    access to the file is not checked, e.g. for cases
1749    where only the descriptor is affected like seek. */
file_has_perm(const struct cred * cred,struct file * file,u32 av)1750 static int file_has_perm(const struct cred *cred,
1751 			 struct file *file,
1752 			 u32 av)
1753 {
1754 	struct file_security_struct *fsec = selinux_file(file);
1755 	struct inode *inode = file_inode(file);
1756 	struct common_audit_data ad;
1757 	u32 sid = cred_sid(cred);
1758 	int rc;
1759 
1760 	ad.type = LSM_AUDIT_DATA_FILE;
1761 	ad.u.file = file;
1762 
1763 	if (sid != fsec->sid) {
1764 		rc = avc_has_perm(sid, fsec->sid,
1765 				  SECCLASS_FD,
1766 				  FD__USE,
1767 				  &ad);
1768 		if (rc)
1769 			goto out;
1770 	}
1771 
1772 #ifdef CONFIG_BPF_SYSCALL
1773 	rc = bpf_fd_pass(file, cred_sid(cred));
1774 	if (rc)
1775 		return rc;
1776 #endif
1777 
1778 	/* av is zero if only checking access to the descriptor. */
1779 	rc = 0;
1780 	if (av)
1781 		rc = inode_has_perm(cred, inode, av, &ad);
1782 
1783 out:
1784 	return rc;
1785 }
1786 
1787 /*
1788  * Determine the label for an inode that might be unioned.
1789  */
1790 static int
selinux_determine_inode_label(const struct task_security_struct * tsec,struct inode * dir,const struct qstr * name,u16 tclass,u32 * _new_isid)1791 selinux_determine_inode_label(const struct task_security_struct *tsec,
1792 				 struct inode *dir,
1793 				 const struct qstr *name, u16 tclass,
1794 				 u32 *_new_isid)
1795 {
1796 	const struct superblock_security_struct *sbsec =
1797 						selinux_superblock(dir->i_sb);
1798 
1799 	if ((sbsec->flags & SE_SBINITIALIZED) &&
1800 	    (sbsec->behavior == SECURITY_FS_USE_MNTPOINT)) {
1801 		*_new_isid = sbsec->mntpoint_sid;
1802 	} else if ((sbsec->flags & SBLABEL_MNT) &&
1803 		   tsec->create_sid) {
1804 		*_new_isid = tsec->create_sid;
1805 	} else {
1806 		const struct inode_security_struct *dsec = inode_security(dir);
1807 		return security_transition_sid(tsec->sid,
1808 					       dsec->sid, tclass,
1809 					       name, _new_isid);
1810 	}
1811 
1812 	return 0;
1813 }
1814 
1815 /* Check whether a task can create a file. */
may_create(struct inode * dir,struct dentry * dentry,u16 tclass)1816 static int may_create(struct inode *dir,
1817 		      struct dentry *dentry,
1818 		      u16 tclass)
1819 {
1820 	const struct task_security_struct *tsec = selinux_cred(current_cred());
1821 	struct inode_security_struct *dsec;
1822 	struct superblock_security_struct *sbsec;
1823 	u32 sid, newsid;
1824 	struct common_audit_data ad;
1825 	int rc;
1826 
1827 	dsec = inode_security(dir);
1828 	sbsec = selinux_superblock(dir->i_sb);
1829 
1830 	sid = tsec->sid;
1831 
1832 	ad.type = LSM_AUDIT_DATA_DENTRY;
1833 	ad.u.dentry = dentry;
1834 
1835 	rc = avc_has_perm(sid, dsec->sid, SECCLASS_DIR,
1836 			  DIR__ADD_NAME | DIR__SEARCH,
1837 			  &ad);
1838 	if (rc)
1839 		return rc;
1840 
1841 	rc = selinux_determine_inode_label(tsec, dir, &dentry->d_name, tclass,
1842 					   &newsid);
1843 	if (rc)
1844 		return rc;
1845 
1846 	rc = avc_has_perm(sid, newsid, tclass, FILE__CREATE, &ad);
1847 	if (rc)
1848 		return rc;
1849 
1850 	return avc_has_perm(newsid, sbsec->sid,
1851 			    SECCLASS_FILESYSTEM,
1852 			    FILESYSTEM__ASSOCIATE, &ad);
1853 }
1854 
1855 #define MAY_LINK	0
1856 #define MAY_UNLINK	1
1857 #define MAY_RMDIR	2
1858 
1859 /* Check whether a task can link, unlink, or rmdir a file/directory. */
may_link(struct inode * dir,struct dentry * dentry,int kind)1860 static int may_link(struct inode *dir,
1861 		    struct dentry *dentry,
1862 		    int kind)
1863 
1864 {
1865 	struct inode_security_struct *dsec, *isec;
1866 	struct common_audit_data ad;
1867 	u32 sid = current_sid();
1868 	u32 av;
1869 	int rc;
1870 
1871 	dsec = inode_security(dir);
1872 	isec = backing_inode_security(dentry);
1873 
1874 	ad.type = LSM_AUDIT_DATA_DENTRY;
1875 	ad.u.dentry = dentry;
1876 
1877 	av = DIR__SEARCH;
1878 	av |= (kind ? DIR__REMOVE_NAME : DIR__ADD_NAME);
1879 	rc = avc_has_perm(sid, dsec->sid, SECCLASS_DIR, av, &ad);
1880 	if (rc)
1881 		return rc;
1882 
1883 	switch (kind) {
1884 	case MAY_LINK:
1885 		av = FILE__LINK;
1886 		break;
1887 	case MAY_UNLINK:
1888 		av = FILE__UNLINK;
1889 		break;
1890 	case MAY_RMDIR:
1891 		av = DIR__RMDIR;
1892 		break;
1893 	default:
1894 		pr_warn("SELinux: %s:  unrecognized kind %d\n",
1895 			__func__, kind);
1896 		return 0;
1897 	}
1898 
1899 	rc = avc_has_perm(sid, isec->sid, isec->sclass, av, &ad);
1900 	return rc;
1901 }
1902 
may_rename(struct inode * old_dir,struct dentry * old_dentry,struct inode * new_dir,struct dentry * new_dentry)1903 static inline int may_rename(struct inode *old_dir,
1904 			     struct dentry *old_dentry,
1905 			     struct inode *new_dir,
1906 			     struct dentry *new_dentry)
1907 {
1908 	struct inode_security_struct *old_dsec, *new_dsec, *old_isec, *new_isec;
1909 	struct common_audit_data ad;
1910 	u32 sid = current_sid();
1911 	u32 av;
1912 	int old_is_dir, new_is_dir;
1913 	int rc;
1914 
1915 	old_dsec = inode_security(old_dir);
1916 	old_isec = backing_inode_security(old_dentry);
1917 	old_is_dir = d_is_dir(old_dentry);
1918 	new_dsec = inode_security(new_dir);
1919 
1920 	ad.type = LSM_AUDIT_DATA_DENTRY;
1921 
1922 	ad.u.dentry = old_dentry;
1923 	rc = avc_has_perm(sid, old_dsec->sid, SECCLASS_DIR,
1924 			  DIR__REMOVE_NAME | DIR__SEARCH, &ad);
1925 	if (rc)
1926 		return rc;
1927 	rc = avc_has_perm(sid, old_isec->sid,
1928 			  old_isec->sclass, FILE__RENAME, &ad);
1929 	if (rc)
1930 		return rc;
1931 	if (old_is_dir && new_dir != old_dir) {
1932 		rc = avc_has_perm(sid, old_isec->sid,
1933 				  old_isec->sclass, DIR__REPARENT, &ad);
1934 		if (rc)
1935 			return rc;
1936 	}
1937 
1938 	ad.u.dentry = new_dentry;
1939 	av = DIR__ADD_NAME | DIR__SEARCH;
1940 	if (d_is_positive(new_dentry))
1941 		av |= DIR__REMOVE_NAME;
1942 	rc = avc_has_perm(sid, new_dsec->sid, SECCLASS_DIR, av, &ad);
1943 	if (rc)
1944 		return rc;
1945 	if (d_is_positive(new_dentry)) {
1946 		new_isec = backing_inode_security(new_dentry);
1947 		new_is_dir = d_is_dir(new_dentry);
1948 		rc = avc_has_perm(sid, new_isec->sid,
1949 				  new_isec->sclass,
1950 				  (new_is_dir ? DIR__RMDIR : FILE__UNLINK), &ad);
1951 		if (rc)
1952 			return rc;
1953 	}
1954 
1955 	return 0;
1956 }
1957 
1958 /* Check whether a task can perform a filesystem operation. */
superblock_has_perm(const struct cred * cred,const struct super_block * sb,u32 perms,struct common_audit_data * ad)1959 static int superblock_has_perm(const struct cred *cred,
1960 			       const struct super_block *sb,
1961 			       u32 perms,
1962 			       struct common_audit_data *ad)
1963 {
1964 	struct superblock_security_struct *sbsec;
1965 	u32 sid = cred_sid(cred);
1966 
1967 	sbsec = selinux_superblock(sb);
1968 	return avc_has_perm(sid, sbsec->sid, SECCLASS_FILESYSTEM, perms, ad);
1969 }
1970 
1971 /* Convert a Linux mode and permission mask to an access vector. */
file_mask_to_av(int mode,int mask)1972 static inline u32 file_mask_to_av(int mode, int mask)
1973 {
1974 	u32 av = 0;
1975 
1976 	if (!S_ISDIR(mode)) {
1977 		if (mask & MAY_EXEC)
1978 			av |= FILE__EXECUTE;
1979 		if (mask & MAY_READ)
1980 			av |= FILE__READ;
1981 
1982 		if (mask & MAY_APPEND)
1983 			av |= FILE__APPEND;
1984 		else if (mask & MAY_WRITE)
1985 			av |= FILE__WRITE;
1986 
1987 	} else {
1988 		if (mask & MAY_EXEC)
1989 			av |= DIR__SEARCH;
1990 		if (mask & MAY_WRITE)
1991 			av |= DIR__WRITE;
1992 		if (mask & MAY_READ)
1993 			av |= DIR__READ;
1994 	}
1995 
1996 	return av;
1997 }
1998 
1999 /* Convert a Linux file to an access vector. */
file_to_av(const struct file * file)2000 static inline u32 file_to_av(const struct file *file)
2001 {
2002 	u32 av = 0;
2003 
2004 	if (file->f_mode & FMODE_READ)
2005 		av |= FILE__READ;
2006 	if (file->f_mode & FMODE_WRITE) {
2007 		if (file->f_flags & O_APPEND)
2008 			av |= FILE__APPEND;
2009 		else
2010 			av |= FILE__WRITE;
2011 	}
2012 	if (!av) {
2013 		/*
2014 		 * Special file opened with flags 3 for ioctl-only use.
2015 		 */
2016 		av = FILE__IOCTL;
2017 	}
2018 
2019 	return av;
2020 }
2021 
2022 /*
2023  * Convert a file to an access vector and include the correct
2024  * open permission.
2025  */
open_file_to_av(struct file * file)2026 static inline u32 open_file_to_av(struct file *file)
2027 {
2028 	u32 av = file_to_av(file);
2029 	struct inode *inode = file_inode(file);
2030 
2031 	if (selinux_policycap_openperm() &&
2032 	    inode->i_sb->s_magic != SOCKFS_MAGIC)
2033 		av |= FILE__OPEN;
2034 
2035 	return av;
2036 }
2037 
2038 /* Hook functions begin here. */
2039 
selinux_binder_set_context_mgr(const struct cred * mgr)2040 static int selinux_binder_set_context_mgr(const struct cred *mgr)
2041 {
2042 	return avc_has_perm(current_sid(), cred_sid(mgr), SECCLASS_BINDER,
2043 			    BINDER__SET_CONTEXT_MGR, NULL);
2044 }
2045 
selinux_binder_transaction(const struct cred * from,const struct cred * to)2046 static int selinux_binder_transaction(const struct cred *from,
2047 				      const struct cred *to)
2048 {
2049 	u32 mysid = current_sid();
2050 	u32 fromsid = cred_sid(from);
2051 	u32 tosid = cred_sid(to);
2052 	int rc;
2053 
2054 	if (mysid != fromsid) {
2055 		rc = avc_has_perm(mysid, fromsid, SECCLASS_BINDER,
2056 				  BINDER__IMPERSONATE, NULL);
2057 		if (rc)
2058 			return rc;
2059 	}
2060 
2061 	return avc_has_perm(fromsid, tosid,
2062 			    SECCLASS_BINDER, BINDER__CALL, NULL);
2063 }
2064 
selinux_binder_transfer_binder(const struct cred * from,const struct cred * to)2065 static int selinux_binder_transfer_binder(const struct cred *from,
2066 					  const struct cred *to)
2067 {
2068 	return avc_has_perm(cred_sid(from), cred_sid(to),
2069 			    SECCLASS_BINDER, BINDER__TRANSFER,
2070 			    NULL);
2071 }
2072 
selinux_binder_transfer_file(const struct cred * from,const struct cred * to,const struct file * file)2073 static int selinux_binder_transfer_file(const struct cred *from,
2074 					const struct cred *to,
2075 					const struct file *file)
2076 {
2077 	u32 sid = cred_sid(to);
2078 	struct file_security_struct *fsec = selinux_file(file);
2079 	struct dentry *dentry = file->f_path.dentry;
2080 	struct inode_security_struct *isec;
2081 	struct common_audit_data ad;
2082 	int rc;
2083 
2084 	ad.type = LSM_AUDIT_DATA_PATH;
2085 	ad.u.path = file->f_path;
2086 
2087 	if (sid != fsec->sid) {
2088 		rc = avc_has_perm(sid, fsec->sid,
2089 				  SECCLASS_FD,
2090 				  FD__USE,
2091 				  &ad);
2092 		if (rc)
2093 			return rc;
2094 	}
2095 
2096 #ifdef CONFIG_BPF_SYSCALL
2097 	rc = bpf_fd_pass(file, sid);
2098 	if (rc)
2099 		return rc;
2100 #endif
2101 
2102 	if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
2103 		return 0;
2104 
2105 	isec = backing_inode_security(dentry);
2106 	return avc_has_perm(sid, isec->sid, isec->sclass, file_to_av(file),
2107 			    &ad);
2108 }
2109 
selinux_ptrace_access_check(struct task_struct * child,unsigned int mode)2110 static int selinux_ptrace_access_check(struct task_struct *child,
2111 				       unsigned int mode)
2112 {
2113 	u32 sid = current_sid();
2114 	u32 csid = task_sid_obj(child);
2115 
2116 	if (mode & PTRACE_MODE_READ)
2117 		return avc_has_perm(sid, csid, SECCLASS_FILE, FILE__READ,
2118 				NULL);
2119 
2120 	return avc_has_perm(sid, csid, SECCLASS_PROCESS, PROCESS__PTRACE,
2121 			NULL);
2122 }
2123 
selinux_ptrace_traceme(struct task_struct * parent)2124 static int selinux_ptrace_traceme(struct task_struct *parent)
2125 {
2126 	return avc_has_perm(task_sid_obj(parent), task_sid_obj(current),
2127 			    SECCLASS_PROCESS, PROCESS__PTRACE, NULL);
2128 }
2129 
selinux_capget(const struct task_struct * target,kernel_cap_t * effective,kernel_cap_t * inheritable,kernel_cap_t * permitted)2130 static int selinux_capget(const struct task_struct *target, kernel_cap_t *effective,
2131 			  kernel_cap_t *inheritable, kernel_cap_t *permitted)
2132 {
2133 	return avc_has_perm(current_sid(), task_sid_obj(target),
2134 			SECCLASS_PROCESS, PROCESS__GETCAP, NULL);
2135 }
2136 
selinux_capset(struct cred * new,const struct cred * old,const kernel_cap_t * effective,const kernel_cap_t * inheritable,const kernel_cap_t * permitted)2137 static int selinux_capset(struct cred *new, const struct cred *old,
2138 			  const kernel_cap_t *effective,
2139 			  const kernel_cap_t *inheritable,
2140 			  const kernel_cap_t *permitted)
2141 {
2142 	return avc_has_perm(cred_sid(old), cred_sid(new), SECCLASS_PROCESS,
2143 			    PROCESS__SETCAP, NULL);
2144 }
2145 
2146 /*
2147  * (This comment used to live with the selinux_task_setuid hook,
2148  * which was removed).
2149  *
2150  * Since setuid only affects the current process, and since the SELinux
2151  * controls are not based on the Linux identity attributes, SELinux does not
2152  * need to control this operation.  However, SELinux does control the use of
2153  * the CAP_SETUID and CAP_SETGID capabilities using the capable hook.
2154  */
2155 
selinux_capable(const struct cred * cred,struct user_namespace * ns,int cap,unsigned int opts)2156 static int selinux_capable(const struct cred *cred, struct user_namespace *ns,
2157 			   int cap, unsigned int opts)
2158 {
2159 	return cred_has_capability(cred, cap, opts, ns == &init_user_ns);
2160 }
2161 
selinux_quotactl(int cmds,int type,int id,const struct super_block * sb)2162 static int selinux_quotactl(int cmds, int type, int id, const struct super_block *sb)
2163 {
2164 	const struct cred *cred = current_cred();
2165 	int rc = 0;
2166 
2167 	if (!sb)
2168 		return 0;
2169 
2170 	switch (cmds) {
2171 	case Q_SYNC:
2172 	case Q_QUOTAON:
2173 	case Q_QUOTAOFF:
2174 	case Q_SETINFO:
2175 	case Q_SETQUOTA:
2176 	case Q_XQUOTAOFF:
2177 	case Q_XQUOTAON:
2178 	case Q_XSETQLIM:
2179 		rc = superblock_has_perm(cred, sb, FILESYSTEM__QUOTAMOD, NULL);
2180 		break;
2181 	case Q_GETFMT:
2182 	case Q_GETINFO:
2183 	case Q_GETQUOTA:
2184 	case Q_XGETQUOTA:
2185 	case Q_XGETQSTAT:
2186 	case Q_XGETQSTATV:
2187 	case Q_XGETNEXTQUOTA:
2188 		rc = superblock_has_perm(cred, sb, FILESYSTEM__QUOTAGET, NULL);
2189 		break;
2190 	default:
2191 		rc = 0;  /* let the kernel handle invalid cmds */
2192 		break;
2193 	}
2194 	return rc;
2195 }
2196 
selinux_quota_on(struct dentry * dentry)2197 static int selinux_quota_on(struct dentry *dentry)
2198 {
2199 	const struct cred *cred = current_cred();
2200 
2201 	return dentry_has_perm(cred, dentry, FILE__QUOTAON);
2202 }
2203 
selinux_syslog(int type)2204 static int selinux_syslog(int type)
2205 {
2206 	switch (type) {
2207 	case SYSLOG_ACTION_READ_ALL:	/* Read last kernel messages */
2208 	case SYSLOG_ACTION_SIZE_BUFFER:	/* Return size of the log buffer */
2209 		return avc_has_perm(current_sid(), SECINITSID_KERNEL,
2210 				    SECCLASS_SYSTEM, SYSTEM__SYSLOG_READ, NULL);
2211 	case SYSLOG_ACTION_CONSOLE_OFF:	/* Disable logging to console */
2212 	case SYSLOG_ACTION_CONSOLE_ON:	/* Enable logging to console */
2213 	/* Set level of messages printed to console */
2214 	case SYSLOG_ACTION_CONSOLE_LEVEL:
2215 		return avc_has_perm(current_sid(), SECINITSID_KERNEL,
2216 				    SECCLASS_SYSTEM, SYSTEM__SYSLOG_CONSOLE,
2217 				    NULL);
2218 	}
2219 	/* All other syslog types */
2220 	return avc_has_perm(current_sid(), SECINITSID_KERNEL,
2221 			    SECCLASS_SYSTEM, SYSTEM__SYSLOG_MOD, NULL);
2222 }
2223 
2224 /*
2225  * Check permission for allocating a new virtual mapping. Returns
2226  * 0 if permission is granted, negative error code if not.
2227  *
2228  * Do not audit the selinux permission check, as this is applied to all
2229  * processes that allocate mappings.
2230  */
selinux_vm_enough_memory(struct mm_struct * mm,long pages)2231 static int selinux_vm_enough_memory(struct mm_struct *mm, long pages)
2232 {
2233 	return cred_has_capability(current_cred(), CAP_SYS_ADMIN,
2234 				   CAP_OPT_NOAUDIT, true);
2235 }
2236 
2237 /* binprm security operations */
2238 
ptrace_parent_sid(void)2239 static u32 ptrace_parent_sid(void)
2240 {
2241 	u32 sid = 0;
2242 	struct task_struct *tracer;
2243 
2244 	rcu_read_lock();
2245 	tracer = ptrace_parent(current);
2246 	if (tracer)
2247 		sid = task_sid_obj(tracer);
2248 	rcu_read_unlock();
2249 
2250 	return sid;
2251 }
2252 
check_nnp_nosuid(const struct linux_binprm * bprm,const struct task_security_struct * old_tsec,const struct task_security_struct * new_tsec)2253 static int check_nnp_nosuid(const struct linux_binprm *bprm,
2254 			    const struct task_security_struct *old_tsec,
2255 			    const struct task_security_struct *new_tsec)
2256 {
2257 	int nnp = (bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS);
2258 	int nosuid = !mnt_may_suid(bprm->file->f_path.mnt);
2259 	int rc;
2260 	u32 av;
2261 
2262 	if (!nnp && !nosuid)
2263 		return 0; /* neither NNP nor nosuid */
2264 
2265 	if (new_tsec->sid == old_tsec->sid)
2266 		return 0; /* No change in credentials */
2267 
2268 	/*
2269 	 * If the policy enables the nnp_nosuid_transition policy capability,
2270 	 * then we permit transitions under NNP or nosuid if the
2271 	 * policy allows the corresponding permission between
2272 	 * the old and new contexts.
2273 	 */
2274 	if (selinux_policycap_nnp_nosuid_transition()) {
2275 		av = 0;
2276 		if (nnp)
2277 			av |= PROCESS2__NNP_TRANSITION;
2278 		if (nosuid)
2279 			av |= PROCESS2__NOSUID_TRANSITION;
2280 		rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
2281 				  SECCLASS_PROCESS2, av, NULL);
2282 		if (!rc)
2283 			return 0;
2284 	}
2285 
2286 	/*
2287 	 * We also permit NNP or nosuid transitions to bounded SIDs,
2288 	 * i.e. SIDs that are guaranteed to only be allowed a subset
2289 	 * of the permissions of the current SID.
2290 	 */
2291 	rc = security_bounded_transition(old_tsec->sid,
2292 					 new_tsec->sid);
2293 	if (!rc)
2294 		return 0;
2295 
2296 	/*
2297 	 * On failure, preserve the errno values for NNP vs nosuid.
2298 	 * NNP:  Operation not permitted for caller.
2299 	 * nosuid:  Permission denied to file.
2300 	 */
2301 	if (nnp)
2302 		return -EPERM;
2303 	return -EACCES;
2304 }
2305 
selinux_bprm_creds_for_exec(struct linux_binprm * bprm)2306 static int selinux_bprm_creds_for_exec(struct linux_binprm *bprm)
2307 {
2308 	const struct task_security_struct *old_tsec;
2309 	struct task_security_struct *new_tsec;
2310 	struct inode_security_struct *isec;
2311 	struct common_audit_data ad;
2312 	struct inode *inode = file_inode(bprm->file);
2313 	int rc;
2314 
2315 	/* SELinux context only depends on initial program or script and not
2316 	 * the script interpreter */
2317 
2318 	old_tsec = selinux_cred(current_cred());
2319 	new_tsec = selinux_cred(bprm->cred);
2320 	isec = inode_security(inode);
2321 
2322 	/* Default to the current task SID. */
2323 	new_tsec->sid = old_tsec->sid;
2324 	new_tsec->osid = old_tsec->sid;
2325 
2326 	/* Reset fs, key, and sock SIDs on execve. */
2327 	new_tsec->create_sid = 0;
2328 	new_tsec->keycreate_sid = 0;
2329 	new_tsec->sockcreate_sid = 0;
2330 
2331 	/*
2332 	 * Before policy is loaded, label any task outside kernel space
2333 	 * as SECINITSID_INIT, so that any userspace tasks surviving from
2334 	 * early boot end up with a label different from SECINITSID_KERNEL
2335 	 * (if the policy chooses to set SECINITSID_INIT != SECINITSID_KERNEL).
2336 	 */
2337 	if (!selinux_initialized()) {
2338 		new_tsec->sid = SECINITSID_INIT;
2339 		/* also clear the exec_sid just in case */
2340 		new_tsec->exec_sid = 0;
2341 		return 0;
2342 	}
2343 
2344 	if (old_tsec->exec_sid) {
2345 		new_tsec->sid = old_tsec->exec_sid;
2346 		/* Reset exec SID on execve. */
2347 		new_tsec->exec_sid = 0;
2348 
2349 		/* Fail on NNP or nosuid if not an allowed transition. */
2350 		rc = check_nnp_nosuid(bprm, old_tsec, new_tsec);
2351 		if (rc)
2352 			return rc;
2353 	} else {
2354 		/* Check for a default transition on this program. */
2355 		rc = security_transition_sid(old_tsec->sid,
2356 					     isec->sid, SECCLASS_PROCESS, NULL,
2357 					     &new_tsec->sid);
2358 		if (rc)
2359 			return rc;
2360 
2361 		/*
2362 		 * Fallback to old SID on NNP or nosuid if not an allowed
2363 		 * transition.
2364 		 */
2365 		rc = check_nnp_nosuid(bprm, old_tsec, new_tsec);
2366 		if (rc)
2367 			new_tsec->sid = old_tsec->sid;
2368 	}
2369 
2370 	ad.type = LSM_AUDIT_DATA_FILE;
2371 	ad.u.file = bprm->file;
2372 
2373 	if (new_tsec->sid == old_tsec->sid) {
2374 		rc = avc_has_perm(old_tsec->sid, isec->sid,
2375 				  SECCLASS_FILE, FILE__EXECUTE_NO_TRANS, &ad);
2376 		if (rc)
2377 			return rc;
2378 	} else {
2379 		/* Check permissions for the transition. */
2380 		rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
2381 				  SECCLASS_PROCESS, PROCESS__TRANSITION, &ad);
2382 		if (rc)
2383 			return rc;
2384 
2385 		rc = avc_has_perm(new_tsec->sid, isec->sid,
2386 				  SECCLASS_FILE, FILE__ENTRYPOINT, &ad);
2387 		if (rc)
2388 			return rc;
2389 
2390 		/* Check for shared state */
2391 		if (bprm->unsafe & LSM_UNSAFE_SHARE) {
2392 			rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
2393 					  SECCLASS_PROCESS, PROCESS__SHARE,
2394 					  NULL);
2395 			if (rc)
2396 				return -EPERM;
2397 		}
2398 
2399 		/* Make sure that anyone attempting to ptrace over a task that
2400 		 * changes its SID has the appropriate permit */
2401 		if (bprm->unsafe & LSM_UNSAFE_PTRACE) {
2402 			u32 ptsid = ptrace_parent_sid();
2403 			if (ptsid != 0) {
2404 				rc = avc_has_perm(ptsid, new_tsec->sid,
2405 						  SECCLASS_PROCESS,
2406 						  PROCESS__PTRACE, NULL);
2407 				if (rc)
2408 					return -EPERM;
2409 			}
2410 		}
2411 
2412 		/* Clear any possibly unsafe personality bits on exec: */
2413 		bprm->per_clear |= PER_CLEAR_ON_SETID;
2414 
2415 		/* Enable secure mode for SIDs transitions unless
2416 		   the noatsecure permission is granted between
2417 		   the two SIDs, i.e. ahp returns 0. */
2418 		rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
2419 				  SECCLASS_PROCESS, PROCESS__NOATSECURE,
2420 				  NULL);
2421 		bprm->secureexec |= !!rc;
2422 	}
2423 
2424 	return 0;
2425 }
2426 
match_file(const void * p,struct file * file,unsigned fd)2427 static int match_file(const void *p, struct file *file, unsigned fd)
2428 {
2429 	return file_has_perm(p, file, file_to_av(file)) ? fd + 1 : 0;
2430 }
2431 
2432 /* Derived from fs/exec.c:flush_old_files. */
flush_unauthorized_files(const struct cred * cred,struct files_struct * files)2433 static inline void flush_unauthorized_files(const struct cred *cred,
2434 					    struct files_struct *files)
2435 {
2436 	struct file *file, *devnull = NULL;
2437 	struct tty_struct *tty;
2438 	int drop_tty = 0;
2439 	unsigned n;
2440 
2441 	tty = get_current_tty();
2442 	if (tty) {
2443 		spin_lock(&tty->files_lock);
2444 		if (!list_empty(&tty->tty_files)) {
2445 			struct tty_file_private *file_priv;
2446 
2447 			/* Revalidate access to controlling tty.
2448 			   Use file_path_has_perm on the tty path directly
2449 			   rather than using file_has_perm, as this particular
2450 			   open file may belong to another process and we are
2451 			   only interested in the inode-based check here. */
2452 			file_priv = list_first_entry(&tty->tty_files,
2453 						struct tty_file_private, list);
2454 			file = file_priv->file;
2455 			if (file_path_has_perm(cred, file, FILE__READ | FILE__WRITE))
2456 				drop_tty = 1;
2457 		}
2458 		spin_unlock(&tty->files_lock);
2459 		tty_kref_put(tty);
2460 	}
2461 	/* Reset controlling tty. */
2462 	if (drop_tty)
2463 		no_tty();
2464 
2465 	/* Revalidate access to inherited open files. */
2466 	n = iterate_fd(files, 0, match_file, cred);
2467 	if (!n) /* none found? */
2468 		return;
2469 
2470 	devnull = dentry_open(&selinux_null, O_RDWR, cred);
2471 	if (IS_ERR(devnull))
2472 		devnull = NULL;
2473 	/* replace all the matching ones with this */
2474 	do {
2475 		replace_fd(n - 1, devnull, 0);
2476 	} while ((n = iterate_fd(files, n, match_file, cred)) != 0);
2477 	if (devnull)
2478 		fput(devnull);
2479 }
2480 
2481 /*
2482  * Prepare a process for imminent new credential changes due to exec
2483  */
selinux_bprm_committing_creds(const struct linux_binprm * bprm)2484 static void selinux_bprm_committing_creds(const struct linux_binprm *bprm)
2485 {
2486 	struct task_security_struct *new_tsec;
2487 	struct rlimit *rlim, *initrlim;
2488 	int rc, i;
2489 
2490 	new_tsec = selinux_cred(bprm->cred);
2491 	if (new_tsec->sid == new_tsec->osid)
2492 		return;
2493 
2494 	/* Close files for which the new task SID is not authorized. */
2495 	flush_unauthorized_files(bprm->cred, current->files);
2496 
2497 	/* Always clear parent death signal on SID transitions. */
2498 	current->pdeath_signal = 0;
2499 
2500 	/* Check whether the new SID can inherit resource limits from the old
2501 	 * SID.  If not, reset all soft limits to the lower of the current
2502 	 * task's hard limit and the init task's soft limit.
2503 	 *
2504 	 * Note that the setting of hard limits (even to lower them) can be
2505 	 * controlled by the setrlimit check.  The inclusion of the init task's
2506 	 * soft limit into the computation is to avoid resetting soft limits
2507 	 * higher than the default soft limit for cases where the default is
2508 	 * lower than the hard limit, e.g. RLIMIT_CORE or RLIMIT_STACK.
2509 	 */
2510 	rc = avc_has_perm(new_tsec->osid, new_tsec->sid, SECCLASS_PROCESS,
2511 			  PROCESS__RLIMITINH, NULL);
2512 	if (rc) {
2513 		/* protect against do_prlimit() */
2514 		task_lock(current);
2515 		for (i = 0; i < RLIM_NLIMITS; i++) {
2516 			rlim = current->signal->rlim + i;
2517 			initrlim = init_task.signal->rlim + i;
2518 			rlim->rlim_cur = min(rlim->rlim_max, initrlim->rlim_cur);
2519 		}
2520 		task_unlock(current);
2521 		if (IS_ENABLED(CONFIG_POSIX_TIMERS))
2522 			update_rlimit_cpu(current, rlimit(RLIMIT_CPU));
2523 	}
2524 }
2525 
2526 /*
2527  * Clean up the process immediately after the installation of new credentials
2528  * due to exec
2529  */
selinux_bprm_committed_creds(const struct linux_binprm * bprm)2530 static void selinux_bprm_committed_creds(const struct linux_binprm *bprm)
2531 {
2532 	const struct task_security_struct *tsec = selinux_cred(current_cred());
2533 	u32 osid, sid;
2534 	int rc;
2535 
2536 	osid = tsec->osid;
2537 	sid = tsec->sid;
2538 
2539 	if (sid == osid)
2540 		return;
2541 
2542 	/* Check whether the new SID can inherit signal state from the old SID.
2543 	 * If not, clear itimers to avoid subsequent signal generation and
2544 	 * flush and unblock signals.
2545 	 *
2546 	 * This must occur _after_ the task SID has been updated so that any
2547 	 * kill done after the flush will be checked against the new SID.
2548 	 */
2549 	rc = avc_has_perm(osid, sid, SECCLASS_PROCESS, PROCESS__SIGINH, NULL);
2550 	if (rc) {
2551 		clear_itimer();
2552 
2553 		spin_lock_irq(&unrcu_pointer(current->sighand)->siglock);
2554 		if (!fatal_signal_pending(current)) {
2555 			flush_sigqueue(&current->pending);
2556 			flush_sigqueue(&current->signal->shared_pending);
2557 			flush_signal_handlers(current, 1);
2558 			sigemptyset(&current->blocked);
2559 			recalc_sigpending();
2560 		}
2561 		spin_unlock_irq(&unrcu_pointer(current->sighand)->siglock);
2562 	}
2563 
2564 	/* Wake up the parent if it is waiting so that it can recheck
2565 	 * wait permission to the new task SID. */
2566 	read_lock(&tasklist_lock);
2567 	__wake_up_parent(current, unrcu_pointer(current->real_parent));
2568 	read_unlock(&tasklist_lock);
2569 }
2570 
2571 /* superblock security operations */
2572 
selinux_sb_alloc_security(struct super_block * sb)2573 static int selinux_sb_alloc_security(struct super_block *sb)
2574 {
2575 	struct superblock_security_struct *sbsec = selinux_superblock(sb);
2576 
2577 	mutex_init(&sbsec->lock);
2578 	INIT_LIST_HEAD(&sbsec->isec_head);
2579 	spin_lock_init(&sbsec->isec_lock);
2580 	sbsec->sid = SECINITSID_UNLABELED;
2581 	sbsec->def_sid = SECINITSID_FILE;
2582 	sbsec->mntpoint_sid = SECINITSID_UNLABELED;
2583 
2584 	return 0;
2585 }
2586 
opt_len(const char * s)2587 static inline int opt_len(const char *s)
2588 {
2589 	bool open_quote = false;
2590 	int len;
2591 	char c;
2592 
2593 	for (len = 0; (c = s[len]) != '\0'; len++) {
2594 		if (c == '"')
2595 			open_quote = !open_quote;
2596 		if (c == ',' && !open_quote)
2597 			break;
2598 	}
2599 	return len;
2600 }
2601 
selinux_sb_eat_lsm_opts(char * options,void ** mnt_opts)2602 static int selinux_sb_eat_lsm_opts(char *options, void **mnt_opts)
2603 {
2604 	char *from = options;
2605 	char *to = options;
2606 	bool first = true;
2607 	int rc;
2608 
2609 	while (1) {
2610 		int len = opt_len(from);
2611 		int token;
2612 		char *arg = NULL;
2613 
2614 		token = match_opt_prefix(from, len, &arg);
2615 
2616 		if (token != Opt_error) {
2617 			char *p, *q;
2618 
2619 			/* strip quotes */
2620 			if (arg) {
2621 				for (p = q = arg; p < from + len; p++) {
2622 					char c = *p;
2623 					if (c != '"')
2624 						*q++ = c;
2625 				}
2626 				arg = kmemdup_nul(arg, q - arg, GFP_KERNEL);
2627 				if (!arg) {
2628 					rc = -ENOMEM;
2629 					goto free_opt;
2630 				}
2631 			}
2632 			rc = selinux_add_opt(token, arg, mnt_opts);
2633 			kfree(arg);
2634 			arg = NULL;
2635 			if (unlikely(rc)) {
2636 				goto free_opt;
2637 			}
2638 		} else {
2639 			if (!first) {	// copy with preceding comma
2640 				from--;
2641 				len++;
2642 			}
2643 			if (to != from)
2644 				memmove(to, from, len);
2645 			to += len;
2646 			first = false;
2647 		}
2648 		if (!from[len])
2649 			break;
2650 		from += len + 1;
2651 	}
2652 	*to = '\0';
2653 	return 0;
2654 
2655 free_opt:
2656 	if (*mnt_opts) {
2657 		selinux_free_mnt_opts(*mnt_opts);
2658 		*mnt_opts = NULL;
2659 	}
2660 	return rc;
2661 }
2662 
selinux_sb_mnt_opts_compat(struct super_block * sb,void * mnt_opts)2663 static int selinux_sb_mnt_opts_compat(struct super_block *sb, void *mnt_opts)
2664 {
2665 	struct selinux_mnt_opts *opts = mnt_opts;
2666 	struct superblock_security_struct *sbsec = selinux_superblock(sb);
2667 
2668 	/*
2669 	 * Superblock not initialized (i.e. no options) - reject if any
2670 	 * options specified, otherwise accept.
2671 	 */
2672 	if (!(sbsec->flags & SE_SBINITIALIZED))
2673 		return opts ? 1 : 0;
2674 
2675 	/*
2676 	 * Superblock initialized and no options specified - reject if
2677 	 * superblock has any options set, otherwise accept.
2678 	 */
2679 	if (!opts)
2680 		return (sbsec->flags & SE_MNTMASK) ? 1 : 0;
2681 
2682 	if (opts->fscontext_sid) {
2683 		if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid,
2684 			       opts->fscontext_sid))
2685 			return 1;
2686 	}
2687 	if (opts->context_sid) {
2688 		if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid,
2689 			       opts->context_sid))
2690 			return 1;
2691 	}
2692 	if (opts->rootcontext_sid) {
2693 		struct inode_security_struct *root_isec;
2694 
2695 		root_isec = backing_inode_security(sb->s_root);
2696 		if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid,
2697 			       opts->rootcontext_sid))
2698 			return 1;
2699 	}
2700 	if (opts->defcontext_sid) {
2701 		if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid,
2702 			       opts->defcontext_sid))
2703 			return 1;
2704 	}
2705 	return 0;
2706 }
2707 
selinux_sb_remount(struct super_block * sb,void * mnt_opts)2708 static int selinux_sb_remount(struct super_block *sb, void *mnt_opts)
2709 {
2710 	struct selinux_mnt_opts *opts = mnt_opts;
2711 	struct superblock_security_struct *sbsec = selinux_superblock(sb);
2712 
2713 	if (!(sbsec->flags & SE_SBINITIALIZED))
2714 		return 0;
2715 
2716 	if (!opts)
2717 		return 0;
2718 
2719 	if (opts->fscontext_sid) {
2720 		if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid,
2721 			       opts->fscontext_sid))
2722 			goto out_bad_option;
2723 	}
2724 	if (opts->context_sid) {
2725 		if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid,
2726 			       opts->context_sid))
2727 			goto out_bad_option;
2728 	}
2729 	if (opts->rootcontext_sid) {
2730 		struct inode_security_struct *root_isec;
2731 		root_isec = backing_inode_security(sb->s_root);
2732 		if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid,
2733 			       opts->rootcontext_sid))
2734 			goto out_bad_option;
2735 	}
2736 	if (opts->defcontext_sid) {
2737 		if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid,
2738 			       opts->defcontext_sid))
2739 			goto out_bad_option;
2740 	}
2741 	return 0;
2742 
2743 out_bad_option:
2744 	pr_warn("SELinux: unable to change security options "
2745 	       "during remount (dev %s, type=%s)\n", sb->s_id,
2746 	       sb->s_type->name);
2747 	return -EINVAL;
2748 }
2749 
selinux_sb_kern_mount(const struct super_block * sb)2750 static int selinux_sb_kern_mount(const struct super_block *sb)
2751 {
2752 	const struct cred *cred = current_cred();
2753 	struct common_audit_data ad;
2754 
2755 	ad.type = LSM_AUDIT_DATA_DENTRY;
2756 	ad.u.dentry = sb->s_root;
2757 	return superblock_has_perm(cred, sb, FILESYSTEM__MOUNT, &ad);
2758 }
2759 
selinux_sb_statfs(struct dentry * dentry)2760 static int selinux_sb_statfs(struct dentry *dentry)
2761 {
2762 	const struct cred *cred = current_cred();
2763 	struct common_audit_data ad;
2764 
2765 	ad.type = LSM_AUDIT_DATA_DENTRY;
2766 	ad.u.dentry = dentry->d_sb->s_root;
2767 	return superblock_has_perm(cred, dentry->d_sb, FILESYSTEM__GETATTR, &ad);
2768 }
2769 
selinux_mount(const char * dev_name,const struct path * path,const char * type,unsigned long flags,void * data)2770 static int selinux_mount(const char *dev_name,
2771 			 const struct path *path,
2772 			 const char *type,
2773 			 unsigned long flags,
2774 			 void *data)
2775 {
2776 	const struct cred *cred = current_cred();
2777 
2778 	if (flags & MS_REMOUNT)
2779 		return superblock_has_perm(cred, path->dentry->d_sb,
2780 					   FILESYSTEM__REMOUNT, NULL);
2781 	else
2782 		return path_has_perm(cred, path, FILE__MOUNTON);
2783 }
2784 
selinux_move_mount(const struct path * from_path,const struct path * to_path)2785 static int selinux_move_mount(const struct path *from_path,
2786 			      const struct path *to_path)
2787 {
2788 	const struct cred *cred = current_cred();
2789 
2790 	return path_has_perm(cred, to_path, FILE__MOUNTON);
2791 }
2792 
selinux_umount(struct vfsmount * mnt,int flags)2793 static int selinux_umount(struct vfsmount *mnt, int flags)
2794 {
2795 	const struct cred *cred = current_cred();
2796 
2797 	return superblock_has_perm(cred, mnt->mnt_sb,
2798 				   FILESYSTEM__UNMOUNT, NULL);
2799 }
2800 
selinux_fs_context_submount(struct fs_context * fc,struct super_block * reference)2801 static int selinux_fs_context_submount(struct fs_context *fc,
2802 				   struct super_block *reference)
2803 {
2804 	const struct superblock_security_struct *sbsec = selinux_superblock(reference);
2805 	struct selinux_mnt_opts *opts;
2806 
2807 	/*
2808 	 * Ensure that fc->security remains NULL when no options are set
2809 	 * as expected by selinux_set_mnt_opts().
2810 	 */
2811 	if (!(sbsec->flags & (FSCONTEXT_MNT|CONTEXT_MNT|DEFCONTEXT_MNT)))
2812 		return 0;
2813 
2814 	opts = kzalloc(sizeof(*opts), GFP_KERNEL);
2815 	if (!opts)
2816 		return -ENOMEM;
2817 
2818 	if (sbsec->flags & FSCONTEXT_MNT)
2819 		opts->fscontext_sid = sbsec->sid;
2820 	if (sbsec->flags & CONTEXT_MNT)
2821 		opts->context_sid = sbsec->mntpoint_sid;
2822 	if (sbsec->flags & DEFCONTEXT_MNT)
2823 		opts->defcontext_sid = sbsec->def_sid;
2824 	fc->security = opts;
2825 	return 0;
2826 }
2827 
selinux_fs_context_dup(struct fs_context * fc,struct fs_context * src_fc)2828 static int selinux_fs_context_dup(struct fs_context *fc,
2829 				  struct fs_context *src_fc)
2830 {
2831 	const struct selinux_mnt_opts *src = src_fc->security;
2832 
2833 	if (!src)
2834 		return 0;
2835 
2836 	fc->security = kmemdup(src, sizeof(*src), GFP_KERNEL);
2837 	return fc->security ? 0 : -ENOMEM;
2838 }
2839 
2840 static const struct fs_parameter_spec selinux_fs_parameters[] = {
2841 	fsparam_string(CONTEXT_STR,	Opt_context),
2842 	fsparam_string(DEFCONTEXT_STR,	Opt_defcontext),
2843 	fsparam_string(FSCONTEXT_STR,	Opt_fscontext),
2844 	fsparam_string(ROOTCONTEXT_STR,	Opt_rootcontext),
2845 	fsparam_flag  (SECLABEL_STR,	Opt_seclabel),
2846 	{}
2847 };
2848 
selinux_fs_context_parse_param(struct fs_context * fc,struct fs_parameter * param)2849 static int selinux_fs_context_parse_param(struct fs_context *fc,
2850 					  struct fs_parameter *param)
2851 {
2852 	struct fs_parse_result result;
2853 	int opt;
2854 
2855 	opt = fs_parse(fc, selinux_fs_parameters, param, &result);
2856 	if (opt < 0)
2857 		return opt;
2858 
2859 	return selinux_add_opt(opt, param->string, &fc->security);
2860 }
2861 
2862 /* inode security operations */
2863 
selinux_inode_alloc_security(struct inode * inode)2864 static int selinux_inode_alloc_security(struct inode *inode)
2865 {
2866 	struct inode_security_struct *isec = selinux_inode(inode);
2867 	u32 sid = current_sid();
2868 
2869 	spin_lock_init(&isec->lock);
2870 	INIT_LIST_HEAD(&isec->list);
2871 	isec->inode = inode;
2872 	isec->sid = SECINITSID_UNLABELED;
2873 	isec->sclass = SECCLASS_FILE;
2874 	isec->task_sid = sid;
2875 	isec->initialized = LABEL_INVALID;
2876 
2877 	return 0;
2878 }
2879 
selinux_inode_free_security(struct inode * inode)2880 static void selinux_inode_free_security(struct inode *inode)
2881 {
2882 	inode_free_security(inode);
2883 }
2884 
selinux_dentry_init_security(struct dentry * dentry,int mode,const struct qstr * name,const char ** xattr_name,struct lsm_context * cp)2885 static int selinux_dentry_init_security(struct dentry *dentry, int mode,
2886 					const struct qstr *name,
2887 					const char **xattr_name,
2888 					struct lsm_context *cp)
2889 {
2890 	u32 newsid;
2891 	int rc;
2892 
2893 	rc = selinux_determine_inode_label(selinux_cred(current_cred()),
2894 					   d_inode(dentry->d_parent), name,
2895 					   inode_mode_to_security_class(mode),
2896 					   &newsid);
2897 	if (rc)
2898 		return rc;
2899 
2900 	if (xattr_name)
2901 		*xattr_name = XATTR_NAME_SELINUX;
2902 
2903 	cp->id = LSM_ID_SELINUX;
2904 	return security_sid_to_context(newsid, &cp->context, &cp->len);
2905 }
2906 
selinux_dentry_create_files_as(struct dentry * dentry,int mode,const struct qstr * name,const struct cred * old,struct cred * new)2907 static int selinux_dentry_create_files_as(struct dentry *dentry, int mode,
2908 					  const struct qstr *name,
2909 					  const struct cred *old,
2910 					  struct cred *new)
2911 {
2912 	u32 newsid;
2913 	int rc;
2914 	struct task_security_struct *tsec;
2915 
2916 	rc = selinux_determine_inode_label(selinux_cred(old),
2917 					   d_inode(dentry->d_parent), name,
2918 					   inode_mode_to_security_class(mode),
2919 					   &newsid);
2920 	if (rc)
2921 		return rc;
2922 
2923 	tsec = selinux_cred(new);
2924 	tsec->create_sid = newsid;
2925 	return 0;
2926 }
2927 
selinux_inode_init_security(struct inode * inode,struct inode * dir,const struct qstr * qstr,struct xattr * xattrs,int * xattr_count)2928 static int selinux_inode_init_security(struct inode *inode, struct inode *dir,
2929 				       const struct qstr *qstr,
2930 				       struct xattr *xattrs, int *xattr_count)
2931 {
2932 	const struct task_security_struct *tsec = selinux_cred(current_cred());
2933 	struct superblock_security_struct *sbsec;
2934 	struct xattr *xattr = lsm_get_xattr_slot(xattrs, xattr_count);
2935 	u32 newsid, clen;
2936 	u16 newsclass;
2937 	int rc;
2938 	char *context;
2939 
2940 	sbsec = selinux_superblock(dir->i_sb);
2941 
2942 	newsid = tsec->create_sid;
2943 	newsclass = inode_mode_to_security_class(inode->i_mode);
2944 	rc = selinux_determine_inode_label(tsec, dir, qstr, newsclass, &newsid);
2945 	if (rc)
2946 		return rc;
2947 
2948 	/* Possibly defer initialization to selinux_complete_init. */
2949 	if (sbsec->flags & SE_SBINITIALIZED) {
2950 		struct inode_security_struct *isec = selinux_inode(inode);
2951 		isec->sclass = newsclass;
2952 		isec->sid = newsid;
2953 		isec->initialized = LABEL_INITIALIZED;
2954 	}
2955 
2956 	if (!selinux_initialized() ||
2957 	    !(sbsec->flags & SBLABEL_MNT))
2958 		return -EOPNOTSUPP;
2959 
2960 	if (xattr) {
2961 		rc = security_sid_to_context_force(newsid,
2962 						   &context, &clen);
2963 		if (rc)
2964 			return rc;
2965 		xattr->value = context;
2966 		xattr->value_len = clen;
2967 		xattr->name = XATTR_SELINUX_SUFFIX;
2968 	}
2969 
2970 	return 0;
2971 }
2972 
selinux_inode_init_security_anon(struct inode * inode,const struct qstr * name,const struct inode * context_inode)2973 static int selinux_inode_init_security_anon(struct inode *inode,
2974 					    const struct qstr *name,
2975 					    const struct inode *context_inode)
2976 {
2977 	u32 sid = current_sid();
2978 	struct common_audit_data ad;
2979 	struct inode_security_struct *isec;
2980 	int rc;
2981 
2982 	if (unlikely(!selinux_initialized()))
2983 		return 0;
2984 
2985 	isec = selinux_inode(inode);
2986 
2987 	/*
2988 	 * We only get here once per ephemeral inode.  The inode has
2989 	 * been initialized via inode_alloc_security but is otherwise
2990 	 * untouched.
2991 	 */
2992 
2993 	if (context_inode) {
2994 		struct inode_security_struct *context_isec =
2995 			selinux_inode(context_inode);
2996 		if (context_isec->initialized != LABEL_INITIALIZED) {
2997 			pr_err("SELinux:  context_inode is not initialized\n");
2998 			return -EACCES;
2999 		}
3000 
3001 		isec->sclass = context_isec->sclass;
3002 		isec->sid = context_isec->sid;
3003 	} else {
3004 		isec->sclass = SECCLASS_ANON_INODE;
3005 		rc = security_transition_sid(
3006 			sid, sid,
3007 			isec->sclass, name, &isec->sid);
3008 		if (rc)
3009 			return rc;
3010 	}
3011 
3012 	isec->initialized = LABEL_INITIALIZED;
3013 	/*
3014 	 * Now that we've initialized security, check whether we're
3015 	 * allowed to actually create this type of anonymous inode.
3016 	 */
3017 
3018 	ad.type = LSM_AUDIT_DATA_ANONINODE;
3019 	ad.u.anonclass = name ? (const char *)name->name : "?";
3020 
3021 	return avc_has_perm(sid,
3022 			    isec->sid,
3023 			    isec->sclass,
3024 			    FILE__CREATE,
3025 			    &ad);
3026 }
3027 
selinux_inode_create(struct inode * dir,struct dentry * dentry,umode_t mode)3028 static int selinux_inode_create(struct inode *dir, struct dentry *dentry, umode_t mode)
3029 {
3030 	return may_create(dir, dentry, SECCLASS_FILE);
3031 }
3032 
selinux_inode_link(struct dentry * old_dentry,struct inode * dir,struct dentry * new_dentry)3033 static int selinux_inode_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
3034 {
3035 	return may_link(dir, old_dentry, MAY_LINK);
3036 }
3037 
selinux_inode_unlink(struct inode * dir,struct dentry * dentry)3038 static int selinux_inode_unlink(struct inode *dir, struct dentry *dentry)
3039 {
3040 	return may_link(dir, dentry, MAY_UNLINK);
3041 }
3042 
selinux_inode_symlink(struct inode * dir,struct dentry * dentry,const char * name)3043 static int selinux_inode_symlink(struct inode *dir, struct dentry *dentry, const char *name)
3044 {
3045 	return may_create(dir, dentry, SECCLASS_LNK_FILE);
3046 }
3047 
selinux_inode_mkdir(struct inode * dir,struct dentry * dentry,umode_t mask)3048 static int selinux_inode_mkdir(struct inode *dir, struct dentry *dentry, umode_t mask)
3049 {
3050 	return may_create(dir, dentry, SECCLASS_DIR);
3051 }
3052 
selinux_inode_rmdir(struct inode * dir,struct dentry * dentry)3053 static int selinux_inode_rmdir(struct inode *dir, struct dentry *dentry)
3054 {
3055 	return may_link(dir, dentry, MAY_RMDIR);
3056 }
3057 
selinux_inode_mknod(struct inode * dir,struct dentry * dentry,umode_t mode,dev_t dev)3058 static int selinux_inode_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
3059 {
3060 	return may_create(dir, dentry, inode_mode_to_security_class(mode));
3061 }
3062 
selinux_inode_rename(struct inode * old_inode,struct dentry * old_dentry,struct inode * new_inode,struct dentry * new_dentry)3063 static int selinux_inode_rename(struct inode *old_inode, struct dentry *old_dentry,
3064 				struct inode *new_inode, struct dentry *new_dentry)
3065 {
3066 	return may_rename(old_inode, old_dentry, new_inode, new_dentry);
3067 }
3068 
selinux_inode_readlink(struct dentry * dentry)3069 static int selinux_inode_readlink(struct dentry *dentry)
3070 {
3071 	const struct cred *cred = current_cred();
3072 
3073 	return dentry_has_perm(cred, dentry, FILE__READ);
3074 }
3075 
selinux_inode_follow_link(struct dentry * dentry,struct inode * inode,bool rcu)3076 static int selinux_inode_follow_link(struct dentry *dentry, struct inode *inode,
3077 				     bool rcu)
3078 {
3079 	struct common_audit_data ad;
3080 	struct inode_security_struct *isec;
3081 	u32 sid = current_sid();
3082 
3083 	ad.type = LSM_AUDIT_DATA_DENTRY;
3084 	ad.u.dentry = dentry;
3085 	isec = inode_security_rcu(inode, rcu);
3086 	if (IS_ERR(isec))
3087 		return PTR_ERR(isec);
3088 
3089 	return avc_has_perm(sid, isec->sid, isec->sclass, FILE__READ, &ad);
3090 }
3091 
audit_inode_permission(struct inode * inode,u32 perms,u32 audited,u32 denied,int result)3092 static noinline int audit_inode_permission(struct inode *inode,
3093 					   u32 perms, u32 audited, u32 denied,
3094 					   int result)
3095 {
3096 	struct common_audit_data ad;
3097 	struct inode_security_struct *isec = selinux_inode(inode);
3098 
3099 	ad.type = LSM_AUDIT_DATA_INODE;
3100 	ad.u.inode = inode;
3101 
3102 	return slow_avc_audit(current_sid(), isec->sid, isec->sclass, perms,
3103 			    audited, denied, result, &ad);
3104 }
3105 
3106 /**
3107  * task_avdcache_reset - Reset the task's AVD cache
3108  * @tsec: the task's security state
3109  *
3110  * Clear the task's AVD cache in @tsec and reset it to the current policy's
3111  * and task's info.
3112  */
task_avdcache_reset(struct task_security_struct * tsec)3113 static inline void task_avdcache_reset(struct task_security_struct *tsec)
3114 {
3115 	memset(&tsec->avdcache.dir, 0, sizeof(tsec->avdcache.dir));
3116 	tsec->avdcache.sid = tsec->sid;
3117 	tsec->avdcache.seqno = avc_policy_seqno();
3118 	tsec->avdcache.dir_spot = TSEC_AVDC_DIR_SIZE - 1;
3119 }
3120 
3121 /**
3122  * task_avdcache_search - Search the task's AVD cache
3123  * @tsec: the task's security state
3124  * @isec: the inode to search for in the cache
3125  * @avdc: matching avd cache entry returned to the caller
3126  *
3127  * Search @tsec for a AVD cache entry that matches @isec and return it to the
3128  * caller via @avdc.  Returns 0 if a match is found, negative values otherwise.
3129  */
task_avdcache_search(struct task_security_struct * tsec,struct inode_security_struct * isec,struct avdc_entry ** avdc)3130 static inline int task_avdcache_search(struct task_security_struct *tsec,
3131 				       struct inode_security_struct *isec,
3132 				       struct avdc_entry **avdc)
3133 {
3134 	int orig, iter;
3135 
3136 	/* focused on path walk optimization, only cache directories */
3137 	if (isec->sclass != SECCLASS_DIR)
3138 		return -ENOENT;
3139 
3140 	if (unlikely(tsec->sid != tsec->avdcache.sid ||
3141 		     tsec->avdcache.seqno != avc_policy_seqno())) {
3142 		task_avdcache_reset(tsec);
3143 		return -ENOENT;
3144 	}
3145 
3146 	orig = iter = tsec->avdcache.dir_spot;
3147 	do {
3148 		if (tsec->avdcache.dir[iter].isid == isec->sid) {
3149 			/* cache hit */
3150 			tsec->avdcache.dir_spot = iter;
3151 			*avdc = &tsec->avdcache.dir[iter];
3152 			return 0;
3153 		}
3154 		iter = (iter - 1) & (TSEC_AVDC_DIR_SIZE - 1);
3155 	} while (iter != orig);
3156 
3157 	return -ENOENT;
3158 }
3159 
3160 /**
3161  * task_avdcache_update - Update the task's AVD cache
3162  * @tsec: the task's security state
3163  * @isec: the inode associated with the cache entry
3164  * @avd: the AVD to cache
3165  * @audited: the permission audit bitmask to cache
3166  *
3167  * Update the AVD cache in @tsec with the @avdc and @audited info associated
3168  * with @isec.
3169  */
task_avdcache_update(struct task_security_struct * tsec,struct inode_security_struct * isec,struct av_decision * avd,u32 audited)3170 static inline void task_avdcache_update(struct task_security_struct *tsec,
3171 					struct inode_security_struct *isec,
3172 					struct av_decision *avd,
3173 					u32 audited)
3174 {
3175 	int spot;
3176 
3177 	/* focused on path walk optimization, only cache directories */
3178 	if (isec->sclass != SECCLASS_DIR)
3179 		return;
3180 
3181 	/* update cache */
3182 	spot = (tsec->avdcache.dir_spot + 1) & (TSEC_AVDC_DIR_SIZE - 1);
3183 	tsec->avdcache.dir_spot = spot;
3184 	tsec->avdcache.dir[spot].isid = isec->sid;
3185 	tsec->avdcache.dir[spot].audited = audited;
3186 	tsec->avdcache.dir[spot].allowed = avd->allowed;
3187 	tsec->avdcache.dir[spot].permissive = avd->flags & AVD_FLAGS_PERMISSIVE;
3188 	tsec->avdcache.permissive_neveraudit =
3189 		(avd->flags == (AVD_FLAGS_PERMISSIVE|AVD_FLAGS_NEVERAUDIT));
3190 }
3191 
3192 /**
3193  * selinux_inode_permission - Check if the current task can access an inode
3194  * @inode: the inode that is being accessed
3195  * @requested: the accesses being requested
3196  *
3197  * Check if the current task is allowed to access @inode according to
3198  * @requested.  Returns 0 if allowed, negative values otherwise.
3199  */
selinux_inode_permission(struct inode * inode,int requested)3200 static int selinux_inode_permission(struct inode *inode, int requested)
3201 {
3202 	int mask;
3203 	u32 perms;
3204 	struct task_security_struct *tsec;
3205 	struct inode_security_struct *isec;
3206 	struct avdc_entry *avdc;
3207 	int rc, rc2;
3208 	u32 audited, denied;
3209 
3210 	mask = requested & (MAY_READ|MAY_WRITE|MAY_EXEC|MAY_APPEND);
3211 
3212 	/* No permission to check.  Existence test. */
3213 	if (!mask)
3214 		return 0;
3215 
3216 	tsec = selinux_cred(current_cred());
3217 	if (task_avdcache_permnoaudit(tsec))
3218 		return 0;
3219 
3220 	isec = inode_security_rcu(inode, requested & MAY_NOT_BLOCK);
3221 	if (IS_ERR(isec))
3222 		return PTR_ERR(isec);
3223 	perms = file_mask_to_av(inode->i_mode, mask);
3224 
3225 	rc = task_avdcache_search(tsec, isec, &avdc);
3226 	if (likely(!rc)) {
3227 		/* Cache hit. */
3228 		audited = perms & avdc->audited;
3229 		denied = perms & ~avdc->allowed;
3230 		if (unlikely(denied && enforcing_enabled() &&
3231 			     !avdc->permissive))
3232 			rc = -EACCES;
3233 	} else {
3234 		struct av_decision avd;
3235 
3236 		/* Cache miss. */
3237 		rc = avc_has_perm_noaudit(tsec->sid, isec->sid, isec->sclass,
3238 					  perms, 0, &avd);
3239 		audited = avc_audit_required(perms, &avd, rc,
3240 			(requested & MAY_ACCESS) ? FILE__AUDIT_ACCESS : 0,
3241 			&denied);
3242 		task_avdcache_update(tsec, isec, &avd, audited);
3243 	}
3244 
3245 	if (likely(!audited))
3246 		return rc;
3247 
3248 	rc2 = audit_inode_permission(inode, perms, audited, denied, rc);
3249 	if (rc2)
3250 		return rc2;
3251 
3252 	return rc;
3253 }
3254 
selinux_inode_setattr(struct mnt_idmap * idmap,struct dentry * dentry,struct iattr * iattr)3255 static int selinux_inode_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
3256 				 struct iattr *iattr)
3257 {
3258 	const struct cred *cred = current_cred();
3259 	struct inode *inode = d_backing_inode(dentry);
3260 	unsigned int ia_valid = iattr->ia_valid;
3261 	u32 av = FILE__WRITE;
3262 
3263 	/* ATTR_FORCE is just used for ATTR_KILL_S[UG]ID. */
3264 	if (ia_valid & ATTR_FORCE) {
3265 		ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_MODE |
3266 			      ATTR_FORCE);
3267 		if (!ia_valid)
3268 			return 0;
3269 	}
3270 
3271 	if (ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID |
3272 			ATTR_ATIME_SET | ATTR_MTIME_SET | ATTR_TIMES_SET))
3273 		return dentry_has_perm(cred, dentry, FILE__SETATTR);
3274 
3275 	if (selinux_policycap_openperm() &&
3276 	    inode->i_sb->s_magic != SOCKFS_MAGIC &&
3277 	    (ia_valid & ATTR_SIZE) &&
3278 	    !(ia_valid & ATTR_FILE))
3279 		av |= FILE__OPEN;
3280 
3281 	return dentry_has_perm(cred, dentry, av);
3282 }
3283 
selinux_inode_getattr(const struct path * path)3284 static int selinux_inode_getattr(const struct path *path)
3285 {
3286 	struct task_security_struct *tsec;
3287 
3288 	tsec = selinux_cred(current_cred());
3289 
3290 	if (task_avdcache_permnoaudit(tsec))
3291 		return 0;
3292 
3293 	return path_has_perm(current_cred(), path, FILE__GETATTR);
3294 }
3295 
has_cap_mac_admin(bool audit)3296 static bool has_cap_mac_admin(bool audit)
3297 {
3298 	const struct cred *cred = current_cred();
3299 	unsigned int opts = audit ? CAP_OPT_NONE : CAP_OPT_NOAUDIT;
3300 
3301 	if (cap_capable(cred, &init_user_ns, CAP_MAC_ADMIN, opts))
3302 		return false;
3303 	if (cred_has_capability(cred, CAP_MAC_ADMIN, opts, true))
3304 		return false;
3305 	return true;
3306 }
3307 
3308 /**
3309  * selinux_inode_xattr_skipcap - Skip the xattr capability checks?
3310  * @name: name of the xattr
3311  *
3312  * Returns 1 to indicate that SELinux "owns" the access control rights to xattrs
3313  * named @name; the LSM layer should avoid enforcing any traditional
3314  * capability based access controls on this xattr.  Returns 0 to indicate that
3315  * SELinux does not "own" the access control rights to xattrs named @name and is
3316  * deferring to the LSM layer for further access controls, including capability
3317  * based controls.
3318  */
selinux_inode_xattr_skipcap(const char * name)3319 static int selinux_inode_xattr_skipcap(const char *name)
3320 {
3321 	/* require capability check if not a selinux xattr */
3322 	return !strcmp(name, XATTR_NAME_SELINUX);
3323 }
3324 
selinux_inode_setxattr(struct mnt_idmap * idmap,struct dentry * dentry,const char * name,const void * value,size_t size,int flags)3325 static int selinux_inode_setxattr(struct mnt_idmap *idmap,
3326 				  struct dentry *dentry, const char *name,
3327 				  const void *value, size_t size, int flags)
3328 {
3329 	struct inode *inode = d_backing_inode(dentry);
3330 	struct inode_security_struct *isec;
3331 	struct superblock_security_struct *sbsec;
3332 	struct common_audit_data ad;
3333 	u32 newsid, sid = current_sid();
3334 	int rc = 0;
3335 
3336 	/* if not a selinux xattr, only check the ordinary setattr perm */
3337 	if (strcmp(name, XATTR_NAME_SELINUX))
3338 		return dentry_has_perm(current_cred(), dentry, FILE__SETATTR);
3339 
3340 	if (!selinux_initialized())
3341 		return (inode_owner_or_capable(idmap, inode) ? 0 : -EPERM);
3342 
3343 	sbsec = selinux_superblock(inode->i_sb);
3344 	if (!(sbsec->flags & SBLABEL_MNT))
3345 		return -EOPNOTSUPP;
3346 
3347 	if (!inode_owner_or_capable(idmap, inode))
3348 		return -EPERM;
3349 
3350 	ad.type = LSM_AUDIT_DATA_DENTRY;
3351 	ad.u.dentry = dentry;
3352 
3353 	isec = backing_inode_security(dentry);
3354 	rc = avc_has_perm(sid, isec->sid, isec->sclass,
3355 			  FILE__RELABELFROM, &ad);
3356 	if (rc)
3357 		return rc;
3358 
3359 	rc = security_context_to_sid(value, size, &newsid,
3360 				     GFP_KERNEL);
3361 	if (rc == -EINVAL) {
3362 		if (!has_cap_mac_admin(true)) {
3363 			struct audit_buffer *ab;
3364 			size_t audit_size;
3365 
3366 			/* We strip a nul only if it is at the end, otherwise the
3367 			 * context contains a nul and we should audit that */
3368 			if (value) {
3369 				const char *str = value;
3370 
3371 				if (str[size - 1] == '\0')
3372 					audit_size = size - 1;
3373 				else
3374 					audit_size = size;
3375 			} else {
3376 				audit_size = 0;
3377 			}
3378 			ab = audit_log_start(audit_context(),
3379 					     GFP_ATOMIC, AUDIT_SELINUX_ERR);
3380 			if (!ab)
3381 				return rc;
3382 			audit_log_format(ab, "op=setxattr invalid_context=");
3383 			audit_log_n_untrustedstring(ab, value, audit_size);
3384 			audit_log_end(ab);
3385 
3386 			return rc;
3387 		}
3388 		rc = security_context_to_sid_force(value,
3389 						   size, &newsid);
3390 	}
3391 	if (rc)
3392 		return rc;
3393 
3394 	rc = avc_has_perm(sid, newsid, isec->sclass,
3395 			  FILE__RELABELTO, &ad);
3396 	if (rc)
3397 		return rc;
3398 
3399 	rc = security_validate_transition(isec->sid, newsid,
3400 					  sid, isec->sclass);
3401 	if (rc)
3402 		return rc;
3403 
3404 	return avc_has_perm(newsid,
3405 			    sbsec->sid,
3406 			    SECCLASS_FILESYSTEM,
3407 			    FILESYSTEM__ASSOCIATE,
3408 			    &ad);
3409 }
3410 
selinux_inode_set_acl(struct mnt_idmap * idmap,struct dentry * dentry,const char * acl_name,struct posix_acl * kacl)3411 static int selinux_inode_set_acl(struct mnt_idmap *idmap,
3412 				 struct dentry *dentry, const char *acl_name,
3413 				 struct posix_acl *kacl)
3414 {
3415 	return dentry_has_perm(current_cred(), dentry, FILE__SETATTR);
3416 }
3417 
selinux_inode_get_acl(struct mnt_idmap * idmap,struct dentry * dentry,const char * acl_name)3418 static int selinux_inode_get_acl(struct mnt_idmap *idmap,
3419 				 struct dentry *dentry, const char *acl_name)
3420 {
3421 	return dentry_has_perm(current_cred(), dentry, FILE__GETATTR);
3422 }
3423 
selinux_inode_remove_acl(struct mnt_idmap * idmap,struct dentry * dentry,const char * acl_name)3424 static int selinux_inode_remove_acl(struct mnt_idmap *idmap,
3425 				    struct dentry *dentry, const char *acl_name)
3426 {
3427 	return dentry_has_perm(current_cred(), dentry, FILE__SETATTR);
3428 }
3429 
selinux_inode_post_setxattr(struct dentry * dentry,const char * name,const void * value,size_t size,int flags)3430 static void selinux_inode_post_setxattr(struct dentry *dentry, const char *name,
3431 					const void *value, size_t size,
3432 					int flags)
3433 {
3434 	struct inode *inode = d_backing_inode(dentry);
3435 	struct inode_security_struct *isec;
3436 	u32 newsid;
3437 	int rc;
3438 
3439 	if (strcmp(name, XATTR_NAME_SELINUX)) {
3440 		/* Not an attribute we recognize, so nothing to do. */
3441 		return;
3442 	}
3443 
3444 	if (!selinux_initialized()) {
3445 		/* If we haven't even been initialized, then we can't validate
3446 		 * against a policy, so leave the label as invalid. It may
3447 		 * resolve to a valid label on the next revalidation try if
3448 		 * we've since initialized.
3449 		 */
3450 		return;
3451 	}
3452 
3453 	rc = security_context_to_sid_force(value, size,
3454 					   &newsid);
3455 	if (rc) {
3456 		pr_err("SELinux:  unable to map context to SID"
3457 		       "for (%s, %lu), rc=%d\n",
3458 		       inode->i_sb->s_id, inode->i_ino, -rc);
3459 		return;
3460 	}
3461 
3462 	isec = backing_inode_security(dentry);
3463 	spin_lock(&isec->lock);
3464 	isec->sclass = inode_mode_to_security_class(inode->i_mode);
3465 	isec->sid = newsid;
3466 	isec->initialized = LABEL_INITIALIZED;
3467 	spin_unlock(&isec->lock);
3468 }
3469 
selinux_inode_getxattr(struct dentry * dentry,const char * name)3470 static int selinux_inode_getxattr(struct dentry *dentry, const char *name)
3471 {
3472 	const struct cred *cred = current_cred();
3473 
3474 	return dentry_has_perm(cred, dentry, FILE__GETATTR);
3475 }
3476 
selinux_inode_listxattr(struct dentry * dentry)3477 static int selinux_inode_listxattr(struct dentry *dentry)
3478 {
3479 	const struct cred *cred = current_cred();
3480 
3481 	return dentry_has_perm(cred, dentry, FILE__GETATTR);
3482 }
3483 
selinux_inode_removexattr(struct mnt_idmap * idmap,struct dentry * dentry,const char * name)3484 static int selinux_inode_removexattr(struct mnt_idmap *idmap,
3485 				     struct dentry *dentry, const char *name)
3486 {
3487 	/* if not a selinux xattr, only check the ordinary setattr perm */
3488 	if (strcmp(name, XATTR_NAME_SELINUX))
3489 		return dentry_has_perm(current_cred(), dentry, FILE__SETATTR);
3490 
3491 	if (!selinux_initialized())
3492 		return 0;
3493 
3494 	/* No one is allowed to remove a SELinux security label.
3495 	   You can change the label, but all data must be labeled. */
3496 	return -EACCES;
3497 }
3498 
selinux_inode_file_setattr(struct dentry * dentry,struct file_kattr * fa)3499 static int selinux_inode_file_setattr(struct dentry *dentry,
3500 				      struct file_kattr *fa)
3501 {
3502 	return dentry_has_perm(current_cred(), dentry, FILE__SETATTR);
3503 }
3504 
selinux_inode_file_getattr(struct dentry * dentry,struct file_kattr * fa)3505 static int selinux_inode_file_getattr(struct dentry *dentry,
3506 				      struct file_kattr *fa)
3507 {
3508 	return dentry_has_perm(current_cred(), dentry, FILE__GETATTR);
3509 }
3510 
selinux_path_notify(const struct path * path,u64 mask,unsigned int obj_type)3511 static int selinux_path_notify(const struct path *path, u64 mask,
3512 						unsigned int obj_type)
3513 {
3514 	int ret;
3515 	u32 perm;
3516 
3517 	struct common_audit_data ad;
3518 
3519 	ad.type = LSM_AUDIT_DATA_PATH;
3520 	ad.u.path = *path;
3521 
3522 	/*
3523 	 * Set permission needed based on the type of mark being set.
3524 	 * Performs an additional check for sb watches.
3525 	 */
3526 	switch (obj_type) {
3527 	case FSNOTIFY_OBJ_TYPE_VFSMOUNT:
3528 		perm = FILE__WATCH_MOUNT;
3529 		break;
3530 	case FSNOTIFY_OBJ_TYPE_SB:
3531 		perm = FILE__WATCH_SB;
3532 		ret = superblock_has_perm(current_cred(), path->dentry->d_sb,
3533 						FILESYSTEM__WATCH, &ad);
3534 		if (ret)
3535 			return ret;
3536 		break;
3537 	case FSNOTIFY_OBJ_TYPE_INODE:
3538 		perm = FILE__WATCH;
3539 		break;
3540 	case FSNOTIFY_OBJ_TYPE_MNTNS:
3541 		perm = FILE__WATCH_MOUNTNS;
3542 		break;
3543 	default:
3544 		return -EINVAL;
3545 	}
3546 
3547 	/* blocking watches require the file:watch_with_perm permission */
3548 	if (mask & (ALL_FSNOTIFY_PERM_EVENTS))
3549 		perm |= FILE__WATCH_WITH_PERM;
3550 
3551 	/* watches on read-like events need the file:watch_reads permission */
3552 	if (mask & (FS_ACCESS | FS_ACCESS_PERM | FS_PRE_ACCESS |
3553 		    FS_CLOSE_NOWRITE))
3554 		perm |= FILE__WATCH_READS;
3555 
3556 	return path_has_perm(current_cred(), path, perm);
3557 }
3558 
3559 /*
3560  * Copy the inode security context value to the user.
3561  *
3562  * Permission check is handled by selinux_inode_getxattr hook.
3563  */
selinux_inode_getsecurity(struct mnt_idmap * idmap,struct inode * inode,const char * name,void ** buffer,bool alloc)3564 static int selinux_inode_getsecurity(struct mnt_idmap *idmap,
3565 				     struct inode *inode, const char *name,
3566 				     void **buffer, bool alloc)
3567 {
3568 	u32 size;
3569 	int error;
3570 	char *context = NULL;
3571 	struct inode_security_struct *isec;
3572 
3573 	/*
3574 	 * If we're not initialized yet, then we can't validate contexts, so
3575 	 * just let vfs_getxattr fall back to using the on-disk xattr.
3576 	 */
3577 	if (!selinux_initialized() ||
3578 	    strcmp(name, XATTR_SELINUX_SUFFIX))
3579 		return -EOPNOTSUPP;
3580 
3581 	/*
3582 	 * If the caller has CAP_MAC_ADMIN, then get the raw context
3583 	 * value even if it is not defined by current policy; otherwise,
3584 	 * use the in-core value under current policy.
3585 	 * Use the non-auditing forms of the permission checks since
3586 	 * getxattr may be called by unprivileged processes commonly
3587 	 * and lack of permission just means that we fall back to the
3588 	 * in-core context value, not a denial.
3589 	 */
3590 	isec = inode_security(inode);
3591 	if (has_cap_mac_admin(false))
3592 		error = security_sid_to_context_force(isec->sid, &context,
3593 						      &size);
3594 	else
3595 		error = security_sid_to_context(isec->sid,
3596 						&context, &size);
3597 	if (error)
3598 		return error;
3599 	error = size;
3600 	if (alloc) {
3601 		*buffer = context;
3602 		goto out_nofree;
3603 	}
3604 	kfree(context);
3605 out_nofree:
3606 	return error;
3607 }
3608 
selinux_inode_setsecurity(struct inode * inode,const char * name,const void * value,size_t size,int flags)3609 static int selinux_inode_setsecurity(struct inode *inode, const char *name,
3610 				     const void *value, size_t size, int flags)
3611 {
3612 	struct inode_security_struct *isec = inode_security_novalidate(inode);
3613 	struct superblock_security_struct *sbsec;
3614 	u32 newsid;
3615 	int rc;
3616 
3617 	if (strcmp(name, XATTR_SELINUX_SUFFIX))
3618 		return -EOPNOTSUPP;
3619 
3620 	sbsec = selinux_superblock(inode->i_sb);
3621 	if (!(sbsec->flags & SBLABEL_MNT))
3622 		return -EOPNOTSUPP;
3623 
3624 	if (!value || !size)
3625 		return -EACCES;
3626 
3627 	rc = security_context_to_sid(value, size, &newsid,
3628 				     GFP_KERNEL);
3629 	if (rc)
3630 		return rc;
3631 
3632 	spin_lock(&isec->lock);
3633 	isec->sclass = inode_mode_to_security_class(inode->i_mode);
3634 	isec->sid = newsid;
3635 	isec->initialized = LABEL_INITIALIZED;
3636 	spin_unlock(&isec->lock);
3637 	return 0;
3638 }
3639 
selinux_inode_listsecurity(struct inode * inode,char * buffer,size_t buffer_size)3640 static int selinux_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size)
3641 {
3642 	const int len = sizeof(XATTR_NAME_SELINUX);
3643 
3644 	if (!selinux_initialized())
3645 		return 0;
3646 
3647 	if (buffer && len <= buffer_size)
3648 		memcpy(buffer, XATTR_NAME_SELINUX, len);
3649 	return len;
3650 }
3651 
selinux_inode_getlsmprop(struct inode * inode,struct lsm_prop * prop)3652 static void selinux_inode_getlsmprop(struct inode *inode, struct lsm_prop *prop)
3653 {
3654 	struct inode_security_struct *isec = inode_security_novalidate(inode);
3655 
3656 	prop->selinux.secid = isec->sid;
3657 }
3658 
selinux_inode_copy_up(struct dentry * src,struct cred ** new)3659 static int selinux_inode_copy_up(struct dentry *src, struct cred **new)
3660 {
3661 	struct lsm_prop prop;
3662 	struct task_security_struct *tsec;
3663 	struct cred *new_creds = *new;
3664 
3665 	if (new_creds == NULL) {
3666 		new_creds = prepare_creds();
3667 		if (!new_creds)
3668 			return -ENOMEM;
3669 	}
3670 
3671 	tsec = selinux_cred(new_creds);
3672 	/* Get label from overlay inode and set it in create_sid */
3673 	selinux_inode_getlsmprop(d_inode(src), &prop);
3674 	tsec->create_sid = prop.selinux.secid;
3675 	*new = new_creds;
3676 	return 0;
3677 }
3678 
selinux_inode_copy_up_xattr(struct dentry * dentry,const char * name)3679 static int selinux_inode_copy_up_xattr(struct dentry *dentry, const char *name)
3680 {
3681 	/* The copy_up hook above sets the initial context on an inode, but we
3682 	 * don't then want to overwrite it by blindly copying all the lower
3683 	 * xattrs up.  Instead, filter out SELinux-related xattrs following
3684 	 * policy load.
3685 	 */
3686 	if (selinux_initialized() && !strcmp(name, XATTR_NAME_SELINUX))
3687 		return -ECANCELED; /* Discard */
3688 	/*
3689 	 * Any other attribute apart from SELINUX is not claimed, supported
3690 	 * by selinux.
3691 	 */
3692 	return -EOPNOTSUPP;
3693 }
3694 
3695 /* kernfs node operations */
3696 
selinux_kernfs_init_security(struct kernfs_node * kn_dir,struct kernfs_node * kn)3697 static int selinux_kernfs_init_security(struct kernfs_node *kn_dir,
3698 					struct kernfs_node *kn)
3699 {
3700 	const struct task_security_struct *tsec = selinux_cred(current_cred());
3701 	u32 parent_sid, newsid, clen;
3702 	int rc;
3703 	char *context;
3704 
3705 	rc = kernfs_xattr_get(kn_dir, XATTR_NAME_SELINUX, NULL, 0);
3706 	if (rc == -ENODATA)
3707 		return 0;
3708 	else if (rc < 0)
3709 		return rc;
3710 
3711 	clen = (u32)rc;
3712 	context = kmalloc(clen, GFP_KERNEL);
3713 	if (!context)
3714 		return -ENOMEM;
3715 
3716 	rc = kernfs_xattr_get(kn_dir, XATTR_NAME_SELINUX, context, clen);
3717 	if (rc < 0) {
3718 		kfree(context);
3719 		return rc;
3720 	}
3721 
3722 	rc = security_context_to_sid(context, clen, &parent_sid,
3723 				     GFP_KERNEL);
3724 	kfree(context);
3725 	if (rc)
3726 		return rc;
3727 
3728 	if (tsec->create_sid) {
3729 		newsid = tsec->create_sid;
3730 	} else {
3731 		u16 secclass = inode_mode_to_security_class(kn->mode);
3732 		const char *kn_name;
3733 		struct qstr q;
3734 
3735 		/* kn is fresh, can't be renamed, name goes not away */
3736 		kn_name = rcu_dereference_check(kn->name, true);
3737 		q.name = kn_name;
3738 		q.hash_len = hashlen_string(kn_dir, kn_name);
3739 
3740 		rc = security_transition_sid(tsec->sid,
3741 					     parent_sid, secclass, &q,
3742 					     &newsid);
3743 		if (rc)
3744 			return rc;
3745 	}
3746 
3747 	rc = security_sid_to_context_force(newsid,
3748 					   &context, &clen);
3749 	if (rc)
3750 		return rc;
3751 
3752 	rc = kernfs_xattr_set(kn, XATTR_NAME_SELINUX, context, clen,
3753 			      XATTR_CREATE);
3754 	kfree(context);
3755 	return rc;
3756 }
3757 
3758 
3759 /* file security operations */
3760 
selinux_revalidate_file_permission(struct file * file,int mask)3761 static int selinux_revalidate_file_permission(struct file *file, int mask)
3762 {
3763 	const struct cred *cred = current_cred();
3764 	struct inode *inode = file_inode(file);
3765 
3766 	/* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */
3767 	if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE))
3768 		mask |= MAY_APPEND;
3769 
3770 	return file_has_perm(cred, file,
3771 			     file_mask_to_av(inode->i_mode, mask));
3772 }
3773 
selinux_file_permission(struct file * file,int mask)3774 static int selinux_file_permission(struct file *file, int mask)
3775 {
3776 	struct inode *inode = file_inode(file);
3777 	struct file_security_struct *fsec = selinux_file(file);
3778 	struct inode_security_struct *isec;
3779 	u32 sid = current_sid();
3780 
3781 	if (!mask)
3782 		/* No permission to check.  Existence test. */
3783 		return 0;
3784 
3785 	isec = inode_security(inode);
3786 	if (sid == fsec->sid && fsec->isid == isec->sid &&
3787 	    fsec->pseqno == avc_policy_seqno())
3788 		/* No change since file_open check. */
3789 		return 0;
3790 
3791 	return selinux_revalidate_file_permission(file, mask);
3792 }
3793 
selinux_file_alloc_security(struct file * file)3794 static int selinux_file_alloc_security(struct file *file)
3795 {
3796 	struct file_security_struct *fsec = selinux_file(file);
3797 	u32 sid = current_sid();
3798 
3799 	fsec->sid = sid;
3800 	fsec->fown_sid = sid;
3801 
3802 	return 0;
3803 }
3804 
3805 /*
3806  * Check whether a task has the ioctl permission and cmd
3807  * operation to an inode.
3808  */
ioctl_has_perm(const struct cred * cred,struct file * file,u32 requested,u16 cmd)3809 static int ioctl_has_perm(const struct cred *cred, struct file *file,
3810 		u32 requested, u16 cmd)
3811 {
3812 	struct common_audit_data ad;
3813 	struct file_security_struct *fsec = selinux_file(file);
3814 	struct inode *inode = file_inode(file);
3815 	struct inode_security_struct *isec;
3816 	struct lsm_ioctlop_audit ioctl;
3817 	u32 ssid = cred_sid(cred);
3818 	int rc;
3819 	u8 driver = cmd >> 8;
3820 	u8 xperm = cmd & 0xff;
3821 
3822 	ad.type = LSM_AUDIT_DATA_IOCTL_OP;
3823 	ad.u.op = &ioctl;
3824 	ad.u.op->cmd = cmd;
3825 	ad.u.op->path = file->f_path;
3826 
3827 	if (ssid != fsec->sid) {
3828 		rc = avc_has_perm(ssid, fsec->sid,
3829 				SECCLASS_FD,
3830 				FD__USE,
3831 				&ad);
3832 		if (rc)
3833 			goto out;
3834 	}
3835 
3836 	if (unlikely(IS_PRIVATE(inode)))
3837 		return 0;
3838 
3839 	isec = inode_security(inode);
3840 	rc = avc_has_extended_perms(ssid, isec->sid, isec->sclass, requested,
3841 				    driver, AVC_EXT_IOCTL, xperm, &ad);
3842 out:
3843 	return rc;
3844 }
3845 
selinux_file_ioctl(struct file * file,unsigned int cmd,unsigned long arg)3846 static int selinux_file_ioctl(struct file *file, unsigned int cmd,
3847 			      unsigned long arg)
3848 {
3849 	const struct cred *cred = current_cred();
3850 	int error = 0;
3851 
3852 	switch (cmd) {
3853 	case FIONREAD:
3854 	case FIBMAP:
3855 	case FIGETBSZ:
3856 	case FS_IOC_GETFLAGS:
3857 	case FS_IOC_GETVERSION:
3858 		error = file_has_perm(cred, file, FILE__GETATTR);
3859 		break;
3860 
3861 	case FS_IOC_SETFLAGS:
3862 	case FS_IOC_SETVERSION:
3863 		error = file_has_perm(cred, file, FILE__SETATTR);
3864 		break;
3865 
3866 	/* sys_ioctl() checks */
3867 	case FIONBIO:
3868 	case FIOASYNC:
3869 		error = file_has_perm(cred, file, 0);
3870 		break;
3871 
3872 	case KDSKBENT:
3873 	case KDSKBSENT:
3874 		error = cred_has_capability(cred, CAP_SYS_TTY_CONFIG,
3875 					    CAP_OPT_NONE, true);
3876 		break;
3877 
3878 	case FIOCLEX:
3879 	case FIONCLEX:
3880 		if (!selinux_policycap_ioctl_skip_cloexec())
3881 			error = ioctl_has_perm(cred, file, FILE__IOCTL, (u16) cmd);
3882 		break;
3883 
3884 	/* default case assumes that the command will go
3885 	 * to the file's ioctl() function.
3886 	 */
3887 	default:
3888 		error = ioctl_has_perm(cred, file, FILE__IOCTL, (u16) cmd);
3889 	}
3890 	return error;
3891 }
3892 
selinux_file_ioctl_compat(struct file * file,unsigned int cmd,unsigned long arg)3893 static int selinux_file_ioctl_compat(struct file *file, unsigned int cmd,
3894 			      unsigned long arg)
3895 {
3896 	/*
3897 	 * If we are in a 64-bit kernel running 32-bit userspace, we need to
3898 	 * make sure we don't compare 32-bit flags to 64-bit flags.
3899 	 */
3900 	switch (cmd) {
3901 	case FS_IOC32_GETFLAGS:
3902 		cmd = FS_IOC_GETFLAGS;
3903 		break;
3904 	case FS_IOC32_SETFLAGS:
3905 		cmd = FS_IOC_SETFLAGS;
3906 		break;
3907 	case FS_IOC32_GETVERSION:
3908 		cmd = FS_IOC_GETVERSION;
3909 		break;
3910 	case FS_IOC32_SETVERSION:
3911 		cmd = FS_IOC_SETVERSION;
3912 		break;
3913 	default:
3914 		break;
3915 	}
3916 
3917 	return selinux_file_ioctl(file, cmd, arg);
3918 }
3919 
3920 static int default_noexec __ro_after_init;
3921 
file_map_prot_check(struct file * file,unsigned long prot,int shared)3922 static int file_map_prot_check(struct file *file, unsigned long prot, int shared)
3923 {
3924 	const struct cred *cred = current_cred();
3925 	u32 sid = cred_sid(cred);
3926 	int rc = 0;
3927 
3928 	if (default_noexec &&
3929 	    (prot & PROT_EXEC) && (!file || IS_PRIVATE(file_inode(file)) ||
3930 				   (!shared && (prot & PROT_WRITE)))) {
3931 		/*
3932 		 * We are making executable an anonymous mapping or a
3933 		 * private file mapping that will also be writable.
3934 		 * This has an additional check.
3935 		 */
3936 		rc = avc_has_perm(sid, sid, SECCLASS_PROCESS,
3937 				  PROCESS__EXECMEM, NULL);
3938 		if (rc)
3939 			goto error;
3940 	}
3941 
3942 	if (file) {
3943 		/* read access is always possible with a mapping */
3944 		u32 av = FILE__READ;
3945 
3946 		/* write access only matters if the mapping is shared */
3947 		if (shared && (prot & PROT_WRITE))
3948 			av |= FILE__WRITE;
3949 
3950 		if (prot & PROT_EXEC)
3951 			av |= FILE__EXECUTE;
3952 
3953 		return file_has_perm(cred, file, av);
3954 	}
3955 
3956 error:
3957 	return rc;
3958 }
3959 
selinux_mmap_addr(unsigned long addr)3960 static int selinux_mmap_addr(unsigned long addr)
3961 {
3962 	int rc = 0;
3963 
3964 	if (addr < CONFIG_LSM_MMAP_MIN_ADDR) {
3965 		u32 sid = current_sid();
3966 		rc = avc_has_perm(sid, sid, SECCLASS_MEMPROTECT,
3967 				  MEMPROTECT__MMAP_ZERO, NULL);
3968 	}
3969 
3970 	return rc;
3971 }
3972 
selinux_mmap_file(struct file * file,unsigned long reqprot __always_unused,unsigned long prot,unsigned long flags)3973 static int selinux_mmap_file(struct file *file,
3974 			     unsigned long reqprot __always_unused,
3975 			     unsigned long prot, unsigned long flags)
3976 {
3977 	struct common_audit_data ad;
3978 	int rc;
3979 
3980 	if (file) {
3981 		ad.type = LSM_AUDIT_DATA_FILE;
3982 		ad.u.file = file;
3983 		rc = inode_has_perm(current_cred(), file_inode(file),
3984 				    FILE__MAP, &ad);
3985 		if (rc)
3986 			return rc;
3987 	}
3988 
3989 	return file_map_prot_check(file, prot,
3990 				   (flags & MAP_TYPE) == MAP_SHARED);
3991 }
3992 
selinux_file_mprotect(struct vm_area_struct * vma,unsigned long reqprot __always_unused,unsigned long prot)3993 static int selinux_file_mprotect(struct vm_area_struct *vma,
3994 				 unsigned long reqprot __always_unused,
3995 				 unsigned long prot)
3996 {
3997 	const struct cred *cred = current_cred();
3998 	u32 sid = cred_sid(cred);
3999 
4000 	if (default_noexec &&
4001 	    (prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) {
4002 		int rc = 0;
4003 		/*
4004 		 * We don't use the vma_is_initial_heap() helper as it has
4005 		 * a history of problems and is currently broken on systems
4006 		 * where there is no heap, e.g. brk == start_brk.  Before
4007 		 * replacing the conditional below with vma_is_initial_heap(),
4008 		 * or something similar, please ensure that the logic is the
4009 		 * same as what we have below or you have tested every possible
4010 		 * corner case you can think to test.
4011 		 */
4012 		if (vma->vm_start >= vma->vm_mm->start_brk &&
4013 		    vma->vm_end <= vma->vm_mm->brk) {
4014 			rc = avc_has_perm(sid, sid, SECCLASS_PROCESS,
4015 					  PROCESS__EXECHEAP, NULL);
4016 		} else if (!vma->vm_file && (vma_is_initial_stack(vma) ||
4017 			    vma_is_stack_for_current(vma))) {
4018 			rc = avc_has_perm(sid, sid, SECCLASS_PROCESS,
4019 					  PROCESS__EXECSTACK, NULL);
4020 		} else if (vma->vm_file && vma->anon_vma) {
4021 			/*
4022 			 * We are making executable a file mapping that has
4023 			 * had some COW done. Since pages might have been
4024 			 * written, check ability to execute the possibly
4025 			 * modified content.  This typically should only
4026 			 * occur for text relocations.
4027 			 */
4028 			rc = file_has_perm(cred, vma->vm_file, FILE__EXECMOD);
4029 		}
4030 		if (rc)
4031 			return rc;
4032 	}
4033 
4034 	return file_map_prot_check(vma->vm_file, prot, vma->vm_flags&VM_SHARED);
4035 }
4036 
selinux_file_lock(struct file * file,unsigned int cmd)4037 static int selinux_file_lock(struct file *file, unsigned int cmd)
4038 {
4039 	const struct cred *cred = current_cred();
4040 
4041 	return file_has_perm(cred, file, FILE__LOCK);
4042 }
4043 
selinux_file_fcntl(struct file * file,unsigned int cmd,unsigned long arg)4044 static int selinux_file_fcntl(struct file *file, unsigned int cmd,
4045 			      unsigned long arg)
4046 {
4047 	const struct cred *cred = current_cred();
4048 	int err = 0;
4049 
4050 	switch (cmd) {
4051 	case F_SETFL:
4052 		if ((file->f_flags & O_APPEND) && !(arg & O_APPEND)) {
4053 			err = file_has_perm(cred, file, FILE__WRITE);
4054 			break;
4055 		}
4056 		fallthrough;
4057 	case F_SETOWN:
4058 	case F_SETSIG:
4059 	case F_GETFL:
4060 	case F_GETOWN:
4061 	case F_GETSIG:
4062 	case F_GETOWNER_UIDS:
4063 		/* Just check FD__USE permission */
4064 		err = file_has_perm(cred, file, 0);
4065 		break;
4066 	case F_GETLK:
4067 	case F_SETLK:
4068 	case F_SETLKW:
4069 	case F_OFD_GETLK:
4070 	case F_OFD_SETLK:
4071 	case F_OFD_SETLKW:
4072 #if BITS_PER_LONG == 32
4073 	case F_GETLK64:
4074 	case F_SETLK64:
4075 	case F_SETLKW64:
4076 #endif
4077 		err = file_has_perm(cred, file, FILE__LOCK);
4078 		break;
4079 	}
4080 
4081 	return err;
4082 }
4083 
selinux_file_set_fowner(struct file * file)4084 static void selinux_file_set_fowner(struct file *file)
4085 {
4086 	struct file_security_struct *fsec;
4087 
4088 	fsec = selinux_file(file);
4089 	fsec->fown_sid = current_sid();
4090 }
4091 
selinux_file_send_sigiotask(struct task_struct * tsk,struct fown_struct * fown,int signum)4092 static int selinux_file_send_sigiotask(struct task_struct *tsk,
4093 				       struct fown_struct *fown, int signum)
4094 {
4095 	struct file *file;
4096 	u32 sid = task_sid_obj(tsk);
4097 	u32 perm;
4098 	struct file_security_struct *fsec;
4099 
4100 	/* struct fown_struct is never outside the context of a struct file */
4101 	file = fown->file;
4102 
4103 	fsec = selinux_file(file);
4104 
4105 	if (!signum)
4106 		perm = signal_to_av(SIGIO); /* as per send_sigio_to_task */
4107 	else
4108 		perm = signal_to_av(signum);
4109 
4110 	return avc_has_perm(fsec->fown_sid, sid,
4111 			    SECCLASS_PROCESS, perm, NULL);
4112 }
4113 
selinux_file_receive(struct file * file)4114 static int selinux_file_receive(struct file *file)
4115 {
4116 	const struct cred *cred = current_cred();
4117 
4118 	return file_has_perm(cred, file, file_to_av(file));
4119 }
4120 
selinux_file_open(struct file * file)4121 static int selinux_file_open(struct file *file)
4122 {
4123 	struct file_security_struct *fsec;
4124 	struct inode_security_struct *isec;
4125 
4126 	fsec = selinux_file(file);
4127 	isec = inode_security(file_inode(file));
4128 	/*
4129 	 * Save inode label and policy sequence number
4130 	 * at open-time so that selinux_file_permission
4131 	 * can determine whether revalidation is necessary.
4132 	 * Task label is already saved in the file security
4133 	 * struct as its SID.
4134 	 */
4135 	fsec->isid = isec->sid;
4136 	fsec->pseqno = avc_policy_seqno();
4137 	/*
4138 	 * Since the inode label or policy seqno may have changed
4139 	 * between the selinux_inode_permission check and the saving
4140 	 * of state above, recheck that access is still permitted.
4141 	 * Otherwise, access might never be revalidated against the
4142 	 * new inode label or new policy.
4143 	 * This check is not redundant - do not remove.
4144 	 */
4145 	return file_path_has_perm(file->f_cred, file, open_file_to_av(file));
4146 }
4147 
4148 /* task security operations */
4149 
selinux_task_alloc(struct task_struct * task,u64 clone_flags)4150 static int selinux_task_alloc(struct task_struct *task,
4151 			      u64 clone_flags)
4152 {
4153 	u32 sid = current_sid();
4154 
4155 	return avc_has_perm(sid, sid, SECCLASS_PROCESS, PROCESS__FORK, NULL);
4156 }
4157 
4158 /*
4159  * prepare a new set of credentials for modification
4160  */
selinux_cred_prepare(struct cred * new,const struct cred * old,gfp_t gfp)4161 static int selinux_cred_prepare(struct cred *new, const struct cred *old,
4162 				gfp_t gfp)
4163 {
4164 	const struct task_security_struct *old_tsec = selinux_cred(old);
4165 	struct task_security_struct *tsec = selinux_cred(new);
4166 
4167 	*tsec = *old_tsec;
4168 	return 0;
4169 }
4170 
4171 /*
4172  * transfer the SELinux data to a blank set of creds
4173  */
selinux_cred_transfer(struct cred * new,const struct cred * old)4174 static void selinux_cred_transfer(struct cred *new, const struct cred *old)
4175 {
4176 	const struct task_security_struct *old_tsec = selinux_cred(old);
4177 	struct task_security_struct *tsec = selinux_cred(new);
4178 
4179 	*tsec = *old_tsec;
4180 }
4181 
selinux_cred_getsecid(const struct cred * c,u32 * secid)4182 static void selinux_cred_getsecid(const struct cred *c, u32 *secid)
4183 {
4184 	*secid = cred_sid(c);
4185 }
4186 
selinux_cred_getlsmprop(const struct cred * c,struct lsm_prop * prop)4187 static void selinux_cred_getlsmprop(const struct cred *c, struct lsm_prop *prop)
4188 {
4189 	prop->selinux.secid = cred_sid(c);
4190 }
4191 
4192 /*
4193  * set the security data for a kernel service
4194  * - all the creation contexts are set to unlabelled
4195  */
selinux_kernel_act_as(struct cred * new,u32 secid)4196 static int selinux_kernel_act_as(struct cred *new, u32 secid)
4197 {
4198 	struct task_security_struct *tsec = selinux_cred(new);
4199 	u32 sid = current_sid();
4200 	int ret;
4201 
4202 	ret = avc_has_perm(sid, secid,
4203 			   SECCLASS_KERNEL_SERVICE,
4204 			   KERNEL_SERVICE__USE_AS_OVERRIDE,
4205 			   NULL);
4206 	if (ret == 0) {
4207 		tsec->sid = secid;
4208 		tsec->create_sid = 0;
4209 		tsec->keycreate_sid = 0;
4210 		tsec->sockcreate_sid = 0;
4211 	}
4212 	return ret;
4213 }
4214 
4215 /*
4216  * set the file creation context in a security record to the same as the
4217  * objective context of the specified inode
4218  */
selinux_kernel_create_files_as(struct cred * new,struct inode * inode)4219 static int selinux_kernel_create_files_as(struct cred *new, struct inode *inode)
4220 {
4221 	struct inode_security_struct *isec = inode_security(inode);
4222 	struct task_security_struct *tsec = selinux_cred(new);
4223 	u32 sid = current_sid();
4224 	int ret;
4225 
4226 	ret = avc_has_perm(sid, isec->sid,
4227 			   SECCLASS_KERNEL_SERVICE,
4228 			   KERNEL_SERVICE__CREATE_FILES_AS,
4229 			   NULL);
4230 
4231 	if (ret == 0)
4232 		tsec->create_sid = isec->sid;
4233 	return ret;
4234 }
4235 
selinux_kernel_module_request(char * kmod_name)4236 static int selinux_kernel_module_request(char *kmod_name)
4237 {
4238 	struct common_audit_data ad;
4239 
4240 	ad.type = LSM_AUDIT_DATA_KMOD;
4241 	ad.u.kmod_name = kmod_name;
4242 
4243 	return avc_has_perm(current_sid(), SECINITSID_KERNEL, SECCLASS_SYSTEM,
4244 			    SYSTEM__MODULE_REQUEST, &ad);
4245 }
4246 
selinux_kernel_load_from_file(struct file * file,u32 requested)4247 static int selinux_kernel_load_from_file(struct file *file, u32 requested)
4248 {
4249 	struct common_audit_data ad;
4250 	struct inode_security_struct *isec;
4251 	struct file_security_struct *fsec;
4252 	u32 sid = current_sid();
4253 	int rc;
4254 
4255 	if (file == NULL)
4256 		return avc_has_perm(sid, sid, SECCLASS_SYSTEM, requested, NULL);
4257 
4258 	ad.type = LSM_AUDIT_DATA_FILE;
4259 	ad.u.file = file;
4260 
4261 	fsec = selinux_file(file);
4262 	if (sid != fsec->sid) {
4263 		rc = avc_has_perm(sid, fsec->sid, SECCLASS_FD, FD__USE, &ad);
4264 		if (rc)
4265 			return rc;
4266 	}
4267 
4268 	isec = inode_security(file_inode(file));
4269 	return avc_has_perm(sid, isec->sid, SECCLASS_SYSTEM, requested, &ad);
4270 }
4271 
selinux_kernel_read_file(struct file * file,enum kernel_read_file_id id,bool contents)4272 static int selinux_kernel_read_file(struct file *file,
4273 				    enum kernel_read_file_id id,
4274 				    bool contents)
4275 {
4276 	int rc = 0;
4277 
4278 	BUILD_BUG_ON_MSG(READING_MAX_ID > 7,
4279 			 "New kernel_read_file_id introduced; update SELinux!");
4280 
4281 	switch (id) {
4282 	case READING_FIRMWARE:
4283 		rc = selinux_kernel_load_from_file(file, SYSTEM__FIRMWARE_LOAD);
4284 		break;
4285 	case READING_MODULE:
4286 		rc = selinux_kernel_load_from_file(file, SYSTEM__MODULE_LOAD);
4287 		break;
4288 	case READING_KEXEC_IMAGE:
4289 		rc = selinux_kernel_load_from_file(file,
4290 						   SYSTEM__KEXEC_IMAGE_LOAD);
4291 		break;
4292 	case READING_KEXEC_INITRAMFS:
4293 		rc = selinux_kernel_load_from_file(file,
4294 						SYSTEM__KEXEC_INITRAMFS_LOAD);
4295 		break;
4296 	case READING_POLICY:
4297 		rc = selinux_kernel_load_from_file(file, SYSTEM__POLICY_LOAD);
4298 		break;
4299 	case READING_X509_CERTIFICATE:
4300 		rc = selinux_kernel_load_from_file(file,
4301 						SYSTEM__X509_CERTIFICATE_LOAD);
4302 		break;
4303 	default:
4304 		break;
4305 	}
4306 
4307 	return rc;
4308 }
4309 
selinux_kernel_load_data(enum kernel_load_data_id id,bool contents)4310 static int selinux_kernel_load_data(enum kernel_load_data_id id, bool contents)
4311 {
4312 	int rc = 0;
4313 
4314 	BUILD_BUG_ON_MSG(LOADING_MAX_ID > 7,
4315 			 "New kernel_load_data_id introduced; update SELinux!");
4316 
4317 	switch (id) {
4318 	case LOADING_FIRMWARE:
4319 		rc = selinux_kernel_load_from_file(NULL, SYSTEM__FIRMWARE_LOAD);
4320 		break;
4321 	case LOADING_MODULE:
4322 		rc = selinux_kernel_load_from_file(NULL, SYSTEM__MODULE_LOAD);
4323 		break;
4324 	case LOADING_KEXEC_IMAGE:
4325 		rc = selinux_kernel_load_from_file(NULL,
4326 						   SYSTEM__KEXEC_IMAGE_LOAD);
4327 		break;
4328 	case LOADING_KEXEC_INITRAMFS:
4329 		rc = selinux_kernel_load_from_file(NULL,
4330 						SYSTEM__KEXEC_INITRAMFS_LOAD);
4331 		break;
4332 	case LOADING_POLICY:
4333 		rc = selinux_kernel_load_from_file(NULL,
4334 						   SYSTEM__POLICY_LOAD);
4335 		break;
4336 	case LOADING_X509_CERTIFICATE:
4337 		rc = selinux_kernel_load_from_file(NULL,
4338 						SYSTEM__X509_CERTIFICATE_LOAD);
4339 		break;
4340 	default:
4341 		break;
4342 	}
4343 
4344 	return rc;
4345 }
4346 
selinux_task_setpgid(struct task_struct * p,pid_t pgid)4347 static int selinux_task_setpgid(struct task_struct *p, pid_t pgid)
4348 {
4349 	return avc_has_perm(current_sid(), task_sid_obj(p), SECCLASS_PROCESS,
4350 			    PROCESS__SETPGID, NULL);
4351 }
4352 
selinux_task_getpgid(struct task_struct * p)4353 static int selinux_task_getpgid(struct task_struct *p)
4354 {
4355 	return avc_has_perm(current_sid(), task_sid_obj(p), SECCLASS_PROCESS,
4356 			    PROCESS__GETPGID, NULL);
4357 }
4358 
selinux_task_getsid(struct task_struct * p)4359 static int selinux_task_getsid(struct task_struct *p)
4360 {
4361 	return avc_has_perm(current_sid(), task_sid_obj(p), SECCLASS_PROCESS,
4362 			    PROCESS__GETSESSION, NULL);
4363 }
4364 
selinux_current_getlsmprop_subj(struct lsm_prop * prop)4365 static void selinux_current_getlsmprop_subj(struct lsm_prop *prop)
4366 {
4367 	prop->selinux.secid = current_sid();
4368 }
4369 
selinux_task_getlsmprop_obj(struct task_struct * p,struct lsm_prop * prop)4370 static void selinux_task_getlsmprop_obj(struct task_struct *p,
4371 					struct lsm_prop *prop)
4372 {
4373 	prop->selinux.secid = task_sid_obj(p);
4374 }
4375 
selinux_task_setnice(struct task_struct * p,int nice)4376 static int selinux_task_setnice(struct task_struct *p, int nice)
4377 {
4378 	return avc_has_perm(current_sid(), task_sid_obj(p), SECCLASS_PROCESS,
4379 			    PROCESS__SETSCHED, NULL);
4380 }
4381 
selinux_task_setioprio(struct task_struct * p,int ioprio)4382 static int selinux_task_setioprio(struct task_struct *p, int ioprio)
4383 {
4384 	return avc_has_perm(current_sid(), task_sid_obj(p), SECCLASS_PROCESS,
4385 			    PROCESS__SETSCHED, NULL);
4386 }
4387 
selinux_task_getioprio(struct task_struct * p)4388 static int selinux_task_getioprio(struct task_struct *p)
4389 {
4390 	return avc_has_perm(current_sid(), task_sid_obj(p), SECCLASS_PROCESS,
4391 			    PROCESS__GETSCHED, NULL);
4392 }
4393 
selinux_task_prlimit(const struct cred * cred,const struct cred * tcred,unsigned int flags)4394 static int selinux_task_prlimit(const struct cred *cred, const struct cred *tcred,
4395 				unsigned int flags)
4396 {
4397 	u32 av = 0;
4398 
4399 	if (!flags)
4400 		return 0;
4401 	if (flags & LSM_PRLIMIT_WRITE)
4402 		av |= PROCESS__SETRLIMIT;
4403 	if (flags & LSM_PRLIMIT_READ)
4404 		av |= PROCESS__GETRLIMIT;
4405 	return avc_has_perm(cred_sid(cred), cred_sid(tcred),
4406 			    SECCLASS_PROCESS, av, NULL);
4407 }
4408 
selinux_task_setrlimit(struct task_struct * p,unsigned int resource,struct rlimit * new_rlim)4409 static int selinux_task_setrlimit(struct task_struct *p, unsigned int resource,
4410 		struct rlimit *new_rlim)
4411 {
4412 	struct rlimit *old_rlim = p->signal->rlim + resource;
4413 
4414 	/* Control the ability to change the hard limit (whether
4415 	   lowering or raising it), so that the hard limit can
4416 	   later be used as a safe reset point for the soft limit
4417 	   upon context transitions.  See selinux_bprm_committing_creds. */
4418 	if (old_rlim->rlim_max != new_rlim->rlim_max)
4419 		return avc_has_perm(current_sid(), task_sid_obj(p),
4420 				    SECCLASS_PROCESS, PROCESS__SETRLIMIT, NULL);
4421 
4422 	return 0;
4423 }
4424 
selinux_task_setscheduler(struct task_struct * p)4425 static int selinux_task_setscheduler(struct task_struct *p)
4426 {
4427 	return avc_has_perm(current_sid(), task_sid_obj(p), SECCLASS_PROCESS,
4428 			    PROCESS__SETSCHED, NULL);
4429 }
4430 
selinux_task_getscheduler(struct task_struct * p)4431 static int selinux_task_getscheduler(struct task_struct *p)
4432 {
4433 	return avc_has_perm(current_sid(), task_sid_obj(p), SECCLASS_PROCESS,
4434 			    PROCESS__GETSCHED, NULL);
4435 }
4436 
selinux_task_movememory(struct task_struct * p)4437 static int selinux_task_movememory(struct task_struct *p)
4438 {
4439 	return avc_has_perm(current_sid(), task_sid_obj(p), SECCLASS_PROCESS,
4440 			    PROCESS__SETSCHED, NULL);
4441 }
4442 
selinux_task_kill(struct task_struct * p,struct kernel_siginfo * info,int sig,const struct cred * cred)4443 static int selinux_task_kill(struct task_struct *p, struct kernel_siginfo *info,
4444 				int sig, const struct cred *cred)
4445 {
4446 	u32 secid;
4447 	u32 perm;
4448 
4449 	if (!sig)
4450 		perm = PROCESS__SIGNULL; /* null signal; existence test */
4451 	else
4452 		perm = signal_to_av(sig);
4453 	if (!cred)
4454 		secid = current_sid();
4455 	else
4456 		secid = cred_sid(cred);
4457 	return avc_has_perm(secid, task_sid_obj(p), SECCLASS_PROCESS, perm, NULL);
4458 }
4459 
selinux_task_to_inode(struct task_struct * p,struct inode * inode)4460 static void selinux_task_to_inode(struct task_struct *p,
4461 				  struct inode *inode)
4462 {
4463 	struct inode_security_struct *isec = selinux_inode(inode);
4464 	u32 sid = task_sid_obj(p);
4465 
4466 	spin_lock(&isec->lock);
4467 	isec->sclass = inode_mode_to_security_class(inode->i_mode);
4468 	isec->sid = sid;
4469 	isec->initialized = LABEL_INITIALIZED;
4470 	spin_unlock(&isec->lock);
4471 }
4472 
selinux_userns_create(const struct cred * cred)4473 static int selinux_userns_create(const struct cred *cred)
4474 {
4475 	u32 sid = current_sid();
4476 
4477 	return avc_has_perm(sid, sid, SECCLASS_USER_NAMESPACE,
4478 			USER_NAMESPACE__CREATE, NULL);
4479 }
4480 
4481 /* Returns error only if unable to parse addresses */
selinux_parse_skb_ipv4(struct sk_buff * skb,struct common_audit_data * ad,u8 * proto)4482 static int selinux_parse_skb_ipv4(struct sk_buff *skb,
4483 			struct common_audit_data *ad, u8 *proto)
4484 {
4485 	int offset, ihlen, ret = -EINVAL;
4486 	struct iphdr _iph, *ih;
4487 
4488 	offset = skb_network_offset(skb);
4489 	ih = skb_header_pointer(skb, offset, sizeof(_iph), &_iph);
4490 	if (ih == NULL)
4491 		goto out;
4492 
4493 	ihlen = ih->ihl * 4;
4494 	if (ihlen < sizeof(_iph))
4495 		goto out;
4496 
4497 	ad->u.net->v4info.saddr = ih->saddr;
4498 	ad->u.net->v4info.daddr = ih->daddr;
4499 	ret = 0;
4500 
4501 	if (proto)
4502 		*proto = ih->protocol;
4503 
4504 	switch (ih->protocol) {
4505 	case IPPROTO_TCP: {
4506 		struct tcphdr _tcph, *th;
4507 
4508 		if (ntohs(ih->frag_off) & IP_OFFSET)
4509 			break;
4510 
4511 		offset += ihlen;
4512 		th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
4513 		if (th == NULL)
4514 			break;
4515 
4516 		ad->u.net->sport = th->source;
4517 		ad->u.net->dport = th->dest;
4518 		break;
4519 	}
4520 
4521 	case IPPROTO_UDP: {
4522 		struct udphdr _udph, *uh;
4523 
4524 		if (ntohs(ih->frag_off) & IP_OFFSET)
4525 			break;
4526 
4527 		offset += ihlen;
4528 		uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
4529 		if (uh == NULL)
4530 			break;
4531 
4532 		ad->u.net->sport = uh->source;
4533 		ad->u.net->dport = uh->dest;
4534 		break;
4535 	}
4536 
4537 #if IS_ENABLED(CONFIG_IP_SCTP)
4538 	case IPPROTO_SCTP: {
4539 		struct sctphdr _sctph, *sh;
4540 
4541 		if (ntohs(ih->frag_off) & IP_OFFSET)
4542 			break;
4543 
4544 		offset += ihlen;
4545 		sh = skb_header_pointer(skb, offset, sizeof(_sctph), &_sctph);
4546 		if (sh == NULL)
4547 			break;
4548 
4549 		ad->u.net->sport = sh->source;
4550 		ad->u.net->dport = sh->dest;
4551 		break;
4552 	}
4553 #endif
4554 	default:
4555 		break;
4556 	}
4557 out:
4558 	return ret;
4559 }
4560 
4561 #if IS_ENABLED(CONFIG_IPV6)
4562 
4563 /* Returns error only if unable to parse addresses */
selinux_parse_skb_ipv6(struct sk_buff * skb,struct common_audit_data * ad,u8 * proto)4564 static int selinux_parse_skb_ipv6(struct sk_buff *skb,
4565 			struct common_audit_data *ad, u8 *proto)
4566 {
4567 	u8 nexthdr;
4568 	int ret = -EINVAL, offset;
4569 	struct ipv6hdr _ipv6h, *ip6;
4570 	__be16 frag_off;
4571 
4572 	offset = skb_network_offset(skb);
4573 	ip6 = skb_header_pointer(skb, offset, sizeof(_ipv6h), &_ipv6h);
4574 	if (ip6 == NULL)
4575 		goto out;
4576 
4577 	ad->u.net->v6info.saddr = ip6->saddr;
4578 	ad->u.net->v6info.daddr = ip6->daddr;
4579 	ret = 0;
4580 
4581 	nexthdr = ip6->nexthdr;
4582 	offset += sizeof(_ipv6h);
4583 	offset = ipv6_skip_exthdr(skb, offset, &nexthdr, &frag_off);
4584 	if (offset < 0)
4585 		goto out;
4586 
4587 	if (proto)
4588 		*proto = nexthdr;
4589 
4590 	switch (nexthdr) {
4591 	case IPPROTO_TCP: {
4592 		struct tcphdr _tcph, *th;
4593 
4594 		th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
4595 		if (th == NULL)
4596 			break;
4597 
4598 		ad->u.net->sport = th->source;
4599 		ad->u.net->dport = th->dest;
4600 		break;
4601 	}
4602 
4603 	case IPPROTO_UDP: {
4604 		struct udphdr _udph, *uh;
4605 
4606 		uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
4607 		if (uh == NULL)
4608 			break;
4609 
4610 		ad->u.net->sport = uh->source;
4611 		ad->u.net->dport = uh->dest;
4612 		break;
4613 	}
4614 
4615 #if IS_ENABLED(CONFIG_IP_SCTP)
4616 	case IPPROTO_SCTP: {
4617 		struct sctphdr _sctph, *sh;
4618 
4619 		sh = skb_header_pointer(skb, offset, sizeof(_sctph), &_sctph);
4620 		if (sh == NULL)
4621 			break;
4622 
4623 		ad->u.net->sport = sh->source;
4624 		ad->u.net->dport = sh->dest;
4625 		break;
4626 	}
4627 #endif
4628 	/* includes fragments */
4629 	default:
4630 		break;
4631 	}
4632 out:
4633 	return ret;
4634 }
4635 
4636 #endif /* IPV6 */
4637 
selinux_parse_skb(struct sk_buff * skb,struct common_audit_data * ad,char ** _addrp,int src,u8 * proto)4638 static int selinux_parse_skb(struct sk_buff *skb, struct common_audit_data *ad,
4639 			     char **_addrp, int src, u8 *proto)
4640 {
4641 	char *addrp;
4642 	int ret;
4643 
4644 	switch (ad->u.net->family) {
4645 	case PF_INET:
4646 		ret = selinux_parse_skb_ipv4(skb, ad, proto);
4647 		if (ret)
4648 			goto parse_error;
4649 		addrp = (char *)(src ? &ad->u.net->v4info.saddr :
4650 				       &ad->u.net->v4info.daddr);
4651 		goto okay;
4652 
4653 #if IS_ENABLED(CONFIG_IPV6)
4654 	case PF_INET6:
4655 		ret = selinux_parse_skb_ipv6(skb, ad, proto);
4656 		if (ret)
4657 			goto parse_error;
4658 		addrp = (char *)(src ? &ad->u.net->v6info.saddr :
4659 				       &ad->u.net->v6info.daddr);
4660 		goto okay;
4661 #endif	/* IPV6 */
4662 	default:
4663 		addrp = NULL;
4664 		goto okay;
4665 	}
4666 
4667 parse_error:
4668 	pr_warn(
4669 	       "SELinux: failure in selinux_parse_skb(),"
4670 	       " unable to parse packet\n");
4671 	return ret;
4672 
4673 okay:
4674 	if (_addrp)
4675 		*_addrp = addrp;
4676 	return 0;
4677 }
4678 
4679 /**
4680  * selinux_skb_peerlbl_sid - Determine the peer label of a packet
4681  * @skb: the packet
4682  * @family: protocol family
4683  * @sid: the packet's peer label SID
4684  *
4685  * Description:
4686  * Check the various different forms of network peer labeling and determine
4687  * the peer label/SID for the packet; most of the magic actually occurs in
4688  * the security server function security_net_peersid_cmp().  The function
4689  * returns zero if the value in @sid is valid (although it may be SECSID_NULL)
4690  * or -EACCES if @sid is invalid due to inconsistencies with the different
4691  * peer labels.
4692  *
4693  */
selinux_skb_peerlbl_sid(struct sk_buff * skb,u16 family,u32 * sid)4694 static int selinux_skb_peerlbl_sid(struct sk_buff *skb, u16 family, u32 *sid)
4695 {
4696 	int err;
4697 	u32 xfrm_sid;
4698 	u32 nlbl_sid;
4699 	u32 nlbl_type;
4700 
4701 	err = selinux_xfrm_skb_sid(skb, &xfrm_sid);
4702 	if (unlikely(err))
4703 		return -EACCES;
4704 	err = selinux_netlbl_skbuff_getsid(skb, family, &nlbl_type, &nlbl_sid);
4705 	if (unlikely(err))
4706 		return -EACCES;
4707 
4708 	err = security_net_peersid_resolve(nlbl_sid,
4709 					   nlbl_type, xfrm_sid, sid);
4710 	if (unlikely(err)) {
4711 		pr_warn(
4712 		       "SELinux: failure in selinux_skb_peerlbl_sid(),"
4713 		       " unable to determine packet's peer label\n");
4714 		return -EACCES;
4715 	}
4716 
4717 	return 0;
4718 }
4719 
4720 /**
4721  * selinux_conn_sid - Determine the child socket label for a connection
4722  * @sk_sid: the parent socket's SID
4723  * @skb_sid: the packet's SID
4724  * @conn_sid: the resulting connection SID
4725  *
4726  * If @skb_sid is valid then the user:role:type information from @sk_sid is
4727  * combined with the MLS information from @skb_sid in order to create
4728  * @conn_sid.  If @skb_sid is not valid then @conn_sid is simply a copy
4729  * of @sk_sid.  Returns zero on success, negative values on failure.
4730  *
4731  */
selinux_conn_sid(u32 sk_sid,u32 skb_sid,u32 * conn_sid)4732 static int selinux_conn_sid(u32 sk_sid, u32 skb_sid, u32 *conn_sid)
4733 {
4734 	int err = 0;
4735 
4736 	if (skb_sid != SECSID_NULL)
4737 		err = security_sid_mls_copy(sk_sid, skb_sid,
4738 					    conn_sid);
4739 	else
4740 		*conn_sid = sk_sid;
4741 
4742 	return err;
4743 }
4744 
4745 /* socket security operations */
4746 
socket_sockcreate_sid(const struct task_security_struct * tsec,u16 secclass,u32 * socksid)4747 static int socket_sockcreate_sid(const struct task_security_struct *tsec,
4748 				 u16 secclass, u32 *socksid)
4749 {
4750 	if (tsec->sockcreate_sid > SECSID_NULL) {
4751 		*socksid = tsec->sockcreate_sid;
4752 		return 0;
4753 	}
4754 
4755 	return security_transition_sid(tsec->sid, tsec->sid,
4756 				       secclass, NULL, socksid);
4757 }
4758 
sock_skip_has_perm(u32 sid)4759 static bool sock_skip_has_perm(u32 sid)
4760 {
4761 	if (sid == SECINITSID_KERNEL)
4762 		return true;
4763 
4764 	/*
4765 	 * Before POLICYDB_CAP_USERSPACE_INITIAL_CONTEXT, sockets that
4766 	 * inherited the kernel context from early boot used to be skipped
4767 	 * here, so preserve that behavior unless the capability is set.
4768 	 *
4769 	 * By setting the capability the policy signals that it is ready
4770 	 * for this quirk to be fixed. Note that sockets created by a kernel
4771 	 * thread or a usermode helper executed without a transition will
4772 	 * still be skipped in this check regardless of the policycap
4773 	 * setting.
4774 	 */
4775 	if (!selinux_policycap_userspace_initial_context() &&
4776 	    sid == SECINITSID_INIT)
4777 		return true;
4778 	return false;
4779 }
4780 
4781 
sock_has_perm(struct sock * sk,u32 perms)4782 static int sock_has_perm(struct sock *sk, u32 perms)
4783 {
4784 	struct sk_security_struct *sksec = sk->sk_security;
4785 	struct common_audit_data ad;
4786 	struct lsm_network_audit net;
4787 
4788 	if (sock_skip_has_perm(sksec->sid))
4789 		return 0;
4790 
4791 	ad_net_init_from_sk(&ad, &net, sk);
4792 
4793 	return avc_has_perm(current_sid(), sksec->sid, sksec->sclass, perms,
4794 			    &ad);
4795 }
4796 
selinux_socket_create(int family,int type,int protocol,int kern)4797 static int selinux_socket_create(int family, int type,
4798 				 int protocol, int kern)
4799 {
4800 	const struct task_security_struct *tsec = selinux_cred(current_cred());
4801 	u32 newsid;
4802 	u16 secclass;
4803 	int rc;
4804 
4805 	if (kern)
4806 		return 0;
4807 
4808 	secclass = socket_type_to_security_class(family, type, protocol);
4809 	rc = socket_sockcreate_sid(tsec, secclass, &newsid);
4810 	if (rc)
4811 		return rc;
4812 
4813 	return avc_has_perm(tsec->sid, newsid, secclass, SOCKET__CREATE, NULL);
4814 }
4815 
selinux_socket_post_create(struct socket * sock,int family,int type,int protocol,int kern)4816 static int selinux_socket_post_create(struct socket *sock, int family,
4817 				      int type, int protocol, int kern)
4818 {
4819 	const struct task_security_struct *tsec = selinux_cred(current_cred());
4820 	struct inode_security_struct *isec = inode_security_novalidate(SOCK_INODE(sock));
4821 	struct sk_security_struct *sksec;
4822 	u16 sclass = socket_type_to_security_class(family, type, protocol);
4823 	u32 sid = SECINITSID_KERNEL;
4824 	int err = 0;
4825 
4826 	if (!kern) {
4827 		err = socket_sockcreate_sid(tsec, sclass, &sid);
4828 		if (err)
4829 			return err;
4830 	}
4831 
4832 	isec->sclass = sclass;
4833 	isec->sid = sid;
4834 	isec->initialized = LABEL_INITIALIZED;
4835 
4836 	if (sock->sk) {
4837 		sksec = selinux_sock(sock->sk);
4838 		sksec->sclass = sclass;
4839 		sksec->sid = sid;
4840 		/* Allows detection of the first association on this socket */
4841 		if (sksec->sclass == SECCLASS_SCTP_SOCKET)
4842 			sksec->sctp_assoc_state = SCTP_ASSOC_UNSET;
4843 
4844 		err = selinux_netlbl_socket_post_create(sock->sk, family);
4845 	}
4846 
4847 	return err;
4848 }
4849 
selinux_socket_socketpair(struct socket * socka,struct socket * sockb)4850 static int selinux_socket_socketpair(struct socket *socka,
4851 				     struct socket *sockb)
4852 {
4853 	struct sk_security_struct *sksec_a = selinux_sock(socka->sk);
4854 	struct sk_security_struct *sksec_b = selinux_sock(sockb->sk);
4855 
4856 	sksec_a->peer_sid = sksec_b->sid;
4857 	sksec_b->peer_sid = sksec_a->sid;
4858 
4859 	return 0;
4860 }
4861 
4862 /* Range of port numbers used to automatically bind.
4863    Need to determine whether we should perform a name_bind
4864    permission check between the socket and the port number. */
4865 
selinux_socket_bind(struct socket * sock,struct sockaddr * address,int addrlen)4866 static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
4867 {
4868 	struct sock *sk = sock->sk;
4869 	struct sk_security_struct *sksec = selinux_sock(sk);
4870 	u16 family;
4871 	int err;
4872 
4873 	err = sock_has_perm(sk, SOCKET__BIND);
4874 	if (err)
4875 		goto out;
4876 
4877 	/* If PF_INET or PF_INET6, check name_bind permission for the port. */
4878 	family = sk->sk_family;
4879 	if (family == PF_INET || family == PF_INET6) {
4880 		char *addrp;
4881 		struct common_audit_data ad;
4882 		struct lsm_network_audit net = {0,};
4883 		struct sockaddr_in *addr4 = NULL;
4884 		struct sockaddr_in6 *addr6 = NULL;
4885 		u16 family_sa;
4886 		unsigned short snum;
4887 		u32 sid, node_perm;
4888 
4889 		/*
4890 		 * sctp_bindx(3) calls via selinux_sctp_bind_connect()
4891 		 * that validates multiple binding addresses. Because of this
4892 		 * need to check address->sa_family as it is possible to have
4893 		 * sk->sk_family = PF_INET6 with addr->sa_family = AF_INET.
4894 		 */
4895 		if (addrlen < offsetofend(struct sockaddr, sa_family))
4896 			return -EINVAL;
4897 		family_sa = address->sa_family;
4898 		switch (family_sa) {
4899 		case AF_UNSPEC:
4900 		case AF_INET:
4901 			if (addrlen < sizeof(struct sockaddr_in))
4902 				return -EINVAL;
4903 			addr4 = (struct sockaddr_in *)address;
4904 			if (family_sa == AF_UNSPEC) {
4905 				if (family == PF_INET6) {
4906 					/* Length check from inet6_bind_sk() */
4907 					if (addrlen < SIN6_LEN_RFC2133)
4908 						return -EINVAL;
4909 					/* Family check from __inet6_bind() */
4910 					goto err_af;
4911 				}
4912 				/* see __inet_bind(), we only want to allow
4913 				 * AF_UNSPEC if the address is INADDR_ANY
4914 				 */
4915 				if (addr4->sin_addr.s_addr != htonl(INADDR_ANY))
4916 					goto err_af;
4917 				family_sa = AF_INET;
4918 			}
4919 			snum = ntohs(addr4->sin_port);
4920 			addrp = (char *)&addr4->sin_addr.s_addr;
4921 			break;
4922 		case AF_INET6:
4923 			if (addrlen < SIN6_LEN_RFC2133)
4924 				return -EINVAL;
4925 			addr6 = (struct sockaddr_in6 *)address;
4926 			snum = ntohs(addr6->sin6_port);
4927 			addrp = (char *)&addr6->sin6_addr.s6_addr;
4928 			break;
4929 		default:
4930 			goto err_af;
4931 		}
4932 
4933 		ad.type = LSM_AUDIT_DATA_NET;
4934 		ad.u.net = &net;
4935 		ad.u.net->sport = htons(snum);
4936 		ad.u.net->family = family_sa;
4937 
4938 		if (snum) {
4939 			int low, high;
4940 
4941 			inet_get_local_port_range(sock_net(sk), &low, &high);
4942 
4943 			if (inet_port_requires_bind_service(sock_net(sk), snum) ||
4944 			    snum < low || snum > high) {
4945 				err = sel_netport_sid(sk->sk_protocol,
4946 						      snum, &sid);
4947 				if (err)
4948 					goto out;
4949 				err = avc_has_perm(sksec->sid, sid,
4950 						   sksec->sclass,
4951 						   SOCKET__NAME_BIND, &ad);
4952 				if (err)
4953 					goto out;
4954 			}
4955 		}
4956 
4957 		switch (sksec->sclass) {
4958 		case SECCLASS_TCP_SOCKET:
4959 			node_perm = TCP_SOCKET__NODE_BIND;
4960 			break;
4961 
4962 		case SECCLASS_UDP_SOCKET:
4963 			node_perm = UDP_SOCKET__NODE_BIND;
4964 			break;
4965 
4966 		case SECCLASS_SCTP_SOCKET:
4967 			node_perm = SCTP_SOCKET__NODE_BIND;
4968 			break;
4969 
4970 		default:
4971 			node_perm = RAWIP_SOCKET__NODE_BIND;
4972 			break;
4973 		}
4974 
4975 		err = sel_netnode_sid(addrp, family_sa, &sid);
4976 		if (err)
4977 			goto out;
4978 
4979 		if (family_sa == AF_INET)
4980 			ad.u.net->v4info.saddr = addr4->sin_addr.s_addr;
4981 		else
4982 			ad.u.net->v6info.saddr = addr6->sin6_addr;
4983 
4984 		err = avc_has_perm(sksec->sid, sid,
4985 				   sksec->sclass, node_perm, &ad);
4986 		if (err)
4987 			goto out;
4988 	}
4989 out:
4990 	return err;
4991 err_af:
4992 	/* Note that SCTP services expect -EINVAL, others -EAFNOSUPPORT. */
4993 	if (sk->sk_protocol == IPPROTO_SCTP)
4994 		return -EINVAL;
4995 	return -EAFNOSUPPORT;
4996 }
4997 
4998 /* This supports connect(2) and SCTP connect services such as sctp_connectx(3)
4999  * and sctp_sendmsg(3) as described in Documentation/security/SCTP.rst
5000  */
selinux_socket_connect_helper(struct socket * sock,struct sockaddr * address,int addrlen)5001 static int selinux_socket_connect_helper(struct socket *sock,
5002 					 struct sockaddr *address, int addrlen)
5003 {
5004 	struct sock *sk = sock->sk;
5005 	struct sk_security_struct *sksec = selinux_sock(sk);
5006 	int err;
5007 
5008 	err = sock_has_perm(sk, SOCKET__CONNECT);
5009 	if (err)
5010 		return err;
5011 	if (addrlen < offsetofend(struct sockaddr, sa_family))
5012 		return -EINVAL;
5013 
5014 	/* connect(AF_UNSPEC) has special handling, as it is a documented
5015 	 * way to disconnect the socket
5016 	 */
5017 	if (address->sa_family == AF_UNSPEC)
5018 		return 0;
5019 
5020 	/*
5021 	 * If a TCP or SCTP socket, check name_connect permission
5022 	 * for the port.
5023 	 */
5024 	if (sksec->sclass == SECCLASS_TCP_SOCKET ||
5025 	    sksec->sclass == SECCLASS_SCTP_SOCKET) {
5026 		struct common_audit_data ad;
5027 		struct lsm_network_audit net = {0,};
5028 		struct sockaddr_in *addr4 = NULL;
5029 		struct sockaddr_in6 *addr6 = NULL;
5030 		unsigned short snum;
5031 		u32 sid, perm;
5032 
5033 		/* sctp_connectx(3) calls via selinux_sctp_bind_connect()
5034 		 * that validates multiple connect addresses. Because of this
5035 		 * need to check address->sa_family as it is possible to have
5036 		 * sk->sk_family = PF_INET6 with addr->sa_family = AF_INET.
5037 		 */
5038 		switch (address->sa_family) {
5039 		case AF_INET:
5040 			addr4 = (struct sockaddr_in *)address;
5041 			if (addrlen < sizeof(struct sockaddr_in))
5042 				return -EINVAL;
5043 			snum = ntohs(addr4->sin_port);
5044 			break;
5045 		case AF_INET6:
5046 			addr6 = (struct sockaddr_in6 *)address;
5047 			if (addrlen < SIN6_LEN_RFC2133)
5048 				return -EINVAL;
5049 			snum = ntohs(addr6->sin6_port);
5050 			break;
5051 		default:
5052 			/* Note that SCTP services expect -EINVAL, whereas
5053 			 * others expect -EAFNOSUPPORT.
5054 			 */
5055 			if (sksec->sclass == SECCLASS_SCTP_SOCKET)
5056 				return -EINVAL;
5057 			else
5058 				return -EAFNOSUPPORT;
5059 		}
5060 
5061 		err = sel_netport_sid(sk->sk_protocol, snum, &sid);
5062 		if (err)
5063 			return err;
5064 
5065 		switch (sksec->sclass) {
5066 		case SECCLASS_TCP_SOCKET:
5067 			perm = TCP_SOCKET__NAME_CONNECT;
5068 			break;
5069 		case SECCLASS_SCTP_SOCKET:
5070 			perm = SCTP_SOCKET__NAME_CONNECT;
5071 			break;
5072 		}
5073 
5074 		ad.type = LSM_AUDIT_DATA_NET;
5075 		ad.u.net = &net;
5076 		ad.u.net->dport = htons(snum);
5077 		ad.u.net->family = address->sa_family;
5078 		err = avc_has_perm(sksec->sid, sid, sksec->sclass, perm, &ad);
5079 		if (err)
5080 			return err;
5081 	}
5082 
5083 	return 0;
5084 }
5085 
5086 /* Supports connect(2), see comments in selinux_socket_connect_helper() */
selinux_socket_connect(struct socket * sock,struct sockaddr * address,int addrlen)5087 static int selinux_socket_connect(struct socket *sock,
5088 				  struct sockaddr *address, int addrlen)
5089 {
5090 	int err;
5091 	struct sock *sk = sock->sk;
5092 
5093 	err = selinux_socket_connect_helper(sock, address, addrlen);
5094 	if (err)
5095 		return err;
5096 
5097 	return selinux_netlbl_socket_connect(sk, address);
5098 }
5099 
selinux_socket_listen(struct socket * sock,int backlog)5100 static int selinux_socket_listen(struct socket *sock, int backlog)
5101 {
5102 	return sock_has_perm(sock->sk, SOCKET__LISTEN);
5103 }
5104 
selinux_socket_accept(struct socket * sock,struct socket * newsock)5105 static int selinux_socket_accept(struct socket *sock, struct socket *newsock)
5106 {
5107 	int err;
5108 	struct inode_security_struct *isec;
5109 	struct inode_security_struct *newisec;
5110 	u16 sclass;
5111 	u32 sid;
5112 
5113 	err = sock_has_perm(sock->sk, SOCKET__ACCEPT);
5114 	if (err)
5115 		return err;
5116 
5117 	isec = inode_security_novalidate(SOCK_INODE(sock));
5118 	spin_lock(&isec->lock);
5119 	sclass = isec->sclass;
5120 	sid = isec->sid;
5121 	spin_unlock(&isec->lock);
5122 
5123 	newisec = inode_security_novalidate(SOCK_INODE(newsock));
5124 	newisec->sclass = sclass;
5125 	newisec->sid = sid;
5126 	newisec->initialized = LABEL_INITIALIZED;
5127 
5128 	return 0;
5129 }
5130 
selinux_socket_sendmsg(struct socket * sock,struct msghdr * msg,int size)5131 static int selinux_socket_sendmsg(struct socket *sock, struct msghdr *msg,
5132 				  int size)
5133 {
5134 	return sock_has_perm(sock->sk, SOCKET__WRITE);
5135 }
5136 
selinux_socket_recvmsg(struct socket * sock,struct msghdr * msg,int size,int flags)5137 static int selinux_socket_recvmsg(struct socket *sock, struct msghdr *msg,
5138 				  int size, int flags)
5139 {
5140 	return sock_has_perm(sock->sk, SOCKET__READ);
5141 }
5142 
selinux_socket_getsockname(struct socket * sock)5143 static int selinux_socket_getsockname(struct socket *sock)
5144 {
5145 	return sock_has_perm(sock->sk, SOCKET__GETATTR);
5146 }
5147 
selinux_socket_getpeername(struct socket * sock)5148 static int selinux_socket_getpeername(struct socket *sock)
5149 {
5150 	return sock_has_perm(sock->sk, SOCKET__GETATTR);
5151 }
5152 
selinux_socket_setsockopt(struct socket * sock,int level,int optname)5153 static int selinux_socket_setsockopt(struct socket *sock, int level, int optname)
5154 {
5155 	int err;
5156 
5157 	err = sock_has_perm(sock->sk, SOCKET__SETOPT);
5158 	if (err)
5159 		return err;
5160 
5161 	return selinux_netlbl_socket_setsockopt(sock, level, optname);
5162 }
5163 
selinux_socket_getsockopt(struct socket * sock,int level,int optname)5164 static int selinux_socket_getsockopt(struct socket *sock, int level,
5165 				     int optname)
5166 {
5167 	return sock_has_perm(sock->sk, SOCKET__GETOPT);
5168 }
5169 
selinux_socket_shutdown(struct socket * sock,int how)5170 static int selinux_socket_shutdown(struct socket *sock, int how)
5171 {
5172 	return sock_has_perm(sock->sk, SOCKET__SHUTDOWN);
5173 }
5174 
selinux_socket_unix_stream_connect(struct sock * sock,struct sock * other,struct sock * newsk)5175 static int selinux_socket_unix_stream_connect(struct sock *sock,
5176 					      struct sock *other,
5177 					      struct sock *newsk)
5178 {
5179 	struct sk_security_struct *sksec_sock = selinux_sock(sock);
5180 	struct sk_security_struct *sksec_other = selinux_sock(other);
5181 	struct sk_security_struct *sksec_new = selinux_sock(newsk);
5182 	struct common_audit_data ad;
5183 	struct lsm_network_audit net;
5184 	int err;
5185 
5186 	ad_net_init_from_sk(&ad, &net, other);
5187 
5188 	err = avc_has_perm(sksec_sock->sid, sksec_other->sid,
5189 			   sksec_other->sclass,
5190 			   UNIX_STREAM_SOCKET__CONNECTTO, &ad);
5191 	if (err)
5192 		return err;
5193 
5194 	/* server child socket */
5195 	sksec_new->peer_sid = sksec_sock->sid;
5196 	err = security_sid_mls_copy(sksec_other->sid,
5197 				    sksec_sock->sid, &sksec_new->sid);
5198 	if (err)
5199 		return err;
5200 
5201 	/* connecting socket */
5202 	sksec_sock->peer_sid = sksec_new->sid;
5203 
5204 	return 0;
5205 }
5206 
selinux_socket_unix_may_send(struct socket * sock,struct socket * other)5207 static int selinux_socket_unix_may_send(struct socket *sock,
5208 					struct socket *other)
5209 {
5210 	struct sk_security_struct *ssec = selinux_sock(sock->sk);
5211 	struct sk_security_struct *osec = selinux_sock(other->sk);
5212 	struct common_audit_data ad;
5213 	struct lsm_network_audit net;
5214 
5215 	ad_net_init_from_sk(&ad, &net, other->sk);
5216 
5217 	return avc_has_perm(ssec->sid, osec->sid, osec->sclass, SOCKET__SENDTO,
5218 			    &ad);
5219 }
5220 
selinux_inet_sys_rcv_skb(struct net * ns,int ifindex,char * addrp,u16 family,u32 peer_sid,struct common_audit_data * ad)5221 static int selinux_inet_sys_rcv_skb(struct net *ns, int ifindex,
5222 				    char *addrp, u16 family, u32 peer_sid,
5223 				    struct common_audit_data *ad)
5224 {
5225 	int err;
5226 	u32 if_sid;
5227 	u32 node_sid;
5228 
5229 	err = sel_netif_sid(ns, ifindex, &if_sid);
5230 	if (err)
5231 		return err;
5232 	err = avc_has_perm(peer_sid, if_sid,
5233 			   SECCLASS_NETIF, NETIF__INGRESS, ad);
5234 	if (err)
5235 		return err;
5236 
5237 	err = sel_netnode_sid(addrp, family, &node_sid);
5238 	if (err)
5239 		return err;
5240 	return avc_has_perm(peer_sid, node_sid,
5241 			    SECCLASS_NODE, NODE__RECVFROM, ad);
5242 }
5243 
selinux_sock_rcv_skb_compat(struct sock * sk,struct sk_buff * skb,u16 family)5244 static int selinux_sock_rcv_skb_compat(struct sock *sk, struct sk_buff *skb,
5245 				       u16 family)
5246 {
5247 	int err = 0;
5248 	struct sk_security_struct *sksec = selinux_sock(sk);
5249 	u32 sk_sid = sksec->sid;
5250 	struct common_audit_data ad;
5251 	struct lsm_network_audit net;
5252 	char *addrp;
5253 
5254 	ad_net_init_from_iif(&ad, &net, skb->skb_iif, family);
5255 	err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
5256 	if (err)
5257 		return err;
5258 
5259 	if (selinux_secmark_enabled()) {
5260 		err = avc_has_perm(sk_sid, skb->secmark, SECCLASS_PACKET,
5261 				   PACKET__RECV, &ad);
5262 		if (err)
5263 			return err;
5264 	}
5265 
5266 	err = selinux_netlbl_sock_rcv_skb(sksec, skb, family, &ad);
5267 	if (err)
5268 		return err;
5269 	err = selinux_xfrm_sock_rcv_skb(sksec->sid, skb, &ad);
5270 
5271 	return err;
5272 }
5273 
selinux_socket_sock_rcv_skb(struct sock * sk,struct sk_buff * skb)5274 static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
5275 {
5276 	int err, peerlbl_active, secmark_active;
5277 	struct sk_security_struct *sksec = selinux_sock(sk);
5278 	u16 family = sk->sk_family;
5279 	u32 sk_sid = sksec->sid;
5280 	struct common_audit_data ad;
5281 	struct lsm_network_audit net;
5282 	char *addrp;
5283 
5284 	if (family != PF_INET && family != PF_INET6)
5285 		return 0;
5286 
5287 	/* Handle mapped IPv4 packets arriving via IPv6 sockets */
5288 	if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
5289 		family = PF_INET;
5290 
5291 	/* If any sort of compatibility mode is enabled then handoff processing
5292 	 * to the selinux_sock_rcv_skb_compat() function to deal with the
5293 	 * special handling.  We do this in an attempt to keep this function
5294 	 * as fast and as clean as possible. */
5295 	if (!selinux_policycap_netpeer())
5296 		return selinux_sock_rcv_skb_compat(sk, skb, family);
5297 
5298 	secmark_active = selinux_secmark_enabled();
5299 	peerlbl_active = selinux_peerlbl_enabled();
5300 	if (!secmark_active && !peerlbl_active)
5301 		return 0;
5302 
5303 	ad_net_init_from_iif(&ad, &net, skb->skb_iif, family);
5304 	err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
5305 	if (err)
5306 		return err;
5307 
5308 	if (peerlbl_active) {
5309 		u32 peer_sid;
5310 
5311 		err = selinux_skb_peerlbl_sid(skb, family, &peer_sid);
5312 		if (err)
5313 			return err;
5314 		err = selinux_inet_sys_rcv_skb(sock_net(sk), skb->skb_iif,
5315 					       addrp, family, peer_sid, &ad);
5316 		if (err) {
5317 			selinux_netlbl_err(skb, family, err, 0);
5318 			return err;
5319 		}
5320 		err = avc_has_perm(sk_sid, peer_sid, SECCLASS_PEER,
5321 				   PEER__RECV, &ad);
5322 		if (err) {
5323 			selinux_netlbl_err(skb, family, err, 0);
5324 			return err;
5325 		}
5326 	}
5327 
5328 	if (secmark_active) {
5329 		err = avc_has_perm(sk_sid, skb->secmark, SECCLASS_PACKET,
5330 				   PACKET__RECV, &ad);
5331 		if (err)
5332 			return err;
5333 	}
5334 
5335 	return err;
5336 }
5337 
selinux_socket_getpeersec_stream(struct socket * sock,sockptr_t optval,sockptr_t optlen,unsigned int len)5338 static int selinux_socket_getpeersec_stream(struct socket *sock,
5339 					    sockptr_t optval, sockptr_t optlen,
5340 					    unsigned int len)
5341 {
5342 	int err = 0;
5343 	char *scontext = NULL;
5344 	u32 scontext_len;
5345 	struct sk_security_struct *sksec = selinux_sock(sock->sk);
5346 	u32 peer_sid = SECSID_NULL;
5347 
5348 	if (sksec->sclass == SECCLASS_UNIX_STREAM_SOCKET ||
5349 	    sksec->sclass == SECCLASS_TCP_SOCKET ||
5350 	    sksec->sclass == SECCLASS_SCTP_SOCKET)
5351 		peer_sid = sksec->peer_sid;
5352 	if (peer_sid == SECSID_NULL)
5353 		return -ENOPROTOOPT;
5354 
5355 	err = security_sid_to_context(peer_sid, &scontext,
5356 				      &scontext_len);
5357 	if (err)
5358 		return err;
5359 	if (scontext_len > len) {
5360 		err = -ERANGE;
5361 		goto out_len;
5362 	}
5363 
5364 	if (copy_to_sockptr(optval, scontext, scontext_len))
5365 		err = -EFAULT;
5366 out_len:
5367 	if (copy_to_sockptr(optlen, &scontext_len, sizeof(scontext_len)))
5368 		err = -EFAULT;
5369 	kfree(scontext);
5370 	return err;
5371 }
5372 
selinux_socket_getpeersec_dgram(struct socket * sock,struct sk_buff * skb,u32 * secid)5373 static int selinux_socket_getpeersec_dgram(struct socket *sock,
5374 					   struct sk_buff *skb, u32 *secid)
5375 {
5376 	u32 peer_secid = SECSID_NULL;
5377 	u16 family;
5378 
5379 	if (skb && skb->protocol == htons(ETH_P_IP))
5380 		family = PF_INET;
5381 	else if (skb && skb->protocol == htons(ETH_P_IPV6))
5382 		family = PF_INET6;
5383 	else if (sock)
5384 		family = sock->sk->sk_family;
5385 	else {
5386 		*secid = SECSID_NULL;
5387 		return -EINVAL;
5388 	}
5389 
5390 	if (sock && family == PF_UNIX) {
5391 		struct inode_security_struct *isec;
5392 		isec = inode_security_novalidate(SOCK_INODE(sock));
5393 		peer_secid = isec->sid;
5394 	} else if (skb)
5395 		selinux_skb_peerlbl_sid(skb, family, &peer_secid);
5396 
5397 	*secid = peer_secid;
5398 	if (peer_secid == SECSID_NULL)
5399 		return -ENOPROTOOPT;
5400 	return 0;
5401 }
5402 
selinux_sk_alloc_security(struct sock * sk,int family,gfp_t priority)5403 static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority)
5404 {
5405 	struct sk_security_struct *sksec = selinux_sock(sk);
5406 
5407 	sksec->peer_sid = SECINITSID_UNLABELED;
5408 	sksec->sid = SECINITSID_UNLABELED;
5409 	sksec->sclass = SECCLASS_SOCKET;
5410 	selinux_netlbl_sk_security_reset(sksec);
5411 
5412 	return 0;
5413 }
5414 
selinux_sk_free_security(struct sock * sk)5415 static void selinux_sk_free_security(struct sock *sk)
5416 {
5417 	struct sk_security_struct *sksec = selinux_sock(sk);
5418 
5419 	selinux_netlbl_sk_security_free(sksec);
5420 }
5421 
selinux_sk_clone_security(const struct sock * sk,struct sock * newsk)5422 static void selinux_sk_clone_security(const struct sock *sk, struct sock *newsk)
5423 {
5424 	struct sk_security_struct *sksec = selinux_sock(sk);
5425 	struct sk_security_struct *newsksec = selinux_sock(newsk);
5426 
5427 	newsksec->sid = sksec->sid;
5428 	newsksec->peer_sid = sksec->peer_sid;
5429 	newsksec->sclass = sksec->sclass;
5430 
5431 	selinux_netlbl_sk_security_reset(newsksec);
5432 }
5433 
selinux_sk_getsecid(const struct sock * sk,u32 * secid)5434 static void selinux_sk_getsecid(const struct sock *sk, u32 *secid)
5435 {
5436 	if (!sk)
5437 		*secid = SECINITSID_ANY_SOCKET;
5438 	else {
5439 		const struct sk_security_struct *sksec = selinux_sock(sk);
5440 
5441 		*secid = sksec->sid;
5442 	}
5443 }
5444 
selinux_sock_graft(struct sock * sk,struct socket * parent)5445 static void selinux_sock_graft(struct sock *sk, struct socket *parent)
5446 {
5447 	struct inode_security_struct *isec =
5448 		inode_security_novalidate(SOCK_INODE(parent));
5449 	struct sk_security_struct *sksec = selinux_sock(sk);
5450 
5451 	if (sk->sk_family == PF_INET || sk->sk_family == PF_INET6 ||
5452 	    sk->sk_family == PF_UNIX)
5453 		isec->sid = sksec->sid;
5454 	sksec->sclass = isec->sclass;
5455 }
5456 
5457 /*
5458  * Determines peer_secid for the asoc and updates socket's peer label
5459  * if it's the first association on the socket.
5460  */
selinux_sctp_process_new_assoc(struct sctp_association * asoc,struct sk_buff * skb)5461 static int selinux_sctp_process_new_assoc(struct sctp_association *asoc,
5462 					  struct sk_buff *skb)
5463 {
5464 	struct sock *sk = asoc->base.sk;
5465 	u16 family = sk->sk_family;
5466 	struct sk_security_struct *sksec = selinux_sock(sk);
5467 	struct common_audit_data ad;
5468 	struct lsm_network_audit net;
5469 	int err;
5470 
5471 	/* handle mapped IPv4 packets arriving via IPv6 sockets */
5472 	if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
5473 		family = PF_INET;
5474 
5475 	if (selinux_peerlbl_enabled()) {
5476 		asoc->peer_secid = SECSID_NULL;
5477 
5478 		/* This will return peer_sid = SECSID_NULL if there are
5479 		 * no peer labels, see security_net_peersid_resolve().
5480 		 */
5481 		err = selinux_skb_peerlbl_sid(skb, family, &asoc->peer_secid);
5482 		if (err)
5483 			return err;
5484 
5485 		if (asoc->peer_secid == SECSID_NULL)
5486 			asoc->peer_secid = SECINITSID_UNLABELED;
5487 	} else {
5488 		asoc->peer_secid = SECINITSID_UNLABELED;
5489 	}
5490 
5491 	if (sksec->sctp_assoc_state == SCTP_ASSOC_UNSET) {
5492 		sksec->sctp_assoc_state = SCTP_ASSOC_SET;
5493 
5494 		/* Here as first association on socket. As the peer SID
5495 		 * was allowed by peer recv (and the netif/node checks),
5496 		 * then it is approved by policy and used as the primary
5497 		 * peer SID for getpeercon(3).
5498 		 */
5499 		sksec->peer_sid = asoc->peer_secid;
5500 	} else if (sksec->peer_sid != asoc->peer_secid) {
5501 		/* Other association peer SIDs are checked to enforce
5502 		 * consistency among the peer SIDs.
5503 		 */
5504 		ad_net_init_from_sk(&ad, &net, asoc->base.sk);
5505 		err = avc_has_perm(sksec->peer_sid, asoc->peer_secid,
5506 				   sksec->sclass, SCTP_SOCKET__ASSOCIATION,
5507 				   &ad);
5508 		if (err)
5509 			return err;
5510 	}
5511 	return 0;
5512 }
5513 
5514 /* Called whenever SCTP receives an INIT or COOKIE ECHO chunk. This
5515  * happens on an incoming connect(2), sctp_connectx(3) or
5516  * sctp_sendmsg(3) (with no association already present).
5517  */
selinux_sctp_assoc_request(struct sctp_association * asoc,struct sk_buff * skb)5518 static int selinux_sctp_assoc_request(struct sctp_association *asoc,
5519 				      struct sk_buff *skb)
5520 {
5521 	struct sk_security_struct *sksec = selinux_sock(asoc->base.sk);
5522 	u32 conn_sid;
5523 	int err;
5524 
5525 	if (!selinux_policycap_extsockclass())
5526 		return 0;
5527 
5528 	err = selinux_sctp_process_new_assoc(asoc, skb);
5529 	if (err)
5530 		return err;
5531 
5532 	/* Compute the MLS component for the connection and store
5533 	 * the information in asoc. This will be used by SCTP TCP type
5534 	 * sockets and peeled off connections as they cause a new
5535 	 * socket to be generated. selinux_sctp_sk_clone() will then
5536 	 * plug this into the new socket.
5537 	 */
5538 	err = selinux_conn_sid(sksec->sid, asoc->peer_secid, &conn_sid);
5539 	if (err)
5540 		return err;
5541 
5542 	asoc->secid = conn_sid;
5543 
5544 	/* Set any NetLabel labels including CIPSO/CALIPSO options. */
5545 	return selinux_netlbl_sctp_assoc_request(asoc, skb);
5546 }
5547 
5548 /* Called when SCTP receives a COOKIE ACK chunk as the final
5549  * response to an association request (initited by us).
5550  */
selinux_sctp_assoc_established(struct sctp_association * asoc,struct sk_buff * skb)5551 static int selinux_sctp_assoc_established(struct sctp_association *asoc,
5552 					  struct sk_buff *skb)
5553 {
5554 	struct sk_security_struct *sksec = selinux_sock(asoc->base.sk);
5555 
5556 	if (!selinux_policycap_extsockclass())
5557 		return 0;
5558 
5559 	/* Inherit secid from the parent socket - this will be picked up
5560 	 * by selinux_sctp_sk_clone() if the association gets peeled off
5561 	 * into a new socket.
5562 	 */
5563 	asoc->secid = sksec->sid;
5564 
5565 	return selinux_sctp_process_new_assoc(asoc, skb);
5566 }
5567 
5568 /* Check if sctp IPv4/IPv6 addresses are valid for binding or connecting
5569  * based on their @optname.
5570  */
selinux_sctp_bind_connect(struct sock * sk,int optname,struct sockaddr * address,int addrlen)5571 static int selinux_sctp_bind_connect(struct sock *sk, int optname,
5572 				     struct sockaddr *address,
5573 				     int addrlen)
5574 {
5575 	int len, err = 0, walk_size = 0;
5576 	void *addr_buf;
5577 	struct sockaddr *addr;
5578 	struct socket *sock;
5579 
5580 	if (!selinux_policycap_extsockclass())
5581 		return 0;
5582 
5583 	/* Process one or more addresses that may be IPv4 or IPv6 */
5584 	sock = sk->sk_socket;
5585 	addr_buf = address;
5586 
5587 	while (walk_size < addrlen) {
5588 		if (walk_size + sizeof(sa_family_t) > addrlen)
5589 			return -EINVAL;
5590 
5591 		addr = addr_buf;
5592 		switch (addr->sa_family) {
5593 		case AF_UNSPEC:
5594 		case AF_INET:
5595 			len = sizeof(struct sockaddr_in);
5596 			break;
5597 		case AF_INET6:
5598 			len = sizeof(struct sockaddr_in6);
5599 			break;
5600 		default:
5601 			return -EINVAL;
5602 		}
5603 
5604 		if (walk_size + len > addrlen)
5605 			return -EINVAL;
5606 
5607 		err = -EINVAL;
5608 		switch (optname) {
5609 		/* Bind checks */
5610 		case SCTP_PRIMARY_ADDR:
5611 		case SCTP_SET_PEER_PRIMARY_ADDR:
5612 		case SCTP_SOCKOPT_BINDX_ADD:
5613 			err = selinux_socket_bind(sock, addr, len);
5614 			break;
5615 		/* Connect checks */
5616 		case SCTP_SOCKOPT_CONNECTX:
5617 		case SCTP_PARAM_SET_PRIMARY:
5618 		case SCTP_PARAM_ADD_IP:
5619 		case SCTP_SENDMSG_CONNECT:
5620 			err = selinux_socket_connect_helper(sock, addr, len);
5621 			if (err)
5622 				return err;
5623 
5624 			/* As selinux_sctp_bind_connect() is called by the
5625 			 * SCTP protocol layer, the socket is already locked,
5626 			 * therefore selinux_netlbl_socket_connect_locked()
5627 			 * is called here. The situations handled are:
5628 			 * sctp_connectx(3), sctp_sendmsg(3), sendmsg(2),
5629 			 * whenever a new IP address is added or when a new
5630 			 * primary address is selected.
5631 			 * Note that an SCTP connect(2) call happens before
5632 			 * the SCTP protocol layer and is handled via
5633 			 * selinux_socket_connect().
5634 			 */
5635 			err = selinux_netlbl_socket_connect_locked(sk, addr);
5636 			break;
5637 		}
5638 
5639 		if (err)
5640 			return err;
5641 
5642 		addr_buf += len;
5643 		walk_size += len;
5644 	}
5645 
5646 	return 0;
5647 }
5648 
5649 /* Called whenever a new socket is created by accept(2) or sctp_peeloff(3). */
selinux_sctp_sk_clone(struct sctp_association * asoc,struct sock * sk,struct sock * newsk)5650 static void selinux_sctp_sk_clone(struct sctp_association *asoc, struct sock *sk,
5651 				  struct sock *newsk)
5652 {
5653 	struct sk_security_struct *sksec = selinux_sock(sk);
5654 	struct sk_security_struct *newsksec = selinux_sock(newsk);
5655 
5656 	/* If policy does not support SECCLASS_SCTP_SOCKET then call
5657 	 * the non-sctp clone version.
5658 	 */
5659 	if (!selinux_policycap_extsockclass())
5660 		return selinux_sk_clone_security(sk, newsk);
5661 
5662 	newsksec->sid = asoc->secid;
5663 	newsksec->peer_sid = asoc->peer_secid;
5664 	newsksec->sclass = sksec->sclass;
5665 	selinux_netlbl_sctp_sk_clone(sk, newsk);
5666 }
5667 
selinux_mptcp_add_subflow(struct sock * sk,struct sock * ssk)5668 static int selinux_mptcp_add_subflow(struct sock *sk, struct sock *ssk)
5669 {
5670 	struct sk_security_struct *ssksec = selinux_sock(ssk);
5671 	struct sk_security_struct *sksec = selinux_sock(sk);
5672 
5673 	ssksec->sclass = sksec->sclass;
5674 	ssksec->sid = sksec->sid;
5675 
5676 	/* replace the existing subflow label deleting the existing one
5677 	 * and re-recreating a new label using the updated context
5678 	 */
5679 	selinux_netlbl_sk_security_free(ssksec);
5680 	return selinux_netlbl_socket_post_create(ssk, ssk->sk_family);
5681 }
5682 
selinux_inet_conn_request(const struct sock * sk,struct sk_buff * skb,struct request_sock * req)5683 static int selinux_inet_conn_request(const struct sock *sk, struct sk_buff *skb,
5684 				     struct request_sock *req)
5685 {
5686 	struct sk_security_struct *sksec = selinux_sock(sk);
5687 	int err;
5688 	u16 family = req->rsk_ops->family;
5689 	u32 connsid;
5690 	u32 peersid;
5691 
5692 	err = selinux_skb_peerlbl_sid(skb, family, &peersid);
5693 	if (err)
5694 		return err;
5695 	err = selinux_conn_sid(sksec->sid, peersid, &connsid);
5696 	if (err)
5697 		return err;
5698 	req->secid = connsid;
5699 	req->peer_secid = peersid;
5700 
5701 	return selinux_netlbl_inet_conn_request(req, family);
5702 }
5703 
selinux_inet_csk_clone(struct sock * newsk,const struct request_sock * req)5704 static void selinux_inet_csk_clone(struct sock *newsk,
5705 				   const struct request_sock *req)
5706 {
5707 	struct sk_security_struct *newsksec = selinux_sock(newsk);
5708 
5709 	newsksec->sid = req->secid;
5710 	newsksec->peer_sid = req->peer_secid;
5711 	/* NOTE: Ideally, we should also get the isec->sid for the
5712 	   new socket in sync, but we don't have the isec available yet.
5713 	   So we will wait until sock_graft to do it, by which
5714 	   time it will have been created and available. */
5715 
5716 	/* We don't need to take any sort of lock here as we are the only
5717 	 * thread with access to newsksec */
5718 	selinux_netlbl_inet_csk_clone(newsk, req->rsk_ops->family);
5719 }
5720 
selinux_inet_conn_established(struct sock * sk,struct sk_buff * skb)5721 static void selinux_inet_conn_established(struct sock *sk, struct sk_buff *skb)
5722 {
5723 	u16 family = sk->sk_family;
5724 	struct sk_security_struct *sksec = selinux_sock(sk);
5725 
5726 	/* handle mapped IPv4 packets arriving via IPv6 sockets */
5727 	if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
5728 		family = PF_INET;
5729 
5730 	selinux_skb_peerlbl_sid(skb, family, &sksec->peer_sid);
5731 }
5732 
selinux_secmark_relabel_packet(u32 sid)5733 static int selinux_secmark_relabel_packet(u32 sid)
5734 {
5735 	return avc_has_perm(current_sid(), sid, SECCLASS_PACKET, PACKET__RELABELTO,
5736 			    NULL);
5737 }
5738 
selinux_secmark_refcount_inc(void)5739 static void selinux_secmark_refcount_inc(void)
5740 {
5741 	atomic_inc(&selinux_secmark_refcount);
5742 }
5743 
selinux_secmark_refcount_dec(void)5744 static void selinux_secmark_refcount_dec(void)
5745 {
5746 	atomic_dec(&selinux_secmark_refcount);
5747 }
5748 
selinux_req_classify_flow(const struct request_sock * req,struct flowi_common * flic)5749 static void selinux_req_classify_flow(const struct request_sock *req,
5750 				      struct flowi_common *flic)
5751 {
5752 	flic->flowic_secid = req->secid;
5753 }
5754 
selinux_tun_dev_alloc_security(void * security)5755 static int selinux_tun_dev_alloc_security(void *security)
5756 {
5757 	struct tun_security_struct *tunsec = selinux_tun_dev(security);
5758 
5759 	tunsec->sid = current_sid();
5760 	return 0;
5761 }
5762 
selinux_tun_dev_create(void)5763 static int selinux_tun_dev_create(void)
5764 {
5765 	u32 sid = current_sid();
5766 
5767 	/* we aren't taking into account the "sockcreate" SID since the socket
5768 	 * that is being created here is not a socket in the traditional sense,
5769 	 * instead it is a private sock, accessible only to the kernel, and
5770 	 * representing a wide range of network traffic spanning multiple
5771 	 * connections unlike traditional sockets - check the TUN driver to
5772 	 * get a better understanding of why this socket is special */
5773 
5774 	return avc_has_perm(sid, sid, SECCLASS_TUN_SOCKET, TUN_SOCKET__CREATE,
5775 			    NULL);
5776 }
5777 
selinux_tun_dev_attach_queue(void * security)5778 static int selinux_tun_dev_attach_queue(void *security)
5779 {
5780 	struct tun_security_struct *tunsec = selinux_tun_dev(security);
5781 
5782 	return avc_has_perm(current_sid(), tunsec->sid, SECCLASS_TUN_SOCKET,
5783 			    TUN_SOCKET__ATTACH_QUEUE, NULL);
5784 }
5785 
selinux_tun_dev_attach(struct sock * sk,void * security)5786 static int selinux_tun_dev_attach(struct sock *sk, void *security)
5787 {
5788 	struct tun_security_struct *tunsec = selinux_tun_dev(security);
5789 	struct sk_security_struct *sksec = selinux_sock(sk);
5790 
5791 	/* we don't currently perform any NetLabel based labeling here and it
5792 	 * isn't clear that we would want to do so anyway; while we could apply
5793 	 * labeling without the support of the TUN user the resulting labeled
5794 	 * traffic from the other end of the connection would almost certainly
5795 	 * cause confusion to the TUN user that had no idea network labeling
5796 	 * protocols were being used */
5797 
5798 	sksec->sid = tunsec->sid;
5799 	sksec->sclass = SECCLASS_TUN_SOCKET;
5800 
5801 	return 0;
5802 }
5803 
selinux_tun_dev_open(void * security)5804 static int selinux_tun_dev_open(void *security)
5805 {
5806 	struct tun_security_struct *tunsec = selinux_tun_dev(security);
5807 	u32 sid = current_sid();
5808 	int err;
5809 
5810 	err = avc_has_perm(sid, tunsec->sid, SECCLASS_TUN_SOCKET,
5811 			   TUN_SOCKET__RELABELFROM, NULL);
5812 	if (err)
5813 		return err;
5814 	err = avc_has_perm(sid, sid, SECCLASS_TUN_SOCKET,
5815 			   TUN_SOCKET__RELABELTO, NULL);
5816 	if (err)
5817 		return err;
5818 	tunsec->sid = sid;
5819 
5820 	return 0;
5821 }
5822 
5823 #ifdef CONFIG_NETFILTER
5824 
selinux_ip_forward(void * priv,struct sk_buff * skb,const struct nf_hook_state * state)5825 static unsigned int selinux_ip_forward(void *priv, struct sk_buff *skb,
5826 				       const struct nf_hook_state *state)
5827 {
5828 	int ifindex;
5829 	u16 family;
5830 	char *addrp;
5831 	u32 peer_sid;
5832 	struct common_audit_data ad;
5833 	struct lsm_network_audit net;
5834 	int secmark_active, peerlbl_active;
5835 
5836 	if (!selinux_policycap_netpeer())
5837 		return NF_ACCEPT;
5838 
5839 	secmark_active = selinux_secmark_enabled();
5840 	peerlbl_active = selinux_peerlbl_enabled();
5841 	if (!secmark_active && !peerlbl_active)
5842 		return NF_ACCEPT;
5843 
5844 	family = state->pf;
5845 	if (selinux_skb_peerlbl_sid(skb, family, &peer_sid) != 0)
5846 		return NF_DROP;
5847 
5848 	ifindex = state->in->ifindex;
5849 	ad_net_init_from_iif(&ad, &net, ifindex, family);
5850 	if (selinux_parse_skb(skb, &ad, &addrp, 1, NULL) != 0)
5851 		return NF_DROP;
5852 
5853 	if (peerlbl_active) {
5854 		int err;
5855 
5856 		err = selinux_inet_sys_rcv_skb(state->net, ifindex,
5857 					       addrp, family, peer_sid, &ad);
5858 		if (err) {
5859 			selinux_netlbl_err(skb, family, err, 1);
5860 			return NF_DROP;
5861 		}
5862 	}
5863 
5864 	if (secmark_active)
5865 		if (avc_has_perm(peer_sid, skb->secmark,
5866 				 SECCLASS_PACKET, PACKET__FORWARD_IN, &ad))
5867 			return NF_DROP;
5868 
5869 	if (netlbl_enabled())
5870 		/* we do this in the FORWARD path and not the POST_ROUTING
5871 		 * path because we want to make sure we apply the necessary
5872 		 * labeling before IPsec is applied so we can leverage AH
5873 		 * protection */
5874 		if (selinux_netlbl_skbuff_setsid(skb, family, peer_sid) != 0)
5875 			return NF_DROP;
5876 
5877 	return NF_ACCEPT;
5878 }
5879 
selinux_ip_output(void * priv,struct sk_buff * skb,const struct nf_hook_state * state)5880 static unsigned int selinux_ip_output(void *priv, struct sk_buff *skb,
5881 				      const struct nf_hook_state *state)
5882 {
5883 	struct sock *sk;
5884 	u32 sid;
5885 
5886 	if (!netlbl_enabled())
5887 		return NF_ACCEPT;
5888 
5889 	/* we do this in the LOCAL_OUT path and not the POST_ROUTING path
5890 	 * because we want to make sure we apply the necessary labeling
5891 	 * before IPsec is applied so we can leverage AH protection */
5892 	sk = skb_to_full_sk(skb);
5893 	if (sk) {
5894 		struct sk_security_struct *sksec;
5895 
5896 		if (sk_listener(sk))
5897 			/* if the socket is the listening state then this
5898 			 * packet is a SYN-ACK packet which means it needs to
5899 			 * be labeled based on the connection/request_sock and
5900 			 * not the parent socket.  unfortunately, we can't
5901 			 * lookup the request_sock yet as it isn't queued on
5902 			 * the parent socket until after the SYN-ACK is sent.
5903 			 * the "solution" is to simply pass the packet as-is
5904 			 * as any IP option based labeling should be copied
5905 			 * from the initial connection request (in the IP
5906 			 * layer).  it is far from ideal, but until we get a
5907 			 * security label in the packet itself this is the
5908 			 * best we can do. */
5909 			return NF_ACCEPT;
5910 
5911 		/* standard practice, label using the parent socket */
5912 		sksec = selinux_sock(sk);
5913 		sid = sksec->sid;
5914 	} else
5915 		sid = SECINITSID_KERNEL;
5916 	if (selinux_netlbl_skbuff_setsid(skb, state->pf, sid) != 0)
5917 		return NF_DROP;
5918 
5919 	return NF_ACCEPT;
5920 }
5921 
5922 
selinux_ip_postroute_compat(struct sk_buff * skb,const struct nf_hook_state * state)5923 static unsigned int selinux_ip_postroute_compat(struct sk_buff *skb,
5924 					const struct nf_hook_state *state)
5925 {
5926 	struct sock *sk;
5927 	struct sk_security_struct *sksec;
5928 	struct common_audit_data ad;
5929 	struct lsm_network_audit net;
5930 	u8 proto = 0;
5931 
5932 	sk = skb_to_full_sk(skb);
5933 	if (sk == NULL)
5934 		return NF_ACCEPT;
5935 	sksec = selinux_sock(sk);
5936 
5937 	ad_net_init_from_iif(&ad, &net, state->out->ifindex, state->pf);
5938 	if (selinux_parse_skb(skb, &ad, NULL, 0, &proto))
5939 		return NF_DROP;
5940 
5941 	if (selinux_secmark_enabled())
5942 		if (avc_has_perm(sksec->sid, skb->secmark,
5943 				 SECCLASS_PACKET, PACKET__SEND, &ad))
5944 			return NF_DROP_ERR(-ECONNREFUSED);
5945 
5946 	if (selinux_xfrm_postroute_last(sksec->sid, skb, &ad, proto))
5947 		return NF_DROP_ERR(-ECONNREFUSED);
5948 
5949 	return NF_ACCEPT;
5950 }
5951 
selinux_ip_postroute(void * priv,struct sk_buff * skb,const struct nf_hook_state * state)5952 static unsigned int selinux_ip_postroute(void *priv,
5953 					 struct sk_buff *skb,
5954 					 const struct nf_hook_state *state)
5955 {
5956 	u16 family;
5957 	u32 secmark_perm;
5958 	u32 peer_sid;
5959 	int ifindex;
5960 	struct sock *sk;
5961 	struct common_audit_data ad;
5962 	struct lsm_network_audit net;
5963 	char *addrp;
5964 	int secmark_active, peerlbl_active;
5965 
5966 	/* If any sort of compatibility mode is enabled then handoff processing
5967 	 * to the selinux_ip_postroute_compat() function to deal with the
5968 	 * special handling.  We do this in an attempt to keep this function
5969 	 * as fast and as clean as possible. */
5970 	if (!selinux_policycap_netpeer())
5971 		return selinux_ip_postroute_compat(skb, state);
5972 
5973 	secmark_active = selinux_secmark_enabled();
5974 	peerlbl_active = selinux_peerlbl_enabled();
5975 	if (!secmark_active && !peerlbl_active)
5976 		return NF_ACCEPT;
5977 
5978 	sk = skb_to_full_sk(skb);
5979 
5980 #ifdef CONFIG_XFRM
5981 	/* If skb->dst->xfrm is non-NULL then the packet is undergoing an IPsec
5982 	 * packet transformation so allow the packet to pass without any checks
5983 	 * since we'll have another chance to perform access control checks
5984 	 * when the packet is on it's final way out.
5985 	 * NOTE: there appear to be some IPv6 multicast cases where skb->dst
5986 	 *       is NULL, in this case go ahead and apply access control.
5987 	 * NOTE: if this is a local socket (skb->sk != NULL) that is in the
5988 	 *       TCP listening state we cannot wait until the XFRM processing
5989 	 *       is done as we will miss out on the SA label if we do;
5990 	 *       unfortunately, this means more work, but it is only once per
5991 	 *       connection. */
5992 	if (skb_dst(skb) != NULL && skb_dst(skb)->xfrm != NULL &&
5993 	    !(sk && sk_listener(sk)))
5994 		return NF_ACCEPT;
5995 #endif
5996 
5997 	family = state->pf;
5998 	if (sk == NULL) {
5999 		/* Without an associated socket the packet is either coming
6000 		 * from the kernel or it is being forwarded; check the packet
6001 		 * to determine which and if the packet is being forwarded
6002 		 * query the packet directly to determine the security label. */
6003 		if (skb->skb_iif) {
6004 			secmark_perm = PACKET__FORWARD_OUT;
6005 			if (selinux_skb_peerlbl_sid(skb, family, &peer_sid))
6006 				return NF_DROP;
6007 		} else {
6008 			secmark_perm = PACKET__SEND;
6009 			peer_sid = SECINITSID_KERNEL;
6010 		}
6011 	} else if (sk_listener(sk)) {
6012 		/* Locally generated packet but the associated socket is in the
6013 		 * listening state which means this is a SYN-ACK packet.  In
6014 		 * this particular case the correct security label is assigned
6015 		 * to the connection/request_sock but unfortunately we can't
6016 		 * query the request_sock as it isn't queued on the parent
6017 		 * socket until after the SYN-ACK packet is sent; the only
6018 		 * viable choice is to regenerate the label like we do in
6019 		 * selinux_inet_conn_request().  See also selinux_ip_output()
6020 		 * for similar problems. */
6021 		u32 skb_sid;
6022 		struct sk_security_struct *sksec;
6023 
6024 		sksec = selinux_sock(sk);
6025 		if (selinux_skb_peerlbl_sid(skb, family, &skb_sid))
6026 			return NF_DROP;
6027 		/* At this point, if the returned skb peerlbl is SECSID_NULL
6028 		 * and the packet has been through at least one XFRM
6029 		 * transformation then we must be dealing with the "final"
6030 		 * form of labeled IPsec packet; since we've already applied
6031 		 * all of our access controls on this packet we can safely
6032 		 * pass the packet. */
6033 		if (skb_sid == SECSID_NULL) {
6034 			switch (family) {
6035 			case PF_INET:
6036 				if (IPCB(skb)->flags & IPSKB_XFRM_TRANSFORMED)
6037 					return NF_ACCEPT;
6038 				break;
6039 			case PF_INET6:
6040 				if (IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED)
6041 					return NF_ACCEPT;
6042 				break;
6043 			default:
6044 				return NF_DROP_ERR(-ECONNREFUSED);
6045 			}
6046 		}
6047 		if (selinux_conn_sid(sksec->sid, skb_sid, &peer_sid))
6048 			return NF_DROP;
6049 		secmark_perm = PACKET__SEND;
6050 	} else {
6051 		/* Locally generated packet, fetch the security label from the
6052 		 * associated socket. */
6053 		struct sk_security_struct *sksec = selinux_sock(sk);
6054 		peer_sid = sksec->sid;
6055 		secmark_perm = PACKET__SEND;
6056 	}
6057 
6058 	ifindex = state->out->ifindex;
6059 	ad_net_init_from_iif(&ad, &net, ifindex, family);
6060 	if (selinux_parse_skb(skb, &ad, &addrp, 0, NULL))
6061 		return NF_DROP;
6062 
6063 	if (secmark_active)
6064 		if (avc_has_perm(peer_sid, skb->secmark,
6065 				 SECCLASS_PACKET, secmark_perm, &ad))
6066 			return NF_DROP_ERR(-ECONNREFUSED);
6067 
6068 	if (peerlbl_active) {
6069 		u32 if_sid;
6070 		u32 node_sid;
6071 
6072 		if (sel_netif_sid(state->net, ifindex, &if_sid))
6073 			return NF_DROP;
6074 		if (avc_has_perm(peer_sid, if_sid,
6075 				 SECCLASS_NETIF, NETIF__EGRESS, &ad))
6076 			return NF_DROP_ERR(-ECONNREFUSED);
6077 
6078 		if (sel_netnode_sid(addrp, family, &node_sid))
6079 			return NF_DROP;
6080 		if (avc_has_perm(peer_sid, node_sid,
6081 				 SECCLASS_NODE, NODE__SENDTO, &ad))
6082 			return NF_DROP_ERR(-ECONNREFUSED);
6083 	}
6084 
6085 	return NF_ACCEPT;
6086 }
6087 #endif	/* CONFIG_NETFILTER */
6088 
nlmsg_sock_has_extended_perms(struct sock * sk,u32 perms,u16 nlmsg_type)6089 static int nlmsg_sock_has_extended_perms(struct sock *sk, u32 perms, u16 nlmsg_type)
6090 {
6091 	struct sk_security_struct *sksec = sk->sk_security;
6092 	struct common_audit_data ad;
6093 	u8 driver;
6094 	u8 xperm;
6095 
6096 	if (sock_skip_has_perm(sksec->sid))
6097 		return 0;
6098 
6099 	ad.type = LSM_AUDIT_DATA_NLMSGTYPE;
6100 	ad.u.nlmsg_type = nlmsg_type;
6101 
6102 	driver = nlmsg_type >> 8;
6103 	xperm = nlmsg_type & 0xff;
6104 
6105 	return avc_has_extended_perms(current_sid(), sksec->sid, sksec->sclass,
6106 				      perms, driver, AVC_EXT_NLMSG, xperm, &ad);
6107 }
6108 
selinux_netlink_send(struct sock * sk,struct sk_buff * skb)6109 static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb)
6110 {
6111 	int rc = 0;
6112 	unsigned int msg_len;
6113 	unsigned int data_len = skb->len;
6114 	unsigned char *data = skb->data;
6115 	struct nlmsghdr *nlh;
6116 	struct sk_security_struct *sksec = selinux_sock(sk);
6117 	u16 sclass = sksec->sclass;
6118 	u32 perm;
6119 
6120 	while (data_len >= nlmsg_total_size(0)) {
6121 		nlh = (struct nlmsghdr *)data;
6122 
6123 		/* NOTE: the nlmsg_len field isn't reliably set by some netlink
6124 		 *       users which means we can't reject skb's with bogus
6125 		 *       length fields; our solution is to follow what
6126 		 *       netlink_rcv_skb() does and simply skip processing at
6127 		 *       messages with length fields that are clearly junk
6128 		 */
6129 		if (nlh->nlmsg_len < NLMSG_HDRLEN || nlh->nlmsg_len > data_len)
6130 			return 0;
6131 
6132 		rc = selinux_nlmsg_lookup(sclass, nlh->nlmsg_type, &perm);
6133 		if (rc == 0) {
6134 			if (selinux_policycap_netlink_xperm()) {
6135 				rc = nlmsg_sock_has_extended_perms(
6136 					sk, perm, nlh->nlmsg_type);
6137 			} else {
6138 				rc = sock_has_perm(sk, perm);
6139 			}
6140 			if (rc)
6141 				return rc;
6142 		} else if (rc == -EINVAL) {
6143 			/* -EINVAL is a missing msg/perm mapping */
6144 			pr_warn_ratelimited("SELinux: unrecognized netlink"
6145 				" message: protocol=%hu nlmsg_type=%hu sclass=%s"
6146 				" pid=%d comm=%s\n",
6147 				sk->sk_protocol, nlh->nlmsg_type,
6148 				secclass_map[sclass - 1].name,
6149 				task_pid_nr(current), current->comm);
6150 			if (enforcing_enabled() &&
6151 			    !security_get_allow_unknown())
6152 				return rc;
6153 			rc = 0;
6154 		} else if (rc == -ENOENT) {
6155 			/* -ENOENT is a missing socket/class mapping, ignore */
6156 			rc = 0;
6157 		} else {
6158 			return rc;
6159 		}
6160 
6161 		/* move to the next message after applying netlink padding */
6162 		msg_len = NLMSG_ALIGN(nlh->nlmsg_len);
6163 		if (msg_len >= data_len)
6164 			return 0;
6165 		data_len -= msg_len;
6166 		data += msg_len;
6167 	}
6168 
6169 	return rc;
6170 }
6171 
ipc_init_security(struct ipc_security_struct * isec,u16 sclass)6172 static void ipc_init_security(struct ipc_security_struct *isec, u16 sclass)
6173 {
6174 	isec->sclass = sclass;
6175 	isec->sid = current_sid();
6176 }
6177 
ipc_has_perm(struct kern_ipc_perm * ipc_perms,u32 perms)6178 static int ipc_has_perm(struct kern_ipc_perm *ipc_perms,
6179 			u32 perms)
6180 {
6181 	struct ipc_security_struct *isec;
6182 	struct common_audit_data ad;
6183 	u32 sid = current_sid();
6184 
6185 	isec = selinux_ipc(ipc_perms);
6186 
6187 	ad.type = LSM_AUDIT_DATA_IPC;
6188 	ad.u.ipc_id = ipc_perms->key;
6189 
6190 	return avc_has_perm(sid, isec->sid, isec->sclass, perms, &ad);
6191 }
6192 
selinux_msg_msg_alloc_security(struct msg_msg * msg)6193 static int selinux_msg_msg_alloc_security(struct msg_msg *msg)
6194 {
6195 	struct msg_security_struct *msec;
6196 
6197 	msec = selinux_msg_msg(msg);
6198 	msec->sid = SECINITSID_UNLABELED;
6199 
6200 	return 0;
6201 }
6202 
6203 /* message queue security operations */
selinux_msg_queue_alloc_security(struct kern_ipc_perm * msq)6204 static int selinux_msg_queue_alloc_security(struct kern_ipc_perm *msq)
6205 {
6206 	struct ipc_security_struct *isec;
6207 	struct common_audit_data ad;
6208 	u32 sid = current_sid();
6209 
6210 	isec = selinux_ipc(msq);
6211 	ipc_init_security(isec, SECCLASS_MSGQ);
6212 
6213 	ad.type = LSM_AUDIT_DATA_IPC;
6214 	ad.u.ipc_id = msq->key;
6215 
6216 	return avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
6217 			    MSGQ__CREATE, &ad);
6218 }
6219 
selinux_msg_queue_associate(struct kern_ipc_perm * msq,int msqflg)6220 static int selinux_msg_queue_associate(struct kern_ipc_perm *msq, int msqflg)
6221 {
6222 	struct ipc_security_struct *isec;
6223 	struct common_audit_data ad;
6224 	u32 sid = current_sid();
6225 
6226 	isec = selinux_ipc(msq);
6227 
6228 	ad.type = LSM_AUDIT_DATA_IPC;
6229 	ad.u.ipc_id = msq->key;
6230 
6231 	return avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
6232 			    MSGQ__ASSOCIATE, &ad);
6233 }
6234 
selinux_msg_queue_msgctl(struct kern_ipc_perm * msq,int cmd)6235 static int selinux_msg_queue_msgctl(struct kern_ipc_perm *msq, int cmd)
6236 {
6237 	u32 perms;
6238 
6239 	switch (cmd) {
6240 	case IPC_INFO:
6241 	case MSG_INFO:
6242 		/* No specific object, just general system-wide information. */
6243 		return avc_has_perm(current_sid(), SECINITSID_KERNEL,
6244 				    SECCLASS_SYSTEM, SYSTEM__IPC_INFO, NULL);
6245 	case IPC_STAT:
6246 	case MSG_STAT:
6247 	case MSG_STAT_ANY:
6248 		perms = MSGQ__GETATTR | MSGQ__ASSOCIATE;
6249 		break;
6250 	case IPC_SET:
6251 		perms = MSGQ__SETATTR;
6252 		break;
6253 	case IPC_RMID:
6254 		perms = MSGQ__DESTROY;
6255 		break;
6256 	default:
6257 		return 0;
6258 	}
6259 
6260 	return ipc_has_perm(msq, perms);
6261 }
6262 
selinux_msg_queue_msgsnd(struct kern_ipc_perm * msq,struct msg_msg * msg,int msqflg)6263 static int selinux_msg_queue_msgsnd(struct kern_ipc_perm *msq, struct msg_msg *msg, int msqflg)
6264 {
6265 	struct ipc_security_struct *isec;
6266 	struct msg_security_struct *msec;
6267 	struct common_audit_data ad;
6268 	u32 sid = current_sid();
6269 	int rc;
6270 
6271 	isec = selinux_ipc(msq);
6272 	msec = selinux_msg_msg(msg);
6273 
6274 	/*
6275 	 * First time through, need to assign label to the message
6276 	 */
6277 	if (msec->sid == SECINITSID_UNLABELED) {
6278 		/*
6279 		 * Compute new sid based on current process and
6280 		 * message queue this message will be stored in
6281 		 */
6282 		rc = security_transition_sid(sid, isec->sid,
6283 					     SECCLASS_MSG, NULL, &msec->sid);
6284 		if (rc)
6285 			return rc;
6286 	}
6287 
6288 	ad.type = LSM_AUDIT_DATA_IPC;
6289 	ad.u.ipc_id = msq->key;
6290 
6291 	/* Can this process write to the queue? */
6292 	rc = avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
6293 			  MSGQ__WRITE, &ad);
6294 	if (!rc)
6295 		/* Can this process send the message */
6296 		rc = avc_has_perm(sid, msec->sid, SECCLASS_MSG,
6297 				  MSG__SEND, &ad);
6298 	if (!rc)
6299 		/* Can the message be put in the queue? */
6300 		rc = avc_has_perm(msec->sid, isec->sid, SECCLASS_MSGQ,
6301 				  MSGQ__ENQUEUE, &ad);
6302 
6303 	return rc;
6304 }
6305 
selinux_msg_queue_msgrcv(struct kern_ipc_perm * msq,struct msg_msg * msg,struct task_struct * target,long type,int mode)6306 static int selinux_msg_queue_msgrcv(struct kern_ipc_perm *msq, struct msg_msg *msg,
6307 				    struct task_struct *target,
6308 				    long type, int mode)
6309 {
6310 	struct ipc_security_struct *isec;
6311 	struct msg_security_struct *msec;
6312 	struct common_audit_data ad;
6313 	u32 sid = task_sid_obj(target);
6314 	int rc;
6315 
6316 	isec = selinux_ipc(msq);
6317 	msec = selinux_msg_msg(msg);
6318 
6319 	ad.type = LSM_AUDIT_DATA_IPC;
6320 	ad.u.ipc_id = msq->key;
6321 
6322 	rc = avc_has_perm(sid, isec->sid,
6323 			  SECCLASS_MSGQ, MSGQ__READ, &ad);
6324 	if (!rc)
6325 		rc = avc_has_perm(sid, msec->sid,
6326 				  SECCLASS_MSG, MSG__RECEIVE, &ad);
6327 	return rc;
6328 }
6329 
6330 /* Shared Memory security operations */
selinux_shm_alloc_security(struct kern_ipc_perm * shp)6331 static int selinux_shm_alloc_security(struct kern_ipc_perm *shp)
6332 {
6333 	struct ipc_security_struct *isec;
6334 	struct common_audit_data ad;
6335 	u32 sid = current_sid();
6336 
6337 	isec = selinux_ipc(shp);
6338 	ipc_init_security(isec, SECCLASS_SHM);
6339 
6340 	ad.type = LSM_AUDIT_DATA_IPC;
6341 	ad.u.ipc_id = shp->key;
6342 
6343 	return avc_has_perm(sid, isec->sid, SECCLASS_SHM,
6344 			    SHM__CREATE, &ad);
6345 }
6346 
selinux_shm_associate(struct kern_ipc_perm * shp,int shmflg)6347 static int selinux_shm_associate(struct kern_ipc_perm *shp, int shmflg)
6348 {
6349 	struct ipc_security_struct *isec;
6350 	struct common_audit_data ad;
6351 	u32 sid = current_sid();
6352 
6353 	isec = selinux_ipc(shp);
6354 
6355 	ad.type = LSM_AUDIT_DATA_IPC;
6356 	ad.u.ipc_id = shp->key;
6357 
6358 	return avc_has_perm(sid, isec->sid, SECCLASS_SHM,
6359 			    SHM__ASSOCIATE, &ad);
6360 }
6361 
6362 /* Note, at this point, shp is locked down */
selinux_shm_shmctl(struct kern_ipc_perm * shp,int cmd)6363 static int selinux_shm_shmctl(struct kern_ipc_perm *shp, int cmd)
6364 {
6365 	u32 perms;
6366 
6367 	switch (cmd) {
6368 	case IPC_INFO:
6369 	case SHM_INFO:
6370 		/* No specific object, just general system-wide information. */
6371 		return avc_has_perm(current_sid(), SECINITSID_KERNEL,
6372 				    SECCLASS_SYSTEM, SYSTEM__IPC_INFO, NULL);
6373 	case IPC_STAT:
6374 	case SHM_STAT:
6375 	case SHM_STAT_ANY:
6376 		perms = SHM__GETATTR | SHM__ASSOCIATE;
6377 		break;
6378 	case IPC_SET:
6379 		perms = SHM__SETATTR;
6380 		break;
6381 	case SHM_LOCK:
6382 	case SHM_UNLOCK:
6383 		perms = SHM__LOCK;
6384 		break;
6385 	case IPC_RMID:
6386 		perms = SHM__DESTROY;
6387 		break;
6388 	default:
6389 		return 0;
6390 	}
6391 
6392 	return ipc_has_perm(shp, perms);
6393 }
6394 
selinux_shm_shmat(struct kern_ipc_perm * shp,char __user * shmaddr,int shmflg)6395 static int selinux_shm_shmat(struct kern_ipc_perm *shp,
6396 			     char __user *shmaddr, int shmflg)
6397 {
6398 	u32 perms;
6399 
6400 	if (shmflg & SHM_RDONLY)
6401 		perms = SHM__READ;
6402 	else
6403 		perms = SHM__READ | SHM__WRITE;
6404 
6405 	return ipc_has_perm(shp, perms);
6406 }
6407 
6408 /* Semaphore security operations */
selinux_sem_alloc_security(struct kern_ipc_perm * sma)6409 static int selinux_sem_alloc_security(struct kern_ipc_perm *sma)
6410 {
6411 	struct ipc_security_struct *isec;
6412 	struct common_audit_data ad;
6413 	u32 sid = current_sid();
6414 
6415 	isec = selinux_ipc(sma);
6416 	ipc_init_security(isec, SECCLASS_SEM);
6417 
6418 	ad.type = LSM_AUDIT_DATA_IPC;
6419 	ad.u.ipc_id = sma->key;
6420 
6421 	return avc_has_perm(sid, isec->sid, SECCLASS_SEM,
6422 			    SEM__CREATE, &ad);
6423 }
6424 
selinux_sem_associate(struct kern_ipc_perm * sma,int semflg)6425 static int selinux_sem_associate(struct kern_ipc_perm *sma, int semflg)
6426 {
6427 	struct ipc_security_struct *isec;
6428 	struct common_audit_data ad;
6429 	u32 sid = current_sid();
6430 
6431 	isec = selinux_ipc(sma);
6432 
6433 	ad.type = LSM_AUDIT_DATA_IPC;
6434 	ad.u.ipc_id = sma->key;
6435 
6436 	return avc_has_perm(sid, isec->sid, SECCLASS_SEM,
6437 			    SEM__ASSOCIATE, &ad);
6438 }
6439 
6440 /* Note, at this point, sma is locked down */
selinux_sem_semctl(struct kern_ipc_perm * sma,int cmd)6441 static int selinux_sem_semctl(struct kern_ipc_perm *sma, int cmd)
6442 {
6443 	int err;
6444 	u32 perms;
6445 
6446 	switch (cmd) {
6447 	case IPC_INFO:
6448 	case SEM_INFO:
6449 		/* No specific object, just general system-wide information. */
6450 		return avc_has_perm(current_sid(), SECINITSID_KERNEL,
6451 				    SECCLASS_SYSTEM, SYSTEM__IPC_INFO, NULL);
6452 	case GETPID:
6453 	case GETNCNT:
6454 	case GETZCNT:
6455 		perms = SEM__GETATTR;
6456 		break;
6457 	case GETVAL:
6458 	case GETALL:
6459 		perms = SEM__READ;
6460 		break;
6461 	case SETVAL:
6462 	case SETALL:
6463 		perms = SEM__WRITE;
6464 		break;
6465 	case IPC_RMID:
6466 		perms = SEM__DESTROY;
6467 		break;
6468 	case IPC_SET:
6469 		perms = SEM__SETATTR;
6470 		break;
6471 	case IPC_STAT:
6472 	case SEM_STAT:
6473 	case SEM_STAT_ANY:
6474 		perms = SEM__GETATTR | SEM__ASSOCIATE;
6475 		break;
6476 	default:
6477 		return 0;
6478 	}
6479 
6480 	err = ipc_has_perm(sma, perms);
6481 	return err;
6482 }
6483 
selinux_sem_semop(struct kern_ipc_perm * sma,struct sembuf * sops,unsigned nsops,int alter)6484 static int selinux_sem_semop(struct kern_ipc_perm *sma,
6485 			     struct sembuf *sops, unsigned nsops, int alter)
6486 {
6487 	u32 perms;
6488 
6489 	if (alter)
6490 		perms = SEM__READ | SEM__WRITE;
6491 	else
6492 		perms = SEM__READ;
6493 
6494 	return ipc_has_perm(sma, perms);
6495 }
6496 
selinux_ipc_permission(struct kern_ipc_perm * ipcp,short flag)6497 static int selinux_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
6498 {
6499 	u32 av = 0;
6500 
6501 	av = 0;
6502 	if (flag & S_IRUGO)
6503 		av |= IPC__UNIX_READ;
6504 	if (flag & S_IWUGO)
6505 		av |= IPC__UNIX_WRITE;
6506 
6507 	if (av == 0)
6508 		return 0;
6509 
6510 	return ipc_has_perm(ipcp, av);
6511 }
6512 
selinux_ipc_getlsmprop(struct kern_ipc_perm * ipcp,struct lsm_prop * prop)6513 static void selinux_ipc_getlsmprop(struct kern_ipc_perm *ipcp,
6514 				   struct lsm_prop *prop)
6515 {
6516 	struct ipc_security_struct *isec = selinux_ipc(ipcp);
6517 	prop->selinux.secid = isec->sid;
6518 }
6519 
selinux_d_instantiate(struct dentry * dentry,struct inode * inode)6520 static void selinux_d_instantiate(struct dentry *dentry, struct inode *inode)
6521 {
6522 	if (inode)
6523 		inode_doinit_with_dentry(inode, dentry);
6524 }
6525 
selinux_lsm_getattr(unsigned int attr,struct task_struct * p,char ** value)6526 static int selinux_lsm_getattr(unsigned int attr, struct task_struct *p,
6527 			       char **value)
6528 {
6529 	const struct task_security_struct *tsec;
6530 	int error;
6531 	u32 sid;
6532 	u32 len;
6533 
6534 	rcu_read_lock();
6535 	tsec = selinux_cred(__task_cred(p));
6536 	if (p != current) {
6537 		error = avc_has_perm(current_sid(), tsec->sid,
6538 				     SECCLASS_PROCESS, PROCESS__GETATTR, NULL);
6539 		if (error)
6540 			goto err_unlock;
6541 	}
6542 	switch (attr) {
6543 	case LSM_ATTR_CURRENT:
6544 		sid = tsec->sid;
6545 		break;
6546 	case LSM_ATTR_PREV:
6547 		sid = tsec->osid;
6548 		break;
6549 	case LSM_ATTR_EXEC:
6550 		sid = tsec->exec_sid;
6551 		break;
6552 	case LSM_ATTR_FSCREATE:
6553 		sid = tsec->create_sid;
6554 		break;
6555 	case LSM_ATTR_KEYCREATE:
6556 		sid = tsec->keycreate_sid;
6557 		break;
6558 	case LSM_ATTR_SOCKCREATE:
6559 		sid = tsec->sockcreate_sid;
6560 		break;
6561 	default:
6562 		error = -EOPNOTSUPP;
6563 		goto err_unlock;
6564 	}
6565 	rcu_read_unlock();
6566 
6567 	if (sid == SECSID_NULL) {
6568 		*value = NULL;
6569 		return 0;
6570 	}
6571 
6572 	error = security_sid_to_context(sid, value, &len);
6573 	if (error)
6574 		return error;
6575 	return len;
6576 
6577 err_unlock:
6578 	rcu_read_unlock();
6579 	return error;
6580 }
6581 
selinux_lsm_setattr(u64 attr,void * value,size_t size)6582 static int selinux_lsm_setattr(u64 attr, void *value, size_t size)
6583 {
6584 	struct task_security_struct *tsec;
6585 	struct cred *new;
6586 	u32 mysid = current_sid(), sid = 0, ptsid;
6587 	int error;
6588 	char *str = value;
6589 
6590 	/*
6591 	 * Basic control over ability to set these attributes at all.
6592 	 */
6593 	switch (attr) {
6594 	case LSM_ATTR_EXEC:
6595 		error = avc_has_perm(mysid, mysid, SECCLASS_PROCESS,
6596 				     PROCESS__SETEXEC, NULL);
6597 		break;
6598 	case LSM_ATTR_FSCREATE:
6599 		error = avc_has_perm(mysid, mysid, SECCLASS_PROCESS,
6600 				     PROCESS__SETFSCREATE, NULL);
6601 		break;
6602 	case LSM_ATTR_KEYCREATE:
6603 		error = avc_has_perm(mysid, mysid, SECCLASS_PROCESS,
6604 				     PROCESS__SETKEYCREATE, NULL);
6605 		break;
6606 	case LSM_ATTR_SOCKCREATE:
6607 		error = avc_has_perm(mysid, mysid, SECCLASS_PROCESS,
6608 				     PROCESS__SETSOCKCREATE, NULL);
6609 		break;
6610 	case LSM_ATTR_CURRENT:
6611 		error = avc_has_perm(mysid, mysid, SECCLASS_PROCESS,
6612 				     PROCESS__SETCURRENT, NULL);
6613 		break;
6614 	default:
6615 		error = -EOPNOTSUPP;
6616 		break;
6617 	}
6618 	if (error)
6619 		return error;
6620 
6621 	/* Obtain a SID for the context, if one was specified. */
6622 	if (size && str[0] && str[0] != '\n') {
6623 		if (str[size-1] == '\n') {
6624 			str[size-1] = 0;
6625 			size--;
6626 		}
6627 		error = security_context_to_sid(value, size,
6628 						&sid, GFP_KERNEL);
6629 		if (error == -EINVAL && attr == LSM_ATTR_FSCREATE) {
6630 			if (!has_cap_mac_admin(true)) {
6631 				struct audit_buffer *ab;
6632 				size_t audit_size;
6633 
6634 				/* We strip a nul only if it is at the end,
6635 				 * otherwise the context contains a nul and
6636 				 * we should audit that */
6637 				if (str[size - 1] == '\0')
6638 					audit_size = size - 1;
6639 				else
6640 					audit_size = size;
6641 				ab = audit_log_start(audit_context(),
6642 						     GFP_ATOMIC,
6643 						     AUDIT_SELINUX_ERR);
6644 				if (!ab)
6645 					return error;
6646 				audit_log_format(ab, "op=fscreate invalid_context=");
6647 				audit_log_n_untrustedstring(ab, value,
6648 							    audit_size);
6649 				audit_log_end(ab);
6650 
6651 				return error;
6652 			}
6653 			error = security_context_to_sid_force(value, size,
6654 							&sid);
6655 		}
6656 		if (error)
6657 			return error;
6658 	}
6659 
6660 	new = prepare_creds();
6661 	if (!new)
6662 		return -ENOMEM;
6663 
6664 	/* Permission checking based on the specified context is
6665 	   performed during the actual operation (execve,
6666 	   open/mkdir/...), when we know the full context of the
6667 	   operation.  See selinux_bprm_creds_for_exec for the execve
6668 	   checks and may_create for the file creation checks. The
6669 	   operation will then fail if the context is not permitted. */
6670 	tsec = selinux_cred(new);
6671 	if (attr == LSM_ATTR_EXEC) {
6672 		tsec->exec_sid = sid;
6673 	} else if (attr == LSM_ATTR_FSCREATE) {
6674 		tsec->create_sid = sid;
6675 	} else if (attr == LSM_ATTR_KEYCREATE) {
6676 		if (sid) {
6677 			error = avc_has_perm(mysid, sid,
6678 					     SECCLASS_KEY, KEY__CREATE, NULL);
6679 			if (error)
6680 				goto abort_change;
6681 		}
6682 		tsec->keycreate_sid = sid;
6683 	} else if (attr == LSM_ATTR_SOCKCREATE) {
6684 		tsec->sockcreate_sid = sid;
6685 	} else if (attr == LSM_ATTR_CURRENT) {
6686 		error = -EINVAL;
6687 		if (sid == 0)
6688 			goto abort_change;
6689 
6690 		if (!current_is_single_threaded()) {
6691 			error = security_bounded_transition(tsec->sid, sid);
6692 			if (error)
6693 				goto abort_change;
6694 		}
6695 
6696 		/* Check permissions for the transition. */
6697 		error = avc_has_perm(tsec->sid, sid, SECCLASS_PROCESS,
6698 				     PROCESS__DYNTRANSITION, NULL);
6699 		if (error)
6700 			goto abort_change;
6701 
6702 		/* Check for ptracing, and update the task SID if ok.
6703 		   Otherwise, leave SID unchanged and fail. */
6704 		ptsid = ptrace_parent_sid();
6705 		if (ptsid != 0) {
6706 			error = avc_has_perm(ptsid, sid, SECCLASS_PROCESS,
6707 					     PROCESS__PTRACE, NULL);
6708 			if (error)
6709 				goto abort_change;
6710 		}
6711 
6712 		tsec->sid = sid;
6713 	} else {
6714 		error = -EINVAL;
6715 		goto abort_change;
6716 	}
6717 
6718 	commit_creds(new);
6719 	return size;
6720 
6721 abort_change:
6722 	abort_creds(new);
6723 	return error;
6724 }
6725 
6726 /**
6727  * selinux_getselfattr - Get SELinux current task attributes
6728  * @attr: the requested attribute
6729  * @ctx: buffer to receive the result
6730  * @size: buffer size (input), buffer size used (output)
6731  * @flags: unused
6732  *
6733  * Fill the passed user space @ctx with the details of the requested
6734  * attribute.
6735  *
6736  * Returns the number of attributes on success, an error code otherwise.
6737  * There will only ever be one attribute.
6738  */
selinux_getselfattr(unsigned int attr,struct lsm_ctx __user * ctx,u32 * size,u32 flags)6739 static int selinux_getselfattr(unsigned int attr, struct lsm_ctx __user *ctx,
6740 			       u32 *size, u32 flags)
6741 {
6742 	int rc;
6743 	char *val = NULL;
6744 	int val_len;
6745 
6746 	val_len = selinux_lsm_getattr(attr, current, &val);
6747 	if (val_len < 0)
6748 		return val_len;
6749 	rc = lsm_fill_user_ctx(ctx, size, val, val_len, LSM_ID_SELINUX, 0);
6750 	kfree(val);
6751 	return (!rc ? 1 : rc);
6752 }
6753 
selinux_setselfattr(unsigned int attr,struct lsm_ctx * ctx,u32 size,u32 flags)6754 static int selinux_setselfattr(unsigned int attr, struct lsm_ctx *ctx,
6755 			       u32 size, u32 flags)
6756 {
6757 	int rc;
6758 
6759 	rc = selinux_lsm_setattr(attr, ctx->ctx, ctx->ctx_len);
6760 	if (rc > 0)
6761 		return 0;
6762 	return rc;
6763 }
6764 
selinux_getprocattr(struct task_struct * p,const char * name,char ** value)6765 static int selinux_getprocattr(struct task_struct *p,
6766 			       const char *name, char **value)
6767 {
6768 	unsigned int attr = lsm_name_to_attr(name);
6769 	int rc;
6770 
6771 	if (attr) {
6772 		rc = selinux_lsm_getattr(attr, p, value);
6773 		if (rc != -EOPNOTSUPP)
6774 			return rc;
6775 	}
6776 
6777 	return -EINVAL;
6778 }
6779 
selinux_setprocattr(const char * name,void * value,size_t size)6780 static int selinux_setprocattr(const char *name, void *value, size_t size)
6781 {
6782 	int attr = lsm_name_to_attr(name);
6783 
6784 	if (attr)
6785 		return selinux_lsm_setattr(attr, value, size);
6786 	return -EINVAL;
6787 }
6788 
selinux_ismaclabel(const char * name)6789 static int selinux_ismaclabel(const char *name)
6790 {
6791 	return (strcmp(name, XATTR_SELINUX_SUFFIX) == 0);
6792 }
6793 
selinux_secid_to_secctx(u32 secid,struct lsm_context * cp)6794 static int selinux_secid_to_secctx(u32 secid, struct lsm_context *cp)
6795 {
6796 	u32 seclen;
6797 	int ret;
6798 
6799 	if (cp) {
6800 		cp->id = LSM_ID_SELINUX;
6801 		ret = security_sid_to_context(secid, &cp->context, &cp->len);
6802 		if (ret < 0)
6803 			return ret;
6804 		return cp->len;
6805 	}
6806 	ret = security_sid_to_context(secid, NULL, &seclen);
6807 	if (ret < 0)
6808 		return ret;
6809 	return seclen;
6810 }
6811 
selinux_lsmprop_to_secctx(struct lsm_prop * prop,struct lsm_context * cp)6812 static int selinux_lsmprop_to_secctx(struct lsm_prop *prop,
6813 				     struct lsm_context *cp)
6814 {
6815 	return selinux_secid_to_secctx(prop->selinux.secid, cp);
6816 }
6817 
selinux_secctx_to_secid(const char * secdata,u32 seclen,u32 * secid)6818 static int selinux_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid)
6819 {
6820 	return security_context_to_sid(secdata, seclen,
6821 				       secid, GFP_KERNEL);
6822 }
6823 
selinux_release_secctx(struct lsm_context * cp)6824 static void selinux_release_secctx(struct lsm_context *cp)
6825 {
6826 	if (cp->id == LSM_ID_SELINUX) {
6827 		kfree(cp->context);
6828 		cp->context = NULL;
6829 		cp->id = LSM_ID_UNDEF;
6830 	}
6831 }
6832 
selinux_inode_invalidate_secctx(struct inode * inode)6833 static void selinux_inode_invalidate_secctx(struct inode *inode)
6834 {
6835 	struct inode_security_struct *isec = selinux_inode(inode);
6836 
6837 	spin_lock(&isec->lock);
6838 	isec->initialized = LABEL_INVALID;
6839 	spin_unlock(&isec->lock);
6840 }
6841 
6842 /*
6843  *	called with inode->i_mutex locked
6844  */
selinux_inode_notifysecctx(struct inode * inode,void * ctx,u32 ctxlen)6845 static int selinux_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen)
6846 {
6847 	int rc = selinux_inode_setsecurity(inode, XATTR_SELINUX_SUFFIX,
6848 					   ctx, ctxlen, 0);
6849 	/* Do not return error when suppressing label (SBLABEL_MNT not set). */
6850 	return rc == -EOPNOTSUPP ? 0 : rc;
6851 }
6852 
6853 /*
6854  *	called with inode->i_mutex locked
6855  */
selinux_inode_setsecctx(struct dentry * dentry,void * ctx,u32 ctxlen)6856 static int selinux_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen)
6857 {
6858 	return __vfs_setxattr_locked(&nop_mnt_idmap, dentry, XATTR_NAME_SELINUX,
6859 				     ctx, ctxlen, 0, NULL);
6860 }
6861 
selinux_inode_getsecctx(struct inode * inode,struct lsm_context * cp)6862 static int selinux_inode_getsecctx(struct inode *inode, struct lsm_context *cp)
6863 {
6864 	int len;
6865 	len = selinux_inode_getsecurity(&nop_mnt_idmap, inode,
6866 					XATTR_SELINUX_SUFFIX,
6867 					(void **)&cp->context, true);
6868 	if (len < 0)
6869 		return len;
6870 	cp->len = len;
6871 	cp->id = LSM_ID_SELINUX;
6872 	return 0;
6873 }
6874 #ifdef CONFIG_KEYS
6875 
selinux_key_alloc(struct key * k,const struct cred * cred,unsigned long flags)6876 static int selinux_key_alloc(struct key *k, const struct cred *cred,
6877 			     unsigned long flags)
6878 {
6879 	const struct task_security_struct *tsec;
6880 	struct key_security_struct *ksec = selinux_key(k);
6881 
6882 	tsec = selinux_cred(cred);
6883 	if (tsec->keycreate_sid)
6884 		ksec->sid = tsec->keycreate_sid;
6885 	else
6886 		ksec->sid = tsec->sid;
6887 
6888 	return 0;
6889 }
6890 
selinux_key_permission(key_ref_t key_ref,const struct cred * cred,enum key_need_perm need_perm)6891 static int selinux_key_permission(key_ref_t key_ref,
6892 				  const struct cred *cred,
6893 				  enum key_need_perm need_perm)
6894 {
6895 	struct key *key;
6896 	struct key_security_struct *ksec;
6897 	u32 perm, sid;
6898 
6899 	switch (need_perm) {
6900 	case KEY_NEED_VIEW:
6901 		perm = KEY__VIEW;
6902 		break;
6903 	case KEY_NEED_READ:
6904 		perm = KEY__READ;
6905 		break;
6906 	case KEY_NEED_WRITE:
6907 		perm = KEY__WRITE;
6908 		break;
6909 	case KEY_NEED_SEARCH:
6910 		perm = KEY__SEARCH;
6911 		break;
6912 	case KEY_NEED_LINK:
6913 		perm = KEY__LINK;
6914 		break;
6915 	case KEY_NEED_SETATTR:
6916 		perm = KEY__SETATTR;
6917 		break;
6918 	case KEY_NEED_UNLINK:
6919 	case KEY_SYSADMIN_OVERRIDE:
6920 	case KEY_AUTHTOKEN_OVERRIDE:
6921 	case KEY_DEFER_PERM_CHECK:
6922 		return 0;
6923 	default:
6924 		WARN_ON(1);
6925 		return -EPERM;
6926 
6927 	}
6928 
6929 	sid = cred_sid(cred);
6930 	key = key_ref_to_ptr(key_ref);
6931 	ksec = selinux_key(key);
6932 
6933 	return avc_has_perm(sid, ksec->sid, SECCLASS_KEY, perm, NULL);
6934 }
6935 
selinux_key_getsecurity(struct key * key,char ** _buffer)6936 static int selinux_key_getsecurity(struct key *key, char **_buffer)
6937 {
6938 	struct key_security_struct *ksec = selinux_key(key);
6939 	char *context = NULL;
6940 	unsigned len;
6941 	int rc;
6942 
6943 	rc = security_sid_to_context(ksec->sid,
6944 				     &context, &len);
6945 	if (!rc)
6946 		rc = len;
6947 	*_buffer = context;
6948 	return rc;
6949 }
6950 
6951 #ifdef CONFIG_KEY_NOTIFICATIONS
selinux_watch_key(struct key * key)6952 static int selinux_watch_key(struct key *key)
6953 {
6954 	struct key_security_struct *ksec = selinux_key(key);
6955 	u32 sid = current_sid();
6956 
6957 	return avc_has_perm(sid, ksec->sid, SECCLASS_KEY, KEY__VIEW, NULL);
6958 }
6959 #endif
6960 #endif
6961 
6962 #ifdef CONFIG_SECURITY_INFINIBAND
selinux_ib_pkey_access(void * ib_sec,u64 subnet_prefix,u16 pkey_val)6963 static int selinux_ib_pkey_access(void *ib_sec, u64 subnet_prefix, u16 pkey_val)
6964 {
6965 	struct common_audit_data ad;
6966 	int err;
6967 	u32 sid = 0;
6968 	struct ib_security_struct *sec = ib_sec;
6969 	struct lsm_ibpkey_audit ibpkey;
6970 
6971 	err = sel_ib_pkey_sid(subnet_prefix, pkey_val, &sid);
6972 	if (err)
6973 		return err;
6974 
6975 	ad.type = LSM_AUDIT_DATA_IBPKEY;
6976 	ibpkey.subnet_prefix = subnet_prefix;
6977 	ibpkey.pkey = pkey_val;
6978 	ad.u.ibpkey = &ibpkey;
6979 	return avc_has_perm(sec->sid, sid,
6980 			    SECCLASS_INFINIBAND_PKEY,
6981 			    INFINIBAND_PKEY__ACCESS, &ad);
6982 }
6983 
selinux_ib_endport_manage_subnet(void * ib_sec,const char * dev_name,u8 port_num)6984 static int selinux_ib_endport_manage_subnet(void *ib_sec, const char *dev_name,
6985 					    u8 port_num)
6986 {
6987 	struct common_audit_data ad;
6988 	int err;
6989 	u32 sid = 0;
6990 	struct ib_security_struct *sec = ib_sec;
6991 	struct lsm_ibendport_audit ibendport;
6992 
6993 	err = security_ib_endport_sid(dev_name, port_num,
6994 				      &sid);
6995 
6996 	if (err)
6997 		return err;
6998 
6999 	ad.type = LSM_AUDIT_DATA_IBENDPORT;
7000 	ibendport.dev_name = dev_name;
7001 	ibendport.port = port_num;
7002 	ad.u.ibendport = &ibendport;
7003 	return avc_has_perm(sec->sid, sid,
7004 			    SECCLASS_INFINIBAND_ENDPORT,
7005 			    INFINIBAND_ENDPORT__MANAGE_SUBNET, &ad);
7006 }
7007 
selinux_ib_alloc_security(void * ib_sec)7008 static int selinux_ib_alloc_security(void *ib_sec)
7009 {
7010 	struct ib_security_struct *sec = selinux_ib(ib_sec);
7011 
7012 	sec->sid = current_sid();
7013 	return 0;
7014 }
7015 #endif
7016 
7017 #ifdef CONFIG_BPF_SYSCALL
selinux_bpf(int cmd,union bpf_attr * attr,unsigned int size,bool kernel)7018 static int selinux_bpf(int cmd, union bpf_attr *attr,
7019 		       unsigned int size, bool kernel)
7020 {
7021 	u32 sid = current_sid();
7022 	int ret;
7023 
7024 	switch (cmd) {
7025 	case BPF_MAP_CREATE:
7026 		ret = avc_has_perm(sid, sid, SECCLASS_BPF, BPF__MAP_CREATE,
7027 				   NULL);
7028 		break;
7029 	case BPF_PROG_LOAD:
7030 		ret = avc_has_perm(sid, sid, SECCLASS_BPF, BPF__PROG_LOAD,
7031 				   NULL);
7032 		break;
7033 	default:
7034 		ret = 0;
7035 		break;
7036 	}
7037 
7038 	return ret;
7039 }
7040 
bpf_map_fmode_to_av(fmode_t fmode)7041 static u32 bpf_map_fmode_to_av(fmode_t fmode)
7042 {
7043 	u32 av = 0;
7044 
7045 	if (fmode & FMODE_READ)
7046 		av |= BPF__MAP_READ;
7047 	if (fmode & FMODE_WRITE)
7048 		av |= BPF__MAP_WRITE;
7049 	return av;
7050 }
7051 
7052 /* This function will check the file pass through unix socket or binder to see
7053  * if it is a bpf related object. And apply corresponding checks on the bpf
7054  * object based on the type. The bpf maps and programs, not like other files and
7055  * socket, are using a shared anonymous inode inside the kernel as their inode.
7056  * So checking that inode cannot identify if the process have privilege to
7057  * access the bpf object and that's why we have to add this additional check in
7058  * selinux_file_receive and selinux_binder_transfer_files.
7059  */
bpf_fd_pass(const struct file * file,u32 sid)7060 static int bpf_fd_pass(const struct file *file, u32 sid)
7061 {
7062 	struct bpf_security_struct *bpfsec;
7063 	struct bpf_prog *prog;
7064 	struct bpf_map *map;
7065 	int ret;
7066 
7067 	if (file->f_op == &bpf_map_fops) {
7068 		map = file->private_data;
7069 		bpfsec = selinux_bpf_map_security(map);
7070 		ret = avc_has_perm(sid, bpfsec->sid, SECCLASS_BPF,
7071 				   bpf_map_fmode_to_av(file->f_mode), NULL);
7072 		if (ret)
7073 			return ret;
7074 	} else if (file->f_op == &bpf_prog_fops) {
7075 		prog = file->private_data;
7076 		bpfsec = selinux_bpf_prog_security(prog);
7077 		ret = avc_has_perm(sid, bpfsec->sid, SECCLASS_BPF,
7078 				   BPF__PROG_RUN, NULL);
7079 		if (ret)
7080 			return ret;
7081 	}
7082 	return 0;
7083 }
7084 
selinux_bpf_map(struct bpf_map * map,fmode_t fmode)7085 static int selinux_bpf_map(struct bpf_map *map, fmode_t fmode)
7086 {
7087 	u32 sid = current_sid();
7088 	struct bpf_security_struct *bpfsec;
7089 
7090 	bpfsec = selinux_bpf_map_security(map);
7091 	return avc_has_perm(sid, bpfsec->sid, SECCLASS_BPF,
7092 			    bpf_map_fmode_to_av(fmode), NULL);
7093 }
7094 
selinux_bpf_prog(struct bpf_prog * prog)7095 static int selinux_bpf_prog(struct bpf_prog *prog)
7096 {
7097 	u32 sid = current_sid();
7098 	struct bpf_security_struct *bpfsec;
7099 
7100 	bpfsec = selinux_bpf_prog_security(prog);
7101 	return avc_has_perm(sid, bpfsec->sid, SECCLASS_BPF,
7102 			    BPF__PROG_RUN, NULL);
7103 }
7104 
selinux_bpf_map_create(struct bpf_map * map,union bpf_attr * attr,struct bpf_token * token,bool kernel)7105 static int selinux_bpf_map_create(struct bpf_map *map, union bpf_attr *attr,
7106 				  struct bpf_token *token, bool kernel)
7107 {
7108 	struct bpf_security_struct *bpfsec;
7109 
7110 	bpfsec = selinux_bpf_map_security(map);
7111 	bpfsec->sid = current_sid();
7112 
7113 	return 0;
7114 }
7115 
selinux_bpf_prog_load(struct bpf_prog * prog,union bpf_attr * attr,struct bpf_token * token,bool kernel)7116 static int selinux_bpf_prog_load(struct bpf_prog *prog, union bpf_attr *attr,
7117 				 struct bpf_token *token, bool kernel)
7118 {
7119 	struct bpf_security_struct *bpfsec;
7120 
7121 	bpfsec = selinux_bpf_prog_security(prog);
7122 	bpfsec->sid = current_sid();
7123 
7124 	return 0;
7125 }
7126 
selinux_bpf_token_create(struct bpf_token * token,union bpf_attr * attr,const struct path * path)7127 static int selinux_bpf_token_create(struct bpf_token *token, union bpf_attr *attr,
7128 				    const struct path *path)
7129 {
7130 	struct bpf_security_struct *bpfsec;
7131 
7132 	bpfsec = selinux_bpf_token_security(token);
7133 	bpfsec->sid = current_sid();
7134 
7135 	return 0;
7136 }
7137 #endif
7138 
7139 struct lsm_blob_sizes selinux_blob_sizes __ro_after_init = {
7140 	.lbs_cred = sizeof(struct task_security_struct),
7141 	.lbs_file = sizeof(struct file_security_struct),
7142 	.lbs_inode = sizeof(struct inode_security_struct),
7143 	.lbs_ipc = sizeof(struct ipc_security_struct),
7144 	.lbs_key = sizeof(struct key_security_struct),
7145 	.lbs_msg_msg = sizeof(struct msg_security_struct),
7146 #ifdef CONFIG_PERF_EVENTS
7147 	.lbs_perf_event = sizeof(struct perf_event_security_struct),
7148 #endif
7149 	.lbs_sock = sizeof(struct sk_security_struct),
7150 	.lbs_superblock = sizeof(struct superblock_security_struct),
7151 	.lbs_xattr_count = SELINUX_INODE_INIT_XATTRS,
7152 	.lbs_tun_dev = sizeof(struct tun_security_struct),
7153 	.lbs_ib = sizeof(struct ib_security_struct),
7154 	.lbs_bpf_map = sizeof(struct bpf_security_struct),
7155 	.lbs_bpf_prog = sizeof(struct bpf_security_struct),
7156 	.lbs_bpf_token = sizeof(struct bpf_security_struct),
7157 };
7158 
7159 #ifdef CONFIG_PERF_EVENTS
selinux_perf_event_open(int type)7160 static int selinux_perf_event_open(int type)
7161 {
7162 	u32 requested, sid = current_sid();
7163 
7164 	if (type == PERF_SECURITY_OPEN)
7165 		requested = PERF_EVENT__OPEN;
7166 	else if (type == PERF_SECURITY_CPU)
7167 		requested = PERF_EVENT__CPU;
7168 	else if (type == PERF_SECURITY_KERNEL)
7169 		requested = PERF_EVENT__KERNEL;
7170 	else if (type == PERF_SECURITY_TRACEPOINT)
7171 		requested = PERF_EVENT__TRACEPOINT;
7172 	else
7173 		return -EINVAL;
7174 
7175 	return avc_has_perm(sid, sid, SECCLASS_PERF_EVENT,
7176 			    requested, NULL);
7177 }
7178 
selinux_perf_event_alloc(struct perf_event * event)7179 static int selinux_perf_event_alloc(struct perf_event *event)
7180 {
7181 	struct perf_event_security_struct *perfsec;
7182 
7183 	perfsec = selinux_perf_event(event->security);
7184 	perfsec->sid = current_sid();
7185 
7186 	return 0;
7187 }
7188 
selinux_perf_event_read(struct perf_event * event)7189 static int selinux_perf_event_read(struct perf_event *event)
7190 {
7191 	struct perf_event_security_struct *perfsec = event->security;
7192 	u32 sid = current_sid();
7193 
7194 	return avc_has_perm(sid, perfsec->sid,
7195 			    SECCLASS_PERF_EVENT, PERF_EVENT__READ, NULL);
7196 }
7197 
selinux_perf_event_write(struct perf_event * event)7198 static int selinux_perf_event_write(struct perf_event *event)
7199 {
7200 	struct perf_event_security_struct *perfsec = event->security;
7201 	u32 sid = current_sid();
7202 
7203 	return avc_has_perm(sid, perfsec->sid,
7204 			    SECCLASS_PERF_EVENT, PERF_EVENT__WRITE, NULL);
7205 }
7206 #endif
7207 
7208 #ifdef CONFIG_IO_URING
7209 /**
7210  * selinux_uring_override_creds - check the requested cred override
7211  * @new: the target creds
7212  *
7213  * Check to see if the current task is allowed to override it's credentials
7214  * to service an io_uring operation.
7215  */
selinux_uring_override_creds(const struct cred * new)7216 static int selinux_uring_override_creds(const struct cred *new)
7217 {
7218 	return avc_has_perm(current_sid(), cred_sid(new),
7219 			    SECCLASS_IO_URING, IO_URING__OVERRIDE_CREDS, NULL);
7220 }
7221 
7222 /**
7223  * selinux_uring_sqpoll - check if a io_uring polling thread can be created
7224  *
7225  * Check to see if the current task is allowed to create a new io_uring
7226  * kernel polling thread.
7227  */
selinux_uring_sqpoll(void)7228 static int selinux_uring_sqpoll(void)
7229 {
7230 	u32 sid = current_sid();
7231 
7232 	return avc_has_perm(sid, sid,
7233 			    SECCLASS_IO_URING, IO_URING__SQPOLL, NULL);
7234 }
7235 
7236 /**
7237  * selinux_uring_cmd - check if IORING_OP_URING_CMD is allowed
7238  * @ioucmd: the io_uring command structure
7239  *
7240  * Check to see if the current domain is allowed to execute an
7241  * IORING_OP_URING_CMD against the device/file specified in @ioucmd.
7242  *
7243  */
selinux_uring_cmd(struct io_uring_cmd * ioucmd)7244 static int selinux_uring_cmd(struct io_uring_cmd *ioucmd)
7245 {
7246 	struct file *file = ioucmd->file;
7247 	struct inode *inode = file_inode(file);
7248 	struct inode_security_struct *isec = selinux_inode(inode);
7249 	struct common_audit_data ad;
7250 
7251 	ad.type = LSM_AUDIT_DATA_FILE;
7252 	ad.u.file = file;
7253 
7254 	return avc_has_perm(current_sid(), isec->sid,
7255 			    SECCLASS_IO_URING, IO_URING__CMD, &ad);
7256 }
7257 
7258 /**
7259  * selinux_uring_allowed - check if io_uring_setup() can be called
7260  *
7261  * Check to see if the current task is allowed to call io_uring_setup().
7262  */
selinux_uring_allowed(void)7263 static int selinux_uring_allowed(void)
7264 {
7265 	u32 sid = current_sid();
7266 
7267 	return avc_has_perm(sid, sid, SECCLASS_IO_URING, IO_URING__ALLOWED,
7268 			    NULL);
7269 }
7270 #endif /* CONFIG_IO_URING */
7271 
7272 static const struct lsm_id selinux_lsmid = {
7273 	.name = "selinux",
7274 	.id = LSM_ID_SELINUX,
7275 };
7276 
7277 /*
7278  * IMPORTANT NOTE: When adding new hooks, please be careful to keep this order:
7279  * 1. any hooks that don't belong to (2.) or (3.) below,
7280  * 2. hooks that both access structures allocated by other hooks, and allocate
7281  *    structures that can be later accessed by other hooks (mostly "cloning"
7282  *    hooks),
7283  * 3. hooks that only allocate structures that can be later accessed by other
7284  *    hooks ("allocating" hooks).
7285  *
7286  * Please follow block comment delimiters in the list to keep this order.
7287  */
7288 static struct security_hook_list selinux_hooks[] __ro_after_init = {
7289 	LSM_HOOK_INIT(binder_set_context_mgr, selinux_binder_set_context_mgr),
7290 	LSM_HOOK_INIT(binder_transaction, selinux_binder_transaction),
7291 	LSM_HOOK_INIT(binder_transfer_binder, selinux_binder_transfer_binder),
7292 	LSM_HOOK_INIT(binder_transfer_file, selinux_binder_transfer_file),
7293 
7294 	LSM_HOOK_INIT(ptrace_access_check, selinux_ptrace_access_check),
7295 	LSM_HOOK_INIT(ptrace_traceme, selinux_ptrace_traceme),
7296 	LSM_HOOK_INIT(capget, selinux_capget),
7297 	LSM_HOOK_INIT(capset, selinux_capset),
7298 	LSM_HOOK_INIT(capable, selinux_capable),
7299 	LSM_HOOK_INIT(quotactl, selinux_quotactl),
7300 	LSM_HOOK_INIT(quota_on, selinux_quota_on),
7301 	LSM_HOOK_INIT(syslog, selinux_syslog),
7302 	LSM_HOOK_INIT(vm_enough_memory, selinux_vm_enough_memory),
7303 
7304 	LSM_HOOK_INIT(netlink_send, selinux_netlink_send),
7305 
7306 	LSM_HOOK_INIT(bprm_creds_for_exec, selinux_bprm_creds_for_exec),
7307 	LSM_HOOK_INIT(bprm_committing_creds, selinux_bprm_committing_creds),
7308 	LSM_HOOK_INIT(bprm_committed_creds, selinux_bprm_committed_creds),
7309 
7310 	LSM_HOOK_INIT(sb_free_mnt_opts, selinux_free_mnt_opts),
7311 	LSM_HOOK_INIT(sb_mnt_opts_compat, selinux_sb_mnt_opts_compat),
7312 	LSM_HOOK_INIT(sb_remount, selinux_sb_remount),
7313 	LSM_HOOK_INIT(sb_kern_mount, selinux_sb_kern_mount),
7314 	LSM_HOOK_INIT(sb_show_options, selinux_sb_show_options),
7315 	LSM_HOOK_INIT(sb_statfs, selinux_sb_statfs),
7316 	LSM_HOOK_INIT(sb_mount, selinux_mount),
7317 	LSM_HOOK_INIT(sb_umount, selinux_umount),
7318 	LSM_HOOK_INIT(sb_set_mnt_opts, selinux_set_mnt_opts),
7319 	LSM_HOOK_INIT(sb_clone_mnt_opts, selinux_sb_clone_mnt_opts),
7320 
7321 	LSM_HOOK_INIT(move_mount, selinux_move_mount),
7322 
7323 	LSM_HOOK_INIT(dentry_init_security, selinux_dentry_init_security),
7324 	LSM_HOOK_INIT(dentry_create_files_as, selinux_dentry_create_files_as),
7325 
7326 	LSM_HOOK_INIT(inode_free_security, selinux_inode_free_security),
7327 	LSM_HOOK_INIT(inode_init_security, selinux_inode_init_security),
7328 	LSM_HOOK_INIT(inode_init_security_anon, selinux_inode_init_security_anon),
7329 	LSM_HOOK_INIT(inode_create, selinux_inode_create),
7330 	LSM_HOOK_INIT(inode_link, selinux_inode_link),
7331 	LSM_HOOK_INIT(inode_unlink, selinux_inode_unlink),
7332 	LSM_HOOK_INIT(inode_symlink, selinux_inode_symlink),
7333 	LSM_HOOK_INIT(inode_mkdir, selinux_inode_mkdir),
7334 	LSM_HOOK_INIT(inode_rmdir, selinux_inode_rmdir),
7335 	LSM_HOOK_INIT(inode_mknod, selinux_inode_mknod),
7336 	LSM_HOOK_INIT(inode_rename, selinux_inode_rename),
7337 	LSM_HOOK_INIT(inode_readlink, selinux_inode_readlink),
7338 	LSM_HOOK_INIT(inode_follow_link, selinux_inode_follow_link),
7339 	LSM_HOOK_INIT(inode_permission, selinux_inode_permission),
7340 	LSM_HOOK_INIT(inode_setattr, selinux_inode_setattr),
7341 	LSM_HOOK_INIT(inode_getattr, selinux_inode_getattr),
7342 	LSM_HOOK_INIT(inode_xattr_skipcap, selinux_inode_xattr_skipcap),
7343 	LSM_HOOK_INIT(inode_setxattr, selinux_inode_setxattr),
7344 	LSM_HOOK_INIT(inode_post_setxattr, selinux_inode_post_setxattr),
7345 	LSM_HOOK_INIT(inode_getxattr, selinux_inode_getxattr),
7346 	LSM_HOOK_INIT(inode_listxattr, selinux_inode_listxattr),
7347 	LSM_HOOK_INIT(inode_removexattr, selinux_inode_removexattr),
7348 	LSM_HOOK_INIT(inode_file_getattr, selinux_inode_file_getattr),
7349 	LSM_HOOK_INIT(inode_file_setattr, selinux_inode_file_setattr),
7350 	LSM_HOOK_INIT(inode_set_acl, selinux_inode_set_acl),
7351 	LSM_HOOK_INIT(inode_get_acl, selinux_inode_get_acl),
7352 	LSM_HOOK_INIT(inode_remove_acl, selinux_inode_remove_acl),
7353 	LSM_HOOK_INIT(inode_getsecurity, selinux_inode_getsecurity),
7354 	LSM_HOOK_INIT(inode_setsecurity, selinux_inode_setsecurity),
7355 	LSM_HOOK_INIT(inode_listsecurity, selinux_inode_listsecurity),
7356 	LSM_HOOK_INIT(inode_getlsmprop, selinux_inode_getlsmprop),
7357 	LSM_HOOK_INIT(inode_copy_up, selinux_inode_copy_up),
7358 	LSM_HOOK_INIT(inode_copy_up_xattr, selinux_inode_copy_up_xattr),
7359 	LSM_HOOK_INIT(path_notify, selinux_path_notify),
7360 
7361 	LSM_HOOK_INIT(kernfs_init_security, selinux_kernfs_init_security),
7362 
7363 	LSM_HOOK_INIT(file_permission, selinux_file_permission),
7364 	LSM_HOOK_INIT(file_alloc_security, selinux_file_alloc_security),
7365 	LSM_HOOK_INIT(file_ioctl, selinux_file_ioctl),
7366 	LSM_HOOK_INIT(file_ioctl_compat, selinux_file_ioctl_compat),
7367 	LSM_HOOK_INIT(mmap_file, selinux_mmap_file),
7368 	LSM_HOOK_INIT(mmap_addr, selinux_mmap_addr),
7369 	LSM_HOOK_INIT(file_mprotect, selinux_file_mprotect),
7370 	LSM_HOOK_INIT(file_lock, selinux_file_lock),
7371 	LSM_HOOK_INIT(file_fcntl, selinux_file_fcntl),
7372 	LSM_HOOK_INIT(file_set_fowner, selinux_file_set_fowner),
7373 	LSM_HOOK_INIT(file_send_sigiotask, selinux_file_send_sigiotask),
7374 	LSM_HOOK_INIT(file_receive, selinux_file_receive),
7375 
7376 	LSM_HOOK_INIT(file_open, selinux_file_open),
7377 
7378 	LSM_HOOK_INIT(task_alloc, selinux_task_alloc),
7379 	LSM_HOOK_INIT(cred_prepare, selinux_cred_prepare),
7380 	LSM_HOOK_INIT(cred_transfer, selinux_cred_transfer),
7381 	LSM_HOOK_INIT(cred_getsecid, selinux_cred_getsecid),
7382 	LSM_HOOK_INIT(cred_getlsmprop, selinux_cred_getlsmprop),
7383 	LSM_HOOK_INIT(kernel_act_as, selinux_kernel_act_as),
7384 	LSM_HOOK_INIT(kernel_create_files_as, selinux_kernel_create_files_as),
7385 	LSM_HOOK_INIT(kernel_module_request, selinux_kernel_module_request),
7386 	LSM_HOOK_INIT(kernel_load_data, selinux_kernel_load_data),
7387 	LSM_HOOK_INIT(kernel_read_file, selinux_kernel_read_file),
7388 	LSM_HOOK_INIT(task_setpgid, selinux_task_setpgid),
7389 	LSM_HOOK_INIT(task_getpgid, selinux_task_getpgid),
7390 	LSM_HOOK_INIT(task_getsid, selinux_task_getsid),
7391 	LSM_HOOK_INIT(current_getlsmprop_subj, selinux_current_getlsmprop_subj),
7392 	LSM_HOOK_INIT(task_getlsmprop_obj, selinux_task_getlsmprop_obj),
7393 	LSM_HOOK_INIT(task_setnice, selinux_task_setnice),
7394 	LSM_HOOK_INIT(task_setioprio, selinux_task_setioprio),
7395 	LSM_HOOK_INIT(task_getioprio, selinux_task_getioprio),
7396 	LSM_HOOK_INIT(task_prlimit, selinux_task_prlimit),
7397 	LSM_HOOK_INIT(task_setrlimit, selinux_task_setrlimit),
7398 	LSM_HOOK_INIT(task_setscheduler, selinux_task_setscheduler),
7399 	LSM_HOOK_INIT(task_getscheduler, selinux_task_getscheduler),
7400 	LSM_HOOK_INIT(task_movememory, selinux_task_movememory),
7401 	LSM_HOOK_INIT(task_kill, selinux_task_kill),
7402 	LSM_HOOK_INIT(task_to_inode, selinux_task_to_inode),
7403 	LSM_HOOK_INIT(userns_create, selinux_userns_create),
7404 
7405 	LSM_HOOK_INIT(ipc_permission, selinux_ipc_permission),
7406 	LSM_HOOK_INIT(ipc_getlsmprop, selinux_ipc_getlsmprop),
7407 
7408 	LSM_HOOK_INIT(msg_queue_associate, selinux_msg_queue_associate),
7409 	LSM_HOOK_INIT(msg_queue_msgctl, selinux_msg_queue_msgctl),
7410 	LSM_HOOK_INIT(msg_queue_msgsnd, selinux_msg_queue_msgsnd),
7411 	LSM_HOOK_INIT(msg_queue_msgrcv, selinux_msg_queue_msgrcv),
7412 
7413 	LSM_HOOK_INIT(shm_associate, selinux_shm_associate),
7414 	LSM_HOOK_INIT(shm_shmctl, selinux_shm_shmctl),
7415 	LSM_HOOK_INIT(shm_shmat, selinux_shm_shmat),
7416 
7417 	LSM_HOOK_INIT(sem_associate, selinux_sem_associate),
7418 	LSM_HOOK_INIT(sem_semctl, selinux_sem_semctl),
7419 	LSM_HOOK_INIT(sem_semop, selinux_sem_semop),
7420 
7421 	LSM_HOOK_INIT(d_instantiate, selinux_d_instantiate),
7422 
7423 	LSM_HOOK_INIT(getselfattr, selinux_getselfattr),
7424 	LSM_HOOK_INIT(setselfattr, selinux_setselfattr),
7425 	LSM_HOOK_INIT(getprocattr, selinux_getprocattr),
7426 	LSM_HOOK_INIT(setprocattr, selinux_setprocattr),
7427 
7428 	LSM_HOOK_INIT(ismaclabel, selinux_ismaclabel),
7429 	LSM_HOOK_INIT(secctx_to_secid, selinux_secctx_to_secid),
7430 	LSM_HOOK_INIT(release_secctx, selinux_release_secctx),
7431 	LSM_HOOK_INIT(inode_invalidate_secctx, selinux_inode_invalidate_secctx),
7432 	LSM_HOOK_INIT(inode_notifysecctx, selinux_inode_notifysecctx),
7433 	LSM_HOOK_INIT(inode_setsecctx, selinux_inode_setsecctx),
7434 
7435 	LSM_HOOK_INIT(unix_stream_connect, selinux_socket_unix_stream_connect),
7436 	LSM_HOOK_INIT(unix_may_send, selinux_socket_unix_may_send),
7437 
7438 	LSM_HOOK_INIT(socket_create, selinux_socket_create),
7439 	LSM_HOOK_INIT(socket_post_create, selinux_socket_post_create),
7440 	LSM_HOOK_INIT(socket_socketpair, selinux_socket_socketpair),
7441 	LSM_HOOK_INIT(socket_bind, selinux_socket_bind),
7442 	LSM_HOOK_INIT(socket_connect, selinux_socket_connect),
7443 	LSM_HOOK_INIT(socket_listen, selinux_socket_listen),
7444 	LSM_HOOK_INIT(socket_accept, selinux_socket_accept),
7445 	LSM_HOOK_INIT(socket_sendmsg, selinux_socket_sendmsg),
7446 	LSM_HOOK_INIT(socket_recvmsg, selinux_socket_recvmsg),
7447 	LSM_HOOK_INIT(socket_getsockname, selinux_socket_getsockname),
7448 	LSM_HOOK_INIT(socket_getpeername, selinux_socket_getpeername),
7449 	LSM_HOOK_INIT(socket_getsockopt, selinux_socket_getsockopt),
7450 	LSM_HOOK_INIT(socket_setsockopt, selinux_socket_setsockopt),
7451 	LSM_HOOK_INIT(socket_shutdown, selinux_socket_shutdown),
7452 	LSM_HOOK_INIT(socket_sock_rcv_skb, selinux_socket_sock_rcv_skb),
7453 	LSM_HOOK_INIT(socket_getpeersec_stream,
7454 			selinux_socket_getpeersec_stream),
7455 	LSM_HOOK_INIT(socket_getpeersec_dgram, selinux_socket_getpeersec_dgram),
7456 	LSM_HOOK_INIT(sk_free_security, selinux_sk_free_security),
7457 	LSM_HOOK_INIT(sk_clone_security, selinux_sk_clone_security),
7458 	LSM_HOOK_INIT(sk_getsecid, selinux_sk_getsecid),
7459 	LSM_HOOK_INIT(sock_graft, selinux_sock_graft),
7460 	LSM_HOOK_INIT(sctp_assoc_request, selinux_sctp_assoc_request),
7461 	LSM_HOOK_INIT(sctp_sk_clone, selinux_sctp_sk_clone),
7462 	LSM_HOOK_INIT(sctp_bind_connect, selinux_sctp_bind_connect),
7463 	LSM_HOOK_INIT(sctp_assoc_established, selinux_sctp_assoc_established),
7464 	LSM_HOOK_INIT(mptcp_add_subflow, selinux_mptcp_add_subflow),
7465 	LSM_HOOK_INIT(inet_conn_request, selinux_inet_conn_request),
7466 	LSM_HOOK_INIT(inet_csk_clone, selinux_inet_csk_clone),
7467 	LSM_HOOK_INIT(inet_conn_established, selinux_inet_conn_established),
7468 	LSM_HOOK_INIT(secmark_relabel_packet, selinux_secmark_relabel_packet),
7469 	LSM_HOOK_INIT(secmark_refcount_inc, selinux_secmark_refcount_inc),
7470 	LSM_HOOK_INIT(secmark_refcount_dec, selinux_secmark_refcount_dec),
7471 	LSM_HOOK_INIT(req_classify_flow, selinux_req_classify_flow),
7472 	LSM_HOOK_INIT(tun_dev_create, selinux_tun_dev_create),
7473 	LSM_HOOK_INIT(tun_dev_attach_queue, selinux_tun_dev_attach_queue),
7474 	LSM_HOOK_INIT(tun_dev_attach, selinux_tun_dev_attach),
7475 	LSM_HOOK_INIT(tun_dev_open, selinux_tun_dev_open),
7476 #ifdef CONFIG_SECURITY_INFINIBAND
7477 	LSM_HOOK_INIT(ib_pkey_access, selinux_ib_pkey_access),
7478 	LSM_HOOK_INIT(ib_endport_manage_subnet,
7479 		      selinux_ib_endport_manage_subnet),
7480 #endif
7481 #ifdef CONFIG_SECURITY_NETWORK_XFRM
7482 	LSM_HOOK_INIT(xfrm_policy_free_security, selinux_xfrm_policy_free),
7483 	LSM_HOOK_INIT(xfrm_policy_delete_security, selinux_xfrm_policy_delete),
7484 	LSM_HOOK_INIT(xfrm_state_free_security, selinux_xfrm_state_free),
7485 	LSM_HOOK_INIT(xfrm_state_delete_security, selinux_xfrm_state_delete),
7486 	LSM_HOOK_INIT(xfrm_policy_lookup, selinux_xfrm_policy_lookup),
7487 	LSM_HOOK_INIT(xfrm_state_pol_flow_match,
7488 			selinux_xfrm_state_pol_flow_match),
7489 	LSM_HOOK_INIT(xfrm_decode_session, selinux_xfrm_decode_session),
7490 #endif
7491 
7492 #ifdef CONFIG_KEYS
7493 	LSM_HOOK_INIT(key_permission, selinux_key_permission),
7494 	LSM_HOOK_INIT(key_getsecurity, selinux_key_getsecurity),
7495 #ifdef CONFIG_KEY_NOTIFICATIONS
7496 	LSM_HOOK_INIT(watch_key, selinux_watch_key),
7497 #endif
7498 #endif
7499 
7500 #ifdef CONFIG_AUDIT
7501 	LSM_HOOK_INIT(audit_rule_known, selinux_audit_rule_known),
7502 	LSM_HOOK_INIT(audit_rule_match, selinux_audit_rule_match),
7503 	LSM_HOOK_INIT(audit_rule_free, selinux_audit_rule_free),
7504 #endif
7505 
7506 #ifdef CONFIG_BPF_SYSCALL
7507 	LSM_HOOK_INIT(bpf, selinux_bpf),
7508 	LSM_HOOK_INIT(bpf_map, selinux_bpf_map),
7509 	LSM_HOOK_INIT(bpf_prog, selinux_bpf_prog),
7510 #endif
7511 
7512 #ifdef CONFIG_PERF_EVENTS
7513 	LSM_HOOK_INIT(perf_event_open, selinux_perf_event_open),
7514 	LSM_HOOK_INIT(perf_event_read, selinux_perf_event_read),
7515 	LSM_HOOK_INIT(perf_event_write, selinux_perf_event_write),
7516 #endif
7517 
7518 #ifdef CONFIG_IO_URING
7519 	LSM_HOOK_INIT(uring_override_creds, selinux_uring_override_creds),
7520 	LSM_HOOK_INIT(uring_sqpoll, selinux_uring_sqpoll),
7521 	LSM_HOOK_INIT(uring_cmd, selinux_uring_cmd),
7522 	LSM_HOOK_INIT(uring_allowed, selinux_uring_allowed),
7523 #endif
7524 
7525 	/*
7526 	 * PUT "CLONING" (ACCESSING + ALLOCATING) HOOKS HERE
7527 	 */
7528 	LSM_HOOK_INIT(fs_context_submount, selinux_fs_context_submount),
7529 	LSM_HOOK_INIT(fs_context_dup, selinux_fs_context_dup),
7530 	LSM_HOOK_INIT(fs_context_parse_param, selinux_fs_context_parse_param),
7531 	LSM_HOOK_INIT(sb_eat_lsm_opts, selinux_sb_eat_lsm_opts),
7532 #ifdef CONFIG_SECURITY_NETWORK_XFRM
7533 	LSM_HOOK_INIT(xfrm_policy_clone_security, selinux_xfrm_policy_clone),
7534 #endif
7535 
7536 	/*
7537 	 * PUT "ALLOCATING" HOOKS HERE
7538 	 */
7539 	LSM_HOOK_INIT(msg_msg_alloc_security, selinux_msg_msg_alloc_security),
7540 	LSM_HOOK_INIT(msg_queue_alloc_security,
7541 		      selinux_msg_queue_alloc_security),
7542 	LSM_HOOK_INIT(shm_alloc_security, selinux_shm_alloc_security),
7543 	LSM_HOOK_INIT(sb_alloc_security, selinux_sb_alloc_security),
7544 	LSM_HOOK_INIT(inode_alloc_security, selinux_inode_alloc_security),
7545 	LSM_HOOK_INIT(sem_alloc_security, selinux_sem_alloc_security),
7546 	LSM_HOOK_INIT(secid_to_secctx, selinux_secid_to_secctx),
7547 	LSM_HOOK_INIT(lsmprop_to_secctx, selinux_lsmprop_to_secctx),
7548 	LSM_HOOK_INIT(inode_getsecctx, selinux_inode_getsecctx),
7549 	LSM_HOOK_INIT(sk_alloc_security, selinux_sk_alloc_security),
7550 	LSM_HOOK_INIT(tun_dev_alloc_security, selinux_tun_dev_alloc_security),
7551 #ifdef CONFIG_SECURITY_INFINIBAND
7552 	LSM_HOOK_INIT(ib_alloc_security, selinux_ib_alloc_security),
7553 #endif
7554 #ifdef CONFIG_SECURITY_NETWORK_XFRM
7555 	LSM_HOOK_INIT(xfrm_policy_alloc_security, selinux_xfrm_policy_alloc),
7556 	LSM_HOOK_INIT(xfrm_state_alloc, selinux_xfrm_state_alloc),
7557 	LSM_HOOK_INIT(xfrm_state_alloc_acquire,
7558 		      selinux_xfrm_state_alloc_acquire),
7559 #endif
7560 #ifdef CONFIG_KEYS
7561 	LSM_HOOK_INIT(key_alloc, selinux_key_alloc),
7562 #endif
7563 #ifdef CONFIG_AUDIT
7564 	LSM_HOOK_INIT(audit_rule_init, selinux_audit_rule_init),
7565 #endif
7566 #ifdef CONFIG_BPF_SYSCALL
7567 	LSM_HOOK_INIT(bpf_map_create, selinux_bpf_map_create),
7568 	LSM_HOOK_INIT(bpf_prog_load, selinux_bpf_prog_load),
7569 	LSM_HOOK_INIT(bpf_token_create, selinux_bpf_token_create),
7570 #endif
7571 #ifdef CONFIG_PERF_EVENTS
7572 	LSM_HOOK_INIT(perf_event_alloc, selinux_perf_event_alloc),
7573 #endif
7574 };
7575 
selinux_init(void)7576 static __init int selinux_init(void)
7577 {
7578 	pr_info("SELinux:  Initializing.\n");
7579 
7580 	memset(&selinux_state, 0, sizeof(selinux_state));
7581 	enforcing_set(selinux_enforcing_boot);
7582 	selinux_avc_init();
7583 	mutex_init(&selinux_state.status_lock);
7584 	mutex_init(&selinux_state.policy_mutex);
7585 
7586 	/* Set the security state for the initial task. */
7587 	cred_init_security();
7588 
7589 	/* Inform the audit system that secctx is used */
7590 	audit_cfg_lsm(&selinux_lsmid,
7591 		      AUDIT_CFG_LSM_SECCTX_SUBJECT |
7592 		      AUDIT_CFG_LSM_SECCTX_OBJECT);
7593 
7594 	default_noexec = !(VM_DATA_DEFAULT_FLAGS & VM_EXEC);
7595 	if (!default_noexec)
7596 		pr_notice("SELinux:  virtual memory is executable by default\n");
7597 
7598 	avc_init();
7599 
7600 	avtab_cache_init();
7601 
7602 	ebitmap_cache_init();
7603 
7604 	hashtab_cache_init();
7605 
7606 	security_add_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks),
7607 			   &selinux_lsmid);
7608 
7609 	if (avc_add_callback(selinux_netcache_avc_callback, AVC_CALLBACK_RESET))
7610 		panic("SELinux: Unable to register AVC netcache callback\n");
7611 
7612 	if (avc_add_callback(selinux_lsm_notifier_avc_callback, AVC_CALLBACK_RESET))
7613 		panic("SELinux: Unable to register AVC LSM notifier callback\n");
7614 
7615 	if (selinux_enforcing_boot)
7616 		pr_debug("SELinux:  Starting in enforcing mode\n");
7617 	else
7618 		pr_debug("SELinux:  Starting in permissive mode\n");
7619 
7620 	fs_validate_description("selinux", selinux_fs_parameters);
7621 
7622 	return 0;
7623 }
7624 
delayed_superblock_init(struct super_block * sb,void * unused)7625 static void delayed_superblock_init(struct super_block *sb, void *unused)
7626 {
7627 	selinux_set_mnt_opts(sb, NULL, 0, NULL);
7628 }
7629 
selinux_complete_init(void)7630 void selinux_complete_init(void)
7631 {
7632 	pr_debug("SELinux:  Completing initialization.\n");
7633 
7634 	/* Set up any superblocks initialized prior to the policy load. */
7635 	pr_debug("SELinux:  Setting up existing superblocks.\n");
7636 	iterate_supers(delayed_superblock_init, NULL);
7637 }
7638 
7639 /* SELinux requires early initialization in order to label
7640    all processes and objects when they are created. */
7641 DEFINE_LSM(selinux) = {
7642 	.name = "selinux",
7643 	.flags = LSM_FLAG_LEGACY_MAJOR | LSM_FLAG_EXCLUSIVE,
7644 	.enabled = &selinux_enabled_boot,
7645 	.blobs = &selinux_blob_sizes,
7646 	.init = selinux_init,
7647 };
7648 
7649 #if defined(CONFIG_NETFILTER)
7650 static const struct nf_hook_ops selinux_nf_ops[] = {
7651 	{
7652 		.hook =		selinux_ip_postroute,
7653 		.pf =		NFPROTO_IPV4,
7654 		.hooknum =	NF_INET_POST_ROUTING,
7655 		.priority =	NF_IP_PRI_SELINUX_LAST,
7656 	},
7657 	{
7658 		.hook =		selinux_ip_forward,
7659 		.pf =		NFPROTO_IPV4,
7660 		.hooknum =	NF_INET_FORWARD,
7661 		.priority =	NF_IP_PRI_SELINUX_FIRST,
7662 	},
7663 	{
7664 		.hook =		selinux_ip_output,
7665 		.pf =		NFPROTO_IPV4,
7666 		.hooknum =	NF_INET_LOCAL_OUT,
7667 		.priority =	NF_IP_PRI_SELINUX_FIRST,
7668 	},
7669 #if IS_ENABLED(CONFIG_IPV6)
7670 	{
7671 		.hook =		selinux_ip_postroute,
7672 		.pf =		NFPROTO_IPV6,
7673 		.hooknum =	NF_INET_POST_ROUTING,
7674 		.priority =	NF_IP6_PRI_SELINUX_LAST,
7675 	},
7676 	{
7677 		.hook =		selinux_ip_forward,
7678 		.pf =		NFPROTO_IPV6,
7679 		.hooknum =	NF_INET_FORWARD,
7680 		.priority =	NF_IP6_PRI_SELINUX_FIRST,
7681 	},
7682 	{
7683 		.hook =		selinux_ip_output,
7684 		.pf =		NFPROTO_IPV6,
7685 		.hooknum =	NF_INET_LOCAL_OUT,
7686 		.priority =	NF_IP6_PRI_SELINUX_FIRST,
7687 	},
7688 #endif	/* IPV6 */
7689 };
7690 
selinux_nf_register(struct net * net)7691 static int __net_init selinux_nf_register(struct net *net)
7692 {
7693 	return nf_register_net_hooks(net, selinux_nf_ops,
7694 				     ARRAY_SIZE(selinux_nf_ops));
7695 }
7696 
selinux_nf_unregister(struct net * net)7697 static void __net_exit selinux_nf_unregister(struct net *net)
7698 {
7699 	nf_unregister_net_hooks(net, selinux_nf_ops,
7700 				ARRAY_SIZE(selinux_nf_ops));
7701 }
7702 
7703 static struct pernet_operations selinux_net_ops = {
7704 	.init = selinux_nf_register,
7705 	.exit = selinux_nf_unregister,
7706 };
7707 
selinux_nf_ip_init(void)7708 static int __init selinux_nf_ip_init(void)
7709 {
7710 	int err;
7711 
7712 	if (!selinux_enabled_boot)
7713 		return 0;
7714 
7715 	pr_debug("SELinux:  Registering netfilter hooks\n");
7716 
7717 	err = register_pernet_subsys(&selinux_net_ops);
7718 	if (err)
7719 		panic("SELinux: register_pernet_subsys: error %d\n", err);
7720 
7721 	return 0;
7722 }
7723 __initcall(selinux_nf_ip_init);
7724 #endif /* CONFIG_NETFILTER */
7725