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