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