1 /*
2  *  NSA Security-Enhanced Linux (SELinux) security module
3  *
4  *  This file contains the SELinux hook function implementations.
5  *
6  *  Authors:  Stephen Smalley, <sds@epoch.ncsc.mil>
7  *	      Chris Vance, <cvance@nai.com>
8  *	      Wayne Salamon, <wsalamon@nai.com>
9  *	      James Morris <jmorris@redhat.com>
10  *
11  *  Copyright (C) 2001,2002 Networks Associates Technology, Inc.
12  *  Copyright (C) 2003-2008 Red Hat, Inc., James Morris <jmorris@redhat.com>
13  *					   Eric Paris <eparis@redhat.com>
14  *  Copyright (C) 2004-2005 Trusted Computer Solutions, Inc.
15  *			    <dgoeddel@trustedcs.com>
16  *  Copyright (C) 2006, 2007, 2009 Hewlett-Packard Development Company, L.P.
17  *	Paul Moore <paul@paul-moore.com>
18  *  Copyright (C) 2007 Hitachi Software Engineering Co., Ltd.
19  *		       Yuichi Nakamura <ynakam@hitachisoft.jp>
20  *
21  *	This program is free software; you can redistribute it and/or modify
22  *	it under the terms of the GNU General Public License version 2,
23  *	as published by the Free Software Foundation.
24  */
25 
26 #include <linux/init.h>
27 #include <linux/kd.h>
28 #include <linux/kernel.h>
29 #include <linux/tracehook.h>
30 #include <linux/errno.h>
31 #include <linux/sched.h>
32 #include <linux/security.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/netfilter_ipv4.h>
50 #include <linux/netfilter_ipv6.h>
51 #include <linux/tty.h>
52 #include <net/icmp.h>
53 #include <net/ip.h>		/* for local_port_range[] */
54 #include <net/tcp.h>		/* struct or_callable used in sock_rcv_skb */
55 #include <net/inet_connection_sock.h>
56 #include <net/net_namespace.h>
57 #include <net/netlabel.h>
58 #include <linux/uaccess.h>
59 #include <asm/ioctls.h>
60 #include <linux/atomic.h>
61 #include <linux/bitops.h>
62 #include <linux/interrupt.h>
63 #include <linux/netdevice.h>	/* for network interface checks */
64 #include <net/netlink.h>
65 #include <linux/tcp.h>
66 #include <linux/udp.h>
67 #include <linux/dccp.h>
68 #include <linux/quota.h>
69 #include <linux/un.h>		/* for Unix socket types */
70 #include <net/af_unix.h>	/* for Unix socket types */
71 #include <linux/parser.h>
72 #include <linux/nfs_mount.h>
73 #include <net/ipv6.h>
74 #include <linux/hugetlb.h>
75 #include <linux/personality.h>
76 #include <linux/audit.h>
77 #include <linux/string.h>
78 #include <linux/selinux.h>
79 #include <linux/mutex.h>
80 #include <linux/posix-timers.h>
81 #include <linux/syslog.h>
82 #include <linux/user_namespace.h>
83 #include <linux/export.h>
84 #include <linux/msg.h>
85 #include <linux/shm.h>
86 
87 #include "avc.h"
88 #include "objsec.h"
89 #include "netif.h"
90 #include "netnode.h"
91 #include "netport.h"
92 #include "xfrm.h"
93 #include "netlabel.h"
94 #include "audit.h"
95 #include "avc_ss.h"
96 
97 /* SECMARK reference count */
98 static atomic_t selinux_secmark_refcount = ATOMIC_INIT(0);
99 
100 #ifdef CONFIG_SECURITY_SELINUX_DEVELOP
101 int selinux_enforcing;
102 
enforcing_setup(char * str)103 static int __init enforcing_setup(char *str)
104 {
105 	unsigned long enforcing;
106 	if (!kstrtoul(str, 0, &enforcing))
107 		selinux_enforcing = enforcing ? 1 : 0;
108 	return 1;
109 }
110 __setup("enforcing=", enforcing_setup);
111 #endif
112 
113 #ifdef CONFIG_SECURITY_SELINUX_BOOTPARAM
114 int selinux_enabled = CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE;
115 
selinux_enabled_setup(char * str)116 static int __init selinux_enabled_setup(char *str)
117 {
118 	unsigned long enabled;
119 	if (!kstrtoul(str, 0, &enabled))
120 		selinux_enabled = enabled ? 1 : 0;
121 	return 1;
122 }
123 __setup("selinux=", selinux_enabled_setup);
124 #else
125 int selinux_enabled = 1;
126 #endif
127 
128 static struct kmem_cache *sel_inode_cache;
129 
130 /**
131  * selinux_secmark_enabled - Check to see if SECMARK is currently enabled
132  *
133  * Description:
134  * This function checks the SECMARK reference counter to see if any SECMARK
135  * targets are currently configured, if the reference counter is greater than
136  * zero SECMARK is considered to be enabled.  Returns true (1) if SECMARK is
137  * enabled, false (0) if SECMARK is disabled.  If the always_check_network
138  * policy capability is enabled, SECMARK is always considered enabled.
139  *
140  */
selinux_secmark_enabled(void)141 static int selinux_secmark_enabled(void)
142 {
143 	return (selinux_policycap_alwaysnetwork || atomic_read(&selinux_secmark_refcount));
144 }
145 
146 /**
147  * selinux_peerlbl_enabled - Check to see if peer labeling is currently enabled
148  *
149  * Description:
150  * This function checks if NetLabel or labeled IPSEC is enabled.  Returns true
151  * (1) if any are enabled or false (0) if neither are enabled.  If the
152  * always_check_network policy capability is enabled, peer labeling
153  * is always considered enabled.
154  *
155  */
selinux_peerlbl_enabled(void)156 static int selinux_peerlbl_enabled(void)
157 {
158 	return (selinux_policycap_alwaysnetwork || netlbl_enabled() || selinux_xfrm_enabled());
159 }
160 
selinux_netcache_avc_callback(u32 event)161 static int selinux_netcache_avc_callback(u32 event)
162 {
163 	if (event == AVC_CALLBACK_RESET) {
164 		sel_netif_flush();
165 		sel_netnode_flush();
166 		sel_netport_flush();
167 		synchronize_net();
168 	}
169 	return 0;
170 }
171 
172 /*
173  * initialise the security for the init task
174  */
cred_init_security(void)175 static void cred_init_security(void)
176 {
177 	struct cred *cred = (struct cred *) current->real_cred;
178 	struct task_security_struct *tsec;
179 
180 	tsec = kzalloc(sizeof(struct task_security_struct), GFP_KERNEL);
181 	if (!tsec)
182 		panic("SELinux:  Failed to initialize initial task.\n");
183 
184 	tsec->osid = tsec->sid = SECINITSID_KERNEL;
185 	cred->security = tsec;
186 }
187 
188 /*
189  * get the security ID of a set of credentials
190  */
cred_sid(const struct cred * cred)191 static inline u32 cred_sid(const struct cred *cred)
192 {
193 	const struct task_security_struct *tsec;
194 
195 	tsec = cred->security;
196 	return tsec->sid;
197 }
198 
199 /*
200  * get the objective security ID of a task
201  */
task_sid(const struct task_struct * task)202 static inline u32 task_sid(const struct task_struct *task)
203 {
204 	u32 sid;
205 
206 	rcu_read_lock();
207 	sid = cred_sid(__task_cred(task));
208 	rcu_read_unlock();
209 	return sid;
210 }
211 
212 /*
213  * get the subjective security ID of the current task
214  */
current_sid(void)215 static inline u32 current_sid(void)
216 {
217 	const struct task_security_struct *tsec = current_security();
218 
219 	return tsec->sid;
220 }
221 
222 /* Allocate and free functions for each kind of security blob. */
223 
inode_alloc_security(struct inode * inode)224 static int inode_alloc_security(struct inode *inode)
225 {
226 	struct inode_security_struct *isec;
227 	u32 sid = current_sid();
228 
229 	isec = kmem_cache_zalloc(sel_inode_cache, GFP_NOFS);
230 	if (!isec)
231 		return -ENOMEM;
232 
233 	mutex_init(&isec->lock);
234 	INIT_LIST_HEAD(&isec->list);
235 	isec->inode = inode;
236 	isec->sid = SECINITSID_UNLABELED;
237 	isec->sclass = SECCLASS_FILE;
238 	isec->task_sid = sid;
239 	inode->i_security = isec;
240 
241 	return 0;
242 }
243 
inode_free_rcu(struct rcu_head * head)244 static void inode_free_rcu(struct rcu_head *head)
245 {
246 	struct inode_security_struct *isec;
247 
248 	isec = container_of(head, struct inode_security_struct, rcu);
249 	kmem_cache_free(sel_inode_cache, isec);
250 }
251 
inode_free_security(struct inode * inode)252 static void inode_free_security(struct inode *inode)
253 {
254 	struct inode_security_struct *isec = inode->i_security;
255 	struct superblock_security_struct *sbsec = inode->i_sb->s_security;
256 
257 	spin_lock(&sbsec->isec_lock);
258 	if (!list_empty(&isec->list))
259 		list_del_init(&isec->list);
260 	spin_unlock(&sbsec->isec_lock);
261 
262 	/*
263 	 * The inode may still be referenced in a path walk and
264 	 * a call to selinux_inode_permission() can be made
265 	 * after inode_free_security() is called. Ideally, the VFS
266 	 * wouldn't do this, but fixing that is a much harder
267 	 * job. For now, simply free the i_security via RCU, and
268 	 * leave the current inode->i_security pointer intact.
269 	 * The inode will be freed after the RCU grace period too.
270 	 */
271 	call_rcu(&isec->rcu, inode_free_rcu);
272 }
273 
file_alloc_security(struct file * file)274 static int file_alloc_security(struct file *file)
275 {
276 	struct file_security_struct *fsec;
277 	u32 sid = current_sid();
278 
279 	fsec = kzalloc(sizeof(struct file_security_struct), GFP_KERNEL);
280 	if (!fsec)
281 		return -ENOMEM;
282 
283 	fsec->sid = sid;
284 	fsec->fown_sid = sid;
285 	file->f_security = fsec;
286 
287 	return 0;
288 }
289 
file_free_security(struct file * file)290 static void file_free_security(struct file *file)
291 {
292 	struct file_security_struct *fsec = file->f_security;
293 	file->f_security = NULL;
294 	kfree(fsec);
295 }
296 
superblock_alloc_security(struct super_block * sb)297 static int superblock_alloc_security(struct super_block *sb)
298 {
299 	struct superblock_security_struct *sbsec;
300 
301 	sbsec = kzalloc(sizeof(struct superblock_security_struct), GFP_KERNEL);
302 	if (!sbsec)
303 		return -ENOMEM;
304 
305 	mutex_init(&sbsec->lock);
306 	INIT_LIST_HEAD(&sbsec->isec_head);
307 	spin_lock_init(&sbsec->isec_lock);
308 	sbsec->sb = sb;
309 	sbsec->sid = SECINITSID_UNLABELED;
310 	sbsec->def_sid = SECINITSID_FILE;
311 	sbsec->mntpoint_sid = SECINITSID_UNLABELED;
312 	sb->s_security = sbsec;
313 
314 	return 0;
315 }
316 
superblock_free_security(struct super_block * sb)317 static void superblock_free_security(struct super_block *sb)
318 {
319 	struct superblock_security_struct *sbsec = sb->s_security;
320 	sb->s_security = NULL;
321 	kfree(sbsec);
322 }
323 
324 /* The file system's label must be initialized prior to use. */
325 
326 static const char *labeling_behaviors[7] = {
327 	"uses xattr",
328 	"uses transition SIDs",
329 	"uses task SIDs",
330 	"uses genfs_contexts",
331 	"not configured for labeling",
332 	"uses mountpoint labeling",
333 	"uses native labeling",
334 };
335 
336 static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry);
337 
inode_doinit(struct inode * inode)338 static inline int inode_doinit(struct inode *inode)
339 {
340 	return inode_doinit_with_dentry(inode, NULL);
341 }
342 
343 enum {
344 	Opt_error = -1,
345 	Opt_context = 1,
346 	Opt_fscontext = 2,
347 	Opt_defcontext = 3,
348 	Opt_rootcontext = 4,
349 	Opt_labelsupport = 5,
350 	Opt_nextmntopt = 6,
351 };
352 
353 #define NUM_SEL_MNT_OPTS	(Opt_nextmntopt - 1)
354 
355 static const match_table_t tokens = {
356 	{Opt_context, CONTEXT_STR "%s"},
357 	{Opt_fscontext, FSCONTEXT_STR "%s"},
358 	{Opt_defcontext, DEFCONTEXT_STR "%s"},
359 	{Opt_rootcontext, ROOTCONTEXT_STR "%s"},
360 	{Opt_labelsupport, LABELSUPP_STR},
361 	{Opt_error, NULL},
362 };
363 
364 #define SEL_MOUNT_FAIL_MSG "SELinux:  duplicate or incompatible mount options\n"
365 
may_context_mount_sb_relabel(u32 sid,struct superblock_security_struct * sbsec,const struct cred * cred)366 static int may_context_mount_sb_relabel(u32 sid,
367 			struct superblock_security_struct *sbsec,
368 			const struct cred *cred)
369 {
370 	const struct task_security_struct *tsec = cred->security;
371 	int rc;
372 
373 	rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
374 			  FILESYSTEM__RELABELFROM, NULL);
375 	if (rc)
376 		return rc;
377 
378 	rc = avc_has_perm(tsec->sid, sid, SECCLASS_FILESYSTEM,
379 			  FILESYSTEM__RELABELTO, NULL);
380 	return rc;
381 }
382 
may_context_mount_inode_relabel(u32 sid,struct superblock_security_struct * sbsec,const struct cred * cred)383 static int may_context_mount_inode_relabel(u32 sid,
384 			struct superblock_security_struct *sbsec,
385 			const struct cred *cred)
386 {
387 	const struct task_security_struct *tsec = cred->security;
388 	int rc;
389 	rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
390 			  FILESYSTEM__RELABELFROM, NULL);
391 	if (rc)
392 		return rc;
393 
394 	rc = avc_has_perm(sid, sbsec->sid, SECCLASS_FILESYSTEM,
395 			  FILESYSTEM__ASSOCIATE, NULL);
396 	return rc;
397 }
398 
selinux_is_sblabel_mnt(struct super_block * sb)399 static int selinux_is_sblabel_mnt(struct super_block *sb)
400 {
401 	struct superblock_security_struct *sbsec = sb->s_security;
402 
403 	return sbsec->behavior == SECURITY_FS_USE_XATTR ||
404 		sbsec->behavior == SECURITY_FS_USE_TRANS ||
405 		sbsec->behavior == SECURITY_FS_USE_TASK ||
406 		sbsec->behavior == SECURITY_FS_USE_NATIVE ||
407 		/* Special handling. Genfs but also in-core setxattr handler */
408 		!strcmp(sb->s_type->name, "sysfs") ||
409 		!strcmp(sb->s_type->name, "pstore") ||
410 		!strcmp(sb->s_type->name, "debugfs") ||
411 		!strcmp(sb->s_type->name, "rootfs");
412 }
413 
sb_finish_set_opts(struct super_block * sb)414 static int sb_finish_set_opts(struct super_block *sb)
415 {
416 	struct superblock_security_struct *sbsec = sb->s_security;
417 	struct dentry *root = sb->s_root;
418 	struct inode *root_inode = d_backing_inode(root);
419 	int rc = 0;
420 
421 	if (sbsec->behavior == SECURITY_FS_USE_XATTR) {
422 		/* Make sure that the xattr handler exists and that no
423 		   error other than -ENODATA is returned by getxattr on
424 		   the root directory.  -ENODATA is ok, as this may be
425 		   the first boot of the SELinux kernel before we have
426 		   assigned xattr values to the filesystem. */
427 		if (!root_inode->i_op->getxattr) {
428 			printk(KERN_WARNING "SELinux: (dev %s, type %s) has no "
429 			       "xattr support\n", sb->s_id, sb->s_type->name);
430 			rc = -EOPNOTSUPP;
431 			goto out;
432 		}
433 		rc = root_inode->i_op->getxattr(root, XATTR_NAME_SELINUX, NULL, 0);
434 		if (rc < 0 && rc != -ENODATA) {
435 			if (rc == -EOPNOTSUPP)
436 				printk(KERN_WARNING "SELinux: (dev %s, type "
437 				       "%s) has no security xattr handler\n",
438 				       sb->s_id, sb->s_type->name);
439 			else
440 				printk(KERN_WARNING "SELinux: (dev %s, type "
441 				       "%s) getxattr errno %d\n", sb->s_id,
442 				       sb->s_type->name, -rc);
443 			goto out;
444 		}
445 	}
446 
447 	if (sbsec->behavior > ARRAY_SIZE(labeling_behaviors))
448 		printk(KERN_ERR "SELinux: initialized (dev %s, type %s), unknown behavior\n",
449 		       sb->s_id, sb->s_type->name);
450 
451 	sbsec->flags |= SE_SBINITIALIZED;
452 	if (selinux_is_sblabel_mnt(sb))
453 		sbsec->flags |= SBLABEL_MNT;
454 
455 	/* Initialize the root inode. */
456 	rc = inode_doinit_with_dentry(root_inode, root);
457 
458 	/* Initialize any other inodes associated with the superblock, e.g.
459 	   inodes created prior to initial policy load or inodes created
460 	   during get_sb by a pseudo filesystem that directly
461 	   populates itself. */
462 	spin_lock(&sbsec->isec_lock);
463 next_inode:
464 	if (!list_empty(&sbsec->isec_head)) {
465 		struct inode_security_struct *isec =
466 				list_entry(sbsec->isec_head.next,
467 					   struct inode_security_struct, list);
468 		struct inode *inode = isec->inode;
469 		list_del_init(&isec->list);
470 		spin_unlock(&sbsec->isec_lock);
471 		inode = igrab(inode);
472 		if (inode) {
473 			if (!IS_PRIVATE(inode))
474 				inode_doinit(inode);
475 			iput(inode);
476 		}
477 		spin_lock(&sbsec->isec_lock);
478 		goto next_inode;
479 	}
480 	spin_unlock(&sbsec->isec_lock);
481 out:
482 	return rc;
483 }
484 
485 /*
486  * This function should allow an FS to ask what it's mount security
487  * options were so it can use those later for submounts, displaying
488  * mount options, or whatever.
489  */
selinux_get_mnt_opts(const struct super_block * sb,struct security_mnt_opts * opts)490 static int selinux_get_mnt_opts(const struct super_block *sb,
491 				struct security_mnt_opts *opts)
492 {
493 	int rc = 0, i;
494 	struct superblock_security_struct *sbsec = sb->s_security;
495 	char *context = NULL;
496 	u32 len;
497 	char tmp;
498 
499 	security_init_mnt_opts(opts);
500 
501 	if (!(sbsec->flags & SE_SBINITIALIZED))
502 		return -EINVAL;
503 
504 	if (!ss_initialized)
505 		return -EINVAL;
506 
507 	/* make sure we always check enough bits to cover the mask */
508 	BUILD_BUG_ON(SE_MNTMASK >= (1 << NUM_SEL_MNT_OPTS));
509 
510 	tmp = sbsec->flags & SE_MNTMASK;
511 	/* count the number of mount options for this sb */
512 	for (i = 0; i < NUM_SEL_MNT_OPTS; i++) {
513 		if (tmp & 0x01)
514 			opts->num_mnt_opts++;
515 		tmp >>= 1;
516 	}
517 	/* Check if the Label support flag is set */
518 	if (sbsec->flags & SBLABEL_MNT)
519 		opts->num_mnt_opts++;
520 
521 	opts->mnt_opts = kcalloc(opts->num_mnt_opts, sizeof(char *), GFP_ATOMIC);
522 	if (!opts->mnt_opts) {
523 		rc = -ENOMEM;
524 		goto out_free;
525 	}
526 
527 	opts->mnt_opts_flags = kcalloc(opts->num_mnt_opts, sizeof(int), GFP_ATOMIC);
528 	if (!opts->mnt_opts_flags) {
529 		rc = -ENOMEM;
530 		goto out_free;
531 	}
532 
533 	i = 0;
534 	if (sbsec->flags & FSCONTEXT_MNT) {
535 		rc = security_sid_to_context(sbsec->sid, &context, &len);
536 		if (rc)
537 			goto out_free;
538 		opts->mnt_opts[i] = context;
539 		opts->mnt_opts_flags[i++] = FSCONTEXT_MNT;
540 	}
541 	if (sbsec->flags & CONTEXT_MNT) {
542 		rc = security_sid_to_context(sbsec->mntpoint_sid, &context, &len);
543 		if (rc)
544 			goto out_free;
545 		opts->mnt_opts[i] = context;
546 		opts->mnt_opts_flags[i++] = CONTEXT_MNT;
547 	}
548 	if (sbsec->flags & DEFCONTEXT_MNT) {
549 		rc = security_sid_to_context(sbsec->def_sid, &context, &len);
550 		if (rc)
551 			goto out_free;
552 		opts->mnt_opts[i] = context;
553 		opts->mnt_opts_flags[i++] = DEFCONTEXT_MNT;
554 	}
555 	if (sbsec->flags & ROOTCONTEXT_MNT) {
556 		struct inode *root = d_backing_inode(sbsec->sb->s_root);
557 		struct inode_security_struct *isec = root->i_security;
558 
559 		rc = security_sid_to_context(isec->sid, &context, &len);
560 		if (rc)
561 			goto out_free;
562 		opts->mnt_opts[i] = context;
563 		opts->mnt_opts_flags[i++] = ROOTCONTEXT_MNT;
564 	}
565 	if (sbsec->flags & SBLABEL_MNT) {
566 		opts->mnt_opts[i] = NULL;
567 		opts->mnt_opts_flags[i++] = SBLABEL_MNT;
568 	}
569 
570 	BUG_ON(i != opts->num_mnt_opts);
571 
572 	return 0;
573 
574 out_free:
575 	security_free_mnt_opts(opts);
576 	return rc;
577 }
578 
bad_option(struct superblock_security_struct * sbsec,char flag,u32 old_sid,u32 new_sid)579 static int bad_option(struct superblock_security_struct *sbsec, char flag,
580 		      u32 old_sid, u32 new_sid)
581 {
582 	char mnt_flags = sbsec->flags & SE_MNTMASK;
583 
584 	/* check if the old mount command had the same options */
585 	if (sbsec->flags & SE_SBINITIALIZED)
586 		if (!(sbsec->flags & flag) ||
587 		    (old_sid != new_sid))
588 			return 1;
589 
590 	/* check if we were passed the same options twice,
591 	 * aka someone passed context=a,context=b
592 	 */
593 	if (!(sbsec->flags & SE_SBINITIALIZED))
594 		if (mnt_flags & flag)
595 			return 1;
596 	return 0;
597 }
598 
599 /*
600  * Allow filesystems with binary mount data to explicitly set mount point
601  * labeling information.
602  */
selinux_set_mnt_opts(struct super_block * sb,struct security_mnt_opts * opts,unsigned long kern_flags,unsigned long * set_kern_flags)603 static int selinux_set_mnt_opts(struct super_block *sb,
604 				struct security_mnt_opts *opts,
605 				unsigned long kern_flags,
606 				unsigned long *set_kern_flags)
607 {
608 	const struct cred *cred = current_cred();
609 	int rc = 0, i;
610 	struct superblock_security_struct *sbsec = sb->s_security;
611 	const char *name = sb->s_type->name;
612 	struct inode *inode = d_backing_inode(sbsec->sb->s_root);
613 	struct inode_security_struct *root_isec = inode->i_security;
614 	u32 fscontext_sid = 0, context_sid = 0, rootcontext_sid = 0;
615 	u32 defcontext_sid = 0;
616 	char **mount_options = opts->mnt_opts;
617 	int *flags = opts->mnt_opts_flags;
618 	int num_opts = opts->num_mnt_opts;
619 
620 	mutex_lock(&sbsec->lock);
621 
622 	if (!ss_initialized) {
623 		if (!num_opts) {
624 			/* Defer initialization until selinux_complete_init,
625 			   after the initial policy is loaded and the security
626 			   server is ready to handle calls. */
627 			goto out;
628 		}
629 		rc = -EINVAL;
630 		printk(KERN_WARNING "SELinux: Unable to set superblock options "
631 			"before the security server is initialized\n");
632 		goto out;
633 	}
634 	if (kern_flags && !set_kern_flags) {
635 		/* Specifying internal flags without providing a place to
636 		 * place the results is not allowed */
637 		rc = -EINVAL;
638 		goto out;
639 	}
640 
641 	/*
642 	 * Binary mount data FS will come through this function twice.  Once
643 	 * from an explicit call and once from the generic calls from the vfs.
644 	 * Since the generic VFS calls will not contain any security mount data
645 	 * we need to skip the double mount verification.
646 	 *
647 	 * This does open a hole in which we will not notice if the first
648 	 * mount using this sb set explict options and a second mount using
649 	 * this sb does not set any security options.  (The first options
650 	 * will be used for both mounts)
651 	 */
652 	if ((sbsec->flags & SE_SBINITIALIZED) && (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA)
653 	    && (num_opts == 0))
654 		goto out;
655 
656 	/*
657 	 * parse the mount options, check if they are valid sids.
658 	 * also check if someone is trying to mount the same sb more
659 	 * than once with different security options.
660 	 */
661 	for (i = 0; i < num_opts; i++) {
662 		u32 sid;
663 
664 		if (flags[i] == SBLABEL_MNT)
665 			continue;
666 		rc = security_context_to_sid(mount_options[i],
667 					     strlen(mount_options[i]), &sid, GFP_KERNEL);
668 		if (rc) {
669 			printk(KERN_WARNING "SELinux: security_context_to_sid"
670 			       "(%s) failed for (dev %s, type %s) errno=%d\n",
671 			       mount_options[i], sb->s_id, name, rc);
672 			goto out;
673 		}
674 		switch (flags[i]) {
675 		case FSCONTEXT_MNT:
676 			fscontext_sid = sid;
677 
678 			if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid,
679 					fscontext_sid))
680 				goto out_double_mount;
681 
682 			sbsec->flags |= FSCONTEXT_MNT;
683 			break;
684 		case CONTEXT_MNT:
685 			context_sid = sid;
686 
687 			if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid,
688 					context_sid))
689 				goto out_double_mount;
690 
691 			sbsec->flags |= CONTEXT_MNT;
692 			break;
693 		case ROOTCONTEXT_MNT:
694 			rootcontext_sid = sid;
695 
696 			if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid,
697 					rootcontext_sid))
698 				goto out_double_mount;
699 
700 			sbsec->flags |= ROOTCONTEXT_MNT;
701 
702 			break;
703 		case DEFCONTEXT_MNT:
704 			defcontext_sid = sid;
705 
706 			if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid,
707 					defcontext_sid))
708 				goto out_double_mount;
709 
710 			sbsec->flags |= DEFCONTEXT_MNT;
711 
712 			break;
713 		default:
714 			rc = -EINVAL;
715 			goto out;
716 		}
717 	}
718 
719 	if (sbsec->flags & SE_SBINITIALIZED) {
720 		/* previously mounted with options, but not on this attempt? */
721 		if ((sbsec->flags & SE_MNTMASK) && !num_opts)
722 			goto out_double_mount;
723 		rc = 0;
724 		goto out;
725 	}
726 
727 	if (strcmp(sb->s_type->name, "proc") == 0)
728 		sbsec->flags |= SE_SBPROC;
729 
730 	if (!sbsec->behavior) {
731 		/*
732 		 * Determine the labeling behavior to use for this
733 		 * filesystem type.
734 		 */
735 		rc = security_fs_use(sb);
736 		if (rc) {
737 			printk(KERN_WARNING
738 				"%s: security_fs_use(%s) returned %d\n",
739 					__func__, sb->s_type->name, rc);
740 			goto out;
741 		}
742 	}
743 	/* sets the context of the superblock for the fs being mounted. */
744 	if (fscontext_sid) {
745 		rc = may_context_mount_sb_relabel(fscontext_sid, sbsec, cred);
746 		if (rc)
747 			goto out;
748 
749 		sbsec->sid = fscontext_sid;
750 	}
751 
752 	/*
753 	 * Switch to using mount point labeling behavior.
754 	 * sets the label used on all file below the mountpoint, and will set
755 	 * the superblock context if not already set.
756 	 */
757 	if (kern_flags & SECURITY_LSM_NATIVE_LABELS && !context_sid) {
758 		sbsec->behavior = SECURITY_FS_USE_NATIVE;
759 		*set_kern_flags |= SECURITY_LSM_NATIVE_LABELS;
760 	}
761 
762 	if (context_sid) {
763 		if (!fscontext_sid) {
764 			rc = may_context_mount_sb_relabel(context_sid, sbsec,
765 							  cred);
766 			if (rc)
767 				goto out;
768 			sbsec->sid = context_sid;
769 		} else {
770 			rc = may_context_mount_inode_relabel(context_sid, sbsec,
771 							     cred);
772 			if (rc)
773 				goto out;
774 		}
775 		if (!rootcontext_sid)
776 			rootcontext_sid = context_sid;
777 
778 		sbsec->mntpoint_sid = context_sid;
779 		sbsec->behavior = SECURITY_FS_USE_MNTPOINT;
780 	}
781 
782 	if (rootcontext_sid) {
783 		rc = may_context_mount_inode_relabel(rootcontext_sid, sbsec,
784 						     cred);
785 		if (rc)
786 			goto out;
787 
788 		root_isec->sid = rootcontext_sid;
789 		root_isec->initialized = 1;
790 	}
791 
792 	if (defcontext_sid) {
793 		if (sbsec->behavior != SECURITY_FS_USE_XATTR &&
794 			sbsec->behavior != SECURITY_FS_USE_NATIVE) {
795 			rc = -EINVAL;
796 			printk(KERN_WARNING "SELinux: defcontext option is "
797 			       "invalid for this filesystem type\n");
798 			goto out;
799 		}
800 
801 		if (defcontext_sid != sbsec->def_sid) {
802 			rc = may_context_mount_inode_relabel(defcontext_sid,
803 							     sbsec, cred);
804 			if (rc)
805 				goto out;
806 		}
807 
808 		sbsec->def_sid = defcontext_sid;
809 	}
810 
811 	rc = sb_finish_set_opts(sb);
812 out:
813 	mutex_unlock(&sbsec->lock);
814 	return rc;
815 out_double_mount:
816 	rc = -EINVAL;
817 	printk(KERN_WARNING "SELinux: mount invalid.  Same superblock, different "
818 	       "security settings for (dev %s, type %s)\n", sb->s_id, name);
819 	goto out;
820 }
821 
selinux_cmp_sb_context(const struct super_block * oldsb,const struct super_block * newsb)822 static int selinux_cmp_sb_context(const struct super_block *oldsb,
823 				    const struct super_block *newsb)
824 {
825 	struct superblock_security_struct *old = oldsb->s_security;
826 	struct superblock_security_struct *new = newsb->s_security;
827 	char oldflags = old->flags & SE_MNTMASK;
828 	char newflags = new->flags & SE_MNTMASK;
829 
830 	if (oldflags != newflags)
831 		goto mismatch;
832 	if ((oldflags & FSCONTEXT_MNT) && old->sid != new->sid)
833 		goto mismatch;
834 	if ((oldflags & CONTEXT_MNT) && old->mntpoint_sid != new->mntpoint_sid)
835 		goto mismatch;
836 	if ((oldflags & DEFCONTEXT_MNT) && old->def_sid != new->def_sid)
837 		goto mismatch;
838 	if (oldflags & ROOTCONTEXT_MNT) {
839 		struct inode_security_struct *oldroot = d_backing_inode(oldsb->s_root)->i_security;
840 		struct inode_security_struct *newroot = d_backing_inode(newsb->s_root)->i_security;
841 		if (oldroot->sid != newroot->sid)
842 			goto mismatch;
843 	}
844 	return 0;
845 mismatch:
846 	printk(KERN_WARNING "SELinux: mount invalid.  Same superblock, "
847 			    "different security settings for (dev %s, "
848 			    "type %s)\n", newsb->s_id, newsb->s_type->name);
849 	return -EBUSY;
850 }
851 
selinux_sb_clone_mnt_opts(const struct super_block * oldsb,struct super_block * newsb)852 static int selinux_sb_clone_mnt_opts(const struct super_block *oldsb,
853 					struct super_block *newsb)
854 {
855 	const struct superblock_security_struct *oldsbsec = oldsb->s_security;
856 	struct superblock_security_struct *newsbsec = newsb->s_security;
857 
858 	int set_fscontext =	(oldsbsec->flags & FSCONTEXT_MNT);
859 	int set_context =	(oldsbsec->flags & CONTEXT_MNT);
860 	int set_rootcontext =	(oldsbsec->flags & ROOTCONTEXT_MNT);
861 
862 	/*
863 	 * if the parent was able to be mounted it clearly had no special lsm
864 	 * mount options.  thus we can safely deal with this superblock later
865 	 */
866 	if (!ss_initialized)
867 		return 0;
868 
869 	/* how can we clone if the old one wasn't set up?? */
870 	BUG_ON(!(oldsbsec->flags & SE_SBINITIALIZED));
871 
872 	/* if fs is reusing a sb, make sure that the contexts match */
873 	if (newsbsec->flags & SE_SBINITIALIZED)
874 		return selinux_cmp_sb_context(oldsb, newsb);
875 
876 	mutex_lock(&newsbsec->lock);
877 
878 	newsbsec->flags = oldsbsec->flags;
879 
880 	newsbsec->sid = oldsbsec->sid;
881 	newsbsec->def_sid = oldsbsec->def_sid;
882 	newsbsec->behavior = oldsbsec->behavior;
883 
884 	if (set_context) {
885 		u32 sid = oldsbsec->mntpoint_sid;
886 
887 		if (!set_fscontext)
888 			newsbsec->sid = sid;
889 		if (!set_rootcontext) {
890 			struct inode *newinode = d_backing_inode(newsb->s_root);
891 			struct inode_security_struct *newisec = newinode->i_security;
892 			newisec->sid = sid;
893 		}
894 		newsbsec->mntpoint_sid = sid;
895 	}
896 	if (set_rootcontext) {
897 		const struct inode *oldinode = d_backing_inode(oldsb->s_root);
898 		const struct inode_security_struct *oldisec = oldinode->i_security;
899 		struct inode *newinode = d_backing_inode(newsb->s_root);
900 		struct inode_security_struct *newisec = newinode->i_security;
901 
902 		newisec->sid = oldisec->sid;
903 	}
904 
905 	sb_finish_set_opts(newsb);
906 	mutex_unlock(&newsbsec->lock);
907 	return 0;
908 }
909 
selinux_parse_opts_str(char * options,struct security_mnt_opts * opts)910 static int selinux_parse_opts_str(char *options,
911 				  struct security_mnt_opts *opts)
912 {
913 	char *p;
914 	char *context = NULL, *defcontext = NULL;
915 	char *fscontext = NULL, *rootcontext = NULL;
916 	int rc, num_mnt_opts = 0;
917 
918 	opts->num_mnt_opts = 0;
919 
920 	/* Standard string-based options. */
921 	while ((p = strsep(&options, "|")) != NULL) {
922 		int token;
923 		substring_t args[MAX_OPT_ARGS];
924 
925 		if (!*p)
926 			continue;
927 
928 		token = match_token(p, tokens, args);
929 
930 		switch (token) {
931 		case Opt_context:
932 			if (context || defcontext) {
933 				rc = -EINVAL;
934 				printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
935 				goto out_err;
936 			}
937 			context = match_strdup(&args[0]);
938 			if (!context) {
939 				rc = -ENOMEM;
940 				goto out_err;
941 			}
942 			break;
943 
944 		case Opt_fscontext:
945 			if (fscontext) {
946 				rc = -EINVAL;
947 				printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
948 				goto out_err;
949 			}
950 			fscontext = match_strdup(&args[0]);
951 			if (!fscontext) {
952 				rc = -ENOMEM;
953 				goto out_err;
954 			}
955 			break;
956 
957 		case Opt_rootcontext:
958 			if (rootcontext) {
959 				rc = -EINVAL;
960 				printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
961 				goto out_err;
962 			}
963 			rootcontext = match_strdup(&args[0]);
964 			if (!rootcontext) {
965 				rc = -ENOMEM;
966 				goto out_err;
967 			}
968 			break;
969 
970 		case Opt_defcontext:
971 			if (context || defcontext) {
972 				rc = -EINVAL;
973 				printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
974 				goto out_err;
975 			}
976 			defcontext = match_strdup(&args[0]);
977 			if (!defcontext) {
978 				rc = -ENOMEM;
979 				goto out_err;
980 			}
981 			break;
982 		case Opt_labelsupport:
983 			break;
984 		default:
985 			rc = -EINVAL;
986 			printk(KERN_WARNING "SELinux:  unknown mount option\n");
987 			goto out_err;
988 
989 		}
990 	}
991 
992 	rc = -ENOMEM;
993 	opts->mnt_opts = kcalloc(NUM_SEL_MNT_OPTS, sizeof(char *), GFP_ATOMIC);
994 	if (!opts->mnt_opts)
995 		goto out_err;
996 
997 	opts->mnt_opts_flags = kcalloc(NUM_SEL_MNT_OPTS, sizeof(int), GFP_ATOMIC);
998 	if (!opts->mnt_opts_flags) {
999 		kfree(opts->mnt_opts);
1000 		goto out_err;
1001 	}
1002 
1003 	if (fscontext) {
1004 		opts->mnt_opts[num_mnt_opts] = fscontext;
1005 		opts->mnt_opts_flags[num_mnt_opts++] = FSCONTEXT_MNT;
1006 	}
1007 	if (context) {
1008 		opts->mnt_opts[num_mnt_opts] = context;
1009 		opts->mnt_opts_flags[num_mnt_opts++] = CONTEXT_MNT;
1010 	}
1011 	if (rootcontext) {
1012 		opts->mnt_opts[num_mnt_opts] = rootcontext;
1013 		opts->mnt_opts_flags[num_mnt_opts++] = ROOTCONTEXT_MNT;
1014 	}
1015 	if (defcontext) {
1016 		opts->mnt_opts[num_mnt_opts] = defcontext;
1017 		opts->mnt_opts_flags[num_mnt_opts++] = DEFCONTEXT_MNT;
1018 	}
1019 
1020 	opts->num_mnt_opts = num_mnt_opts;
1021 	return 0;
1022 
1023 out_err:
1024 	kfree(context);
1025 	kfree(defcontext);
1026 	kfree(fscontext);
1027 	kfree(rootcontext);
1028 	return rc;
1029 }
1030 /*
1031  * string mount options parsing and call set the sbsec
1032  */
superblock_doinit(struct super_block * sb,void * data)1033 static int superblock_doinit(struct super_block *sb, void *data)
1034 {
1035 	int rc = 0;
1036 	char *options = data;
1037 	struct security_mnt_opts opts;
1038 
1039 	security_init_mnt_opts(&opts);
1040 
1041 	if (!data)
1042 		goto out;
1043 
1044 	BUG_ON(sb->s_type->fs_flags & FS_BINARY_MOUNTDATA);
1045 
1046 	rc = selinux_parse_opts_str(options, &opts);
1047 	if (rc)
1048 		goto out_err;
1049 
1050 out:
1051 	rc = selinux_set_mnt_opts(sb, &opts, 0, NULL);
1052 
1053 out_err:
1054 	security_free_mnt_opts(&opts);
1055 	return rc;
1056 }
1057 
selinux_write_opts(struct seq_file * m,struct security_mnt_opts * opts)1058 static void selinux_write_opts(struct seq_file *m,
1059 			       struct security_mnt_opts *opts)
1060 {
1061 	int i;
1062 	char *prefix;
1063 
1064 	for (i = 0; i < opts->num_mnt_opts; i++) {
1065 		char *has_comma;
1066 
1067 		if (opts->mnt_opts[i])
1068 			has_comma = strchr(opts->mnt_opts[i], ',');
1069 		else
1070 			has_comma = NULL;
1071 
1072 		switch (opts->mnt_opts_flags[i]) {
1073 		case CONTEXT_MNT:
1074 			prefix = CONTEXT_STR;
1075 			break;
1076 		case FSCONTEXT_MNT:
1077 			prefix = FSCONTEXT_STR;
1078 			break;
1079 		case ROOTCONTEXT_MNT:
1080 			prefix = ROOTCONTEXT_STR;
1081 			break;
1082 		case DEFCONTEXT_MNT:
1083 			prefix = DEFCONTEXT_STR;
1084 			break;
1085 		case SBLABEL_MNT:
1086 			seq_putc(m, ',');
1087 			seq_puts(m, LABELSUPP_STR);
1088 			continue;
1089 		default:
1090 			BUG();
1091 			return;
1092 		};
1093 		/* we need a comma before each option */
1094 		seq_putc(m, ',');
1095 		seq_puts(m, prefix);
1096 		if (has_comma)
1097 			seq_putc(m, '\"');
1098 		seq_escape(m, opts->mnt_opts[i], "\"\n\\");
1099 		if (has_comma)
1100 			seq_putc(m, '\"');
1101 	}
1102 }
1103 
selinux_sb_show_options(struct seq_file * m,struct super_block * sb)1104 static int selinux_sb_show_options(struct seq_file *m, struct super_block *sb)
1105 {
1106 	struct security_mnt_opts opts;
1107 	int rc;
1108 
1109 	rc = selinux_get_mnt_opts(sb, &opts);
1110 	if (rc) {
1111 		/* before policy load we may get EINVAL, don't show anything */
1112 		if (rc == -EINVAL)
1113 			rc = 0;
1114 		return rc;
1115 	}
1116 
1117 	selinux_write_opts(m, &opts);
1118 
1119 	security_free_mnt_opts(&opts);
1120 
1121 	return rc;
1122 }
1123 
inode_mode_to_security_class(umode_t mode)1124 static inline u16 inode_mode_to_security_class(umode_t mode)
1125 {
1126 	switch (mode & S_IFMT) {
1127 	case S_IFSOCK:
1128 		return SECCLASS_SOCK_FILE;
1129 	case S_IFLNK:
1130 		return SECCLASS_LNK_FILE;
1131 	case S_IFREG:
1132 		return SECCLASS_FILE;
1133 	case S_IFBLK:
1134 		return SECCLASS_BLK_FILE;
1135 	case S_IFDIR:
1136 		return SECCLASS_DIR;
1137 	case S_IFCHR:
1138 		return SECCLASS_CHR_FILE;
1139 	case S_IFIFO:
1140 		return SECCLASS_FIFO_FILE;
1141 
1142 	}
1143 
1144 	return SECCLASS_FILE;
1145 }
1146 
default_protocol_stream(int protocol)1147 static inline int default_protocol_stream(int protocol)
1148 {
1149 	return (protocol == IPPROTO_IP || protocol == IPPROTO_TCP);
1150 }
1151 
default_protocol_dgram(int protocol)1152 static inline int default_protocol_dgram(int protocol)
1153 {
1154 	return (protocol == IPPROTO_IP || protocol == IPPROTO_UDP);
1155 }
1156 
socket_type_to_security_class(int family,int type,int protocol)1157 static inline u16 socket_type_to_security_class(int family, int type, int protocol)
1158 {
1159 	switch (family) {
1160 	case PF_UNIX:
1161 		switch (type) {
1162 		case SOCK_STREAM:
1163 		case SOCK_SEQPACKET:
1164 			return SECCLASS_UNIX_STREAM_SOCKET;
1165 		case SOCK_DGRAM:
1166 			return SECCLASS_UNIX_DGRAM_SOCKET;
1167 		}
1168 		break;
1169 	case PF_INET:
1170 	case PF_INET6:
1171 		switch (type) {
1172 		case SOCK_STREAM:
1173 			if (default_protocol_stream(protocol))
1174 				return SECCLASS_TCP_SOCKET;
1175 			else
1176 				return SECCLASS_RAWIP_SOCKET;
1177 		case SOCK_DGRAM:
1178 			if (default_protocol_dgram(protocol))
1179 				return SECCLASS_UDP_SOCKET;
1180 			else
1181 				return SECCLASS_RAWIP_SOCKET;
1182 		case SOCK_DCCP:
1183 			return SECCLASS_DCCP_SOCKET;
1184 		default:
1185 			return SECCLASS_RAWIP_SOCKET;
1186 		}
1187 		break;
1188 	case PF_NETLINK:
1189 		switch (protocol) {
1190 		case NETLINK_ROUTE:
1191 			return SECCLASS_NETLINK_ROUTE_SOCKET;
1192 		case NETLINK_FIREWALL:
1193 			return SECCLASS_NETLINK_FIREWALL_SOCKET;
1194 		case NETLINK_SOCK_DIAG:
1195 			return SECCLASS_NETLINK_TCPDIAG_SOCKET;
1196 		case NETLINK_NFLOG:
1197 			return SECCLASS_NETLINK_NFLOG_SOCKET;
1198 		case NETLINK_XFRM:
1199 			return SECCLASS_NETLINK_XFRM_SOCKET;
1200 		case NETLINK_SELINUX:
1201 			return SECCLASS_NETLINK_SELINUX_SOCKET;
1202 		case NETLINK_AUDIT:
1203 			return SECCLASS_NETLINK_AUDIT_SOCKET;
1204 		case NETLINK_IP6_FW:
1205 			return SECCLASS_NETLINK_IP6FW_SOCKET;
1206 		case NETLINK_DNRTMSG:
1207 			return SECCLASS_NETLINK_DNRT_SOCKET;
1208 		case NETLINK_KOBJECT_UEVENT:
1209 			return SECCLASS_NETLINK_KOBJECT_UEVENT_SOCKET;
1210 		default:
1211 			return SECCLASS_NETLINK_SOCKET;
1212 		}
1213 	case PF_PACKET:
1214 		return SECCLASS_PACKET_SOCKET;
1215 	case PF_KEY:
1216 		return SECCLASS_KEY_SOCKET;
1217 	case PF_APPLETALK:
1218 		return SECCLASS_APPLETALK_SOCKET;
1219 	}
1220 
1221 	return SECCLASS_SOCKET;
1222 }
1223 
1224 #ifdef CONFIG_PROC_FS
selinux_proc_get_sid(struct dentry * dentry,u16 tclass,u32 * sid)1225 static int selinux_proc_get_sid(struct dentry *dentry,
1226 				u16 tclass,
1227 				u32 *sid)
1228 {
1229 	int rc;
1230 	char *buffer, *path;
1231 
1232 	buffer = (char *)__get_free_page(GFP_KERNEL);
1233 	if (!buffer)
1234 		return -ENOMEM;
1235 
1236 	path = dentry_path_raw(dentry, buffer, PAGE_SIZE);
1237 	if (IS_ERR(path))
1238 		rc = PTR_ERR(path);
1239 	else {
1240 		/* each process gets a /proc/PID/ entry. Strip off the
1241 		 * PID part to get a valid selinux labeling.
1242 		 * e.g. /proc/1/net/rpc/nfs -> /net/rpc/nfs */
1243 		while (path[1] >= '0' && path[1] <= '9') {
1244 			path[1] = '/';
1245 			path++;
1246 		}
1247 		rc = security_genfs_sid("proc", path, tclass, sid);
1248 	}
1249 	free_page((unsigned long)buffer);
1250 	return rc;
1251 }
1252 #else
selinux_proc_get_sid(struct dentry * dentry,u16 tclass,u32 * sid)1253 static int selinux_proc_get_sid(struct dentry *dentry,
1254 				u16 tclass,
1255 				u32 *sid)
1256 {
1257 	return -EINVAL;
1258 }
1259 #endif
1260 
1261 /* The inode's security attributes must be initialized before first use. */
inode_doinit_with_dentry(struct inode * inode,struct dentry * opt_dentry)1262 static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry)
1263 {
1264 	struct superblock_security_struct *sbsec = NULL;
1265 	struct inode_security_struct *isec = inode->i_security;
1266 	u32 sid;
1267 	struct dentry *dentry;
1268 #define INITCONTEXTLEN 255
1269 	char *context = NULL;
1270 	unsigned len = 0;
1271 	int rc = 0;
1272 
1273 	if (isec->initialized)
1274 		goto out;
1275 
1276 	mutex_lock(&isec->lock);
1277 	if (isec->initialized)
1278 		goto out_unlock;
1279 
1280 	sbsec = inode->i_sb->s_security;
1281 	if (!(sbsec->flags & SE_SBINITIALIZED)) {
1282 		/* Defer initialization until selinux_complete_init,
1283 		   after the initial policy is loaded and the security
1284 		   server is ready to handle calls. */
1285 		spin_lock(&sbsec->isec_lock);
1286 		if (list_empty(&isec->list))
1287 			list_add(&isec->list, &sbsec->isec_head);
1288 		spin_unlock(&sbsec->isec_lock);
1289 		goto out_unlock;
1290 	}
1291 
1292 	switch (sbsec->behavior) {
1293 	case SECURITY_FS_USE_NATIVE:
1294 		break;
1295 	case SECURITY_FS_USE_XATTR:
1296 		if (!inode->i_op->getxattr) {
1297 			isec->sid = sbsec->def_sid;
1298 			break;
1299 		}
1300 
1301 		/* Need a dentry, since the xattr API requires one.
1302 		   Life would be simpler if we could just pass the inode. */
1303 		if (opt_dentry) {
1304 			/* Called from d_instantiate or d_splice_alias. */
1305 			dentry = dget(opt_dentry);
1306 		} else {
1307 			/* Called from selinux_complete_init, try to find a dentry. */
1308 			dentry = d_find_alias(inode);
1309 		}
1310 		if (!dentry) {
1311 			/*
1312 			 * this is can be hit on boot when a file is accessed
1313 			 * before the policy is loaded.  When we load policy we
1314 			 * may find inodes that have no dentry on the
1315 			 * sbsec->isec_head list.  No reason to complain as these
1316 			 * will get fixed up the next time we go through
1317 			 * inode_doinit with a dentry, before these inodes could
1318 			 * be used again by userspace.
1319 			 */
1320 			goto out_unlock;
1321 		}
1322 
1323 		len = INITCONTEXTLEN;
1324 		context = kmalloc(len+1, GFP_NOFS);
1325 		if (!context) {
1326 			rc = -ENOMEM;
1327 			dput(dentry);
1328 			goto out_unlock;
1329 		}
1330 		context[len] = '\0';
1331 		rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX,
1332 					   context, len);
1333 		if (rc == -ERANGE) {
1334 			kfree(context);
1335 
1336 			/* Need a larger buffer.  Query for the right size. */
1337 			rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX,
1338 						   NULL, 0);
1339 			if (rc < 0) {
1340 				dput(dentry);
1341 				goto out_unlock;
1342 			}
1343 			len = rc;
1344 			context = kmalloc(len+1, GFP_NOFS);
1345 			if (!context) {
1346 				rc = -ENOMEM;
1347 				dput(dentry);
1348 				goto out_unlock;
1349 			}
1350 			context[len] = '\0';
1351 			rc = inode->i_op->getxattr(dentry,
1352 						   XATTR_NAME_SELINUX,
1353 						   context, len);
1354 		}
1355 		dput(dentry);
1356 		if (rc < 0) {
1357 			if (rc != -ENODATA) {
1358 				printk(KERN_WARNING "SELinux: %s:  getxattr returned "
1359 				       "%d for dev=%s ino=%ld\n", __func__,
1360 				       -rc, inode->i_sb->s_id, inode->i_ino);
1361 				kfree(context);
1362 				goto out_unlock;
1363 			}
1364 			/* Map ENODATA to the default file SID */
1365 			sid = sbsec->def_sid;
1366 			rc = 0;
1367 		} else {
1368 			rc = security_context_to_sid_default(context, rc, &sid,
1369 							     sbsec->def_sid,
1370 							     GFP_NOFS);
1371 			if (rc) {
1372 				char *dev = inode->i_sb->s_id;
1373 				unsigned long ino = inode->i_ino;
1374 
1375 				if (rc == -EINVAL) {
1376 					if (printk_ratelimit())
1377 						printk(KERN_NOTICE "SELinux: inode=%lu on dev=%s was found to have an invalid "
1378 							"context=%s.  This indicates you may need to relabel the inode or the "
1379 							"filesystem in question.\n", ino, dev, context);
1380 				} else {
1381 					printk(KERN_WARNING "SELinux: %s:  context_to_sid(%s) "
1382 					       "returned %d for dev=%s ino=%ld\n",
1383 					       __func__, context, -rc, dev, ino);
1384 				}
1385 				kfree(context);
1386 				/* Leave with the unlabeled SID */
1387 				rc = 0;
1388 				break;
1389 			}
1390 		}
1391 		kfree(context);
1392 		isec->sid = sid;
1393 		break;
1394 	case SECURITY_FS_USE_TASK:
1395 		isec->sid = isec->task_sid;
1396 		break;
1397 	case SECURITY_FS_USE_TRANS:
1398 		/* Default to the fs SID. */
1399 		isec->sid = sbsec->sid;
1400 
1401 		/* Try to obtain a transition SID. */
1402 		isec->sclass = inode_mode_to_security_class(inode->i_mode);
1403 		rc = security_transition_sid(isec->task_sid, sbsec->sid,
1404 					     isec->sclass, NULL, &sid);
1405 		if (rc)
1406 			goto out_unlock;
1407 		isec->sid = sid;
1408 		break;
1409 	case SECURITY_FS_USE_MNTPOINT:
1410 		isec->sid = sbsec->mntpoint_sid;
1411 		break;
1412 	default:
1413 		/* Default to the fs superblock SID. */
1414 		isec->sid = sbsec->sid;
1415 
1416 		if ((sbsec->flags & SE_SBPROC) && !S_ISLNK(inode->i_mode)) {
1417 			/* We must have a dentry to determine the label on
1418 			 * procfs inodes */
1419 			if (opt_dentry)
1420 				/* Called from d_instantiate or
1421 				 * d_splice_alias. */
1422 				dentry = dget(opt_dentry);
1423 			else
1424 				/* Called from selinux_complete_init, try to
1425 				 * find a dentry. */
1426 				dentry = d_find_alias(inode);
1427 			/*
1428 			 * This can be hit on boot when a file is accessed
1429 			 * before the policy is loaded.  When we load policy we
1430 			 * may find inodes that have no dentry on the
1431 			 * sbsec->isec_head list.  No reason to complain as
1432 			 * these will get fixed up the next time we go through
1433 			 * inode_doinit() with a dentry, before these inodes
1434 			 * could be used again by userspace.
1435 			 */
1436 			if (!dentry)
1437 				goto out_unlock;
1438 			isec->sclass = inode_mode_to_security_class(inode->i_mode);
1439 			rc = selinux_proc_get_sid(dentry, isec->sclass, &sid);
1440 			dput(dentry);
1441 			if (rc)
1442 				goto out_unlock;
1443 			isec->sid = sid;
1444 		}
1445 		break;
1446 	}
1447 
1448 	isec->initialized = 1;
1449 
1450 out_unlock:
1451 	mutex_unlock(&isec->lock);
1452 out:
1453 	if (isec->sclass == SECCLASS_FILE)
1454 		isec->sclass = inode_mode_to_security_class(inode->i_mode);
1455 	return rc;
1456 }
1457 
1458 /* Convert a Linux signal to an access vector. */
signal_to_av(int sig)1459 static inline u32 signal_to_av(int sig)
1460 {
1461 	u32 perm = 0;
1462 
1463 	switch (sig) {
1464 	case SIGCHLD:
1465 		/* Commonly granted from child to parent. */
1466 		perm = PROCESS__SIGCHLD;
1467 		break;
1468 	case SIGKILL:
1469 		/* Cannot be caught or ignored */
1470 		perm = PROCESS__SIGKILL;
1471 		break;
1472 	case SIGSTOP:
1473 		/* Cannot be caught or ignored */
1474 		perm = PROCESS__SIGSTOP;
1475 		break;
1476 	default:
1477 		/* All other signals. */
1478 		perm = PROCESS__SIGNAL;
1479 		break;
1480 	}
1481 
1482 	return perm;
1483 }
1484 
1485 /*
1486  * Check permission between a pair of credentials
1487  * fork check, ptrace check, etc.
1488  */
cred_has_perm(const struct cred * actor,const struct cred * target,u32 perms)1489 static int cred_has_perm(const struct cred *actor,
1490 			 const struct cred *target,
1491 			 u32 perms)
1492 {
1493 	u32 asid = cred_sid(actor), tsid = cred_sid(target);
1494 
1495 	return avc_has_perm(asid, tsid, SECCLASS_PROCESS, perms, NULL);
1496 }
1497 
1498 /*
1499  * Check permission between a pair of tasks, e.g. signal checks,
1500  * fork check, ptrace check, etc.
1501  * tsk1 is the actor and tsk2 is the target
1502  * - this uses the default subjective creds of tsk1
1503  */
task_has_perm(const struct task_struct * tsk1,const struct task_struct * tsk2,u32 perms)1504 static int task_has_perm(const struct task_struct *tsk1,
1505 			 const struct task_struct *tsk2,
1506 			 u32 perms)
1507 {
1508 	const struct task_security_struct *__tsec1, *__tsec2;
1509 	u32 sid1, sid2;
1510 
1511 	rcu_read_lock();
1512 	__tsec1 = __task_cred(tsk1)->security;	sid1 = __tsec1->sid;
1513 	__tsec2 = __task_cred(tsk2)->security;	sid2 = __tsec2->sid;
1514 	rcu_read_unlock();
1515 	return avc_has_perm(sid1, sid2, SECCLASS_PROCESS, perms, NULL);
1516 }
1517 
1518 /*
1519  * Check permission between current and another task, e.g. signal checks,
1520  * fork check, ptrace check, etc.
1521  * current is the actor and tsk2 is the target
1522  * - this uses current's subjective creds
1523  */
current_has_perm(const struct task_struct * tsk,u32 perms)1524 static int current_has_perm(const struct task_struct *tsk,
1525 			    u32 perms)
1526 {
1527 	u32 sid, tsid;
1528 
1529 	sid = current_sid();
1530 	tsid = task_sid(tsk);
1531 	return avc_has_perm(sid, tsid, SECCLASS_PROCESS, perms, NULL);
1532 }
1533 
1534 #if CAP_LAST_CAP > 63
1535 #error Fix SELinux to handle capabilities > 63.
1536 #endif
1537 
1538 /* Check whether a task is allowed to use a capability. */
cred_has_capability(const struct cred * cred,int cap,int audit)1539 static int cred_has_capability(const struct cred *cred,
1540 			       int cap, int audit)
1541 {
1542 	struct common_audit_data ad;
1543 	struct av_decision avd;
1544 	u16 sclass;
1545 	u32 sid = cred_sid(cred);
1546 	u32 av = CAP_TO_MASK(cap);
1547 	int rc;
1548 
1549 	ad.type = LSM_AUDIT_DATA_CAP;
1550 	ad.u.cap = cap;
1551 
1552 	switch (CAP_TO_INDEX(cap)) {
1553 	case 0:
1554 		sclass = SECCLASS_CAPABILITY;
1555 		break;
1556 	case 1:
1557 		sclass = SECCLASS_CAPABILITY2;
1558 		break;
1559 	default:
1560 		printk(KERN_ERR
1561 		       "SELinux:  out of range capability %d\n", cap);
1562 		BUG();
1563 		return -EINVAL;
1564 	}
1565 
1566 	rc = avc_has_perm_noaudit(sid, sid, sclass, av, 0, &avd);
1567 	if (audit == SECURITY_CAP_AUDIT) {
1568 		int rc2 = avc_audit(sid, sid, sclass, av, &avd, rc, &ad);
1569 		if (rc2)
1570 			return rc2;
1571 	}
1572 	return rc;
1573 }
1574 
1575 /* Check whether a task is allowed to use a system operation. */
task_has_system(struct task_struct * tsk,u32 perms)1576 static int task_has_system(struct task_struct *tsk,
1577 			   u32 perms)
1578 {
1579 	u32 sid = task_sid(tsk);
1580 
1581 	return avc_has_perm(sid, SECINITSID_KERNEL,
1582 			    SECCLASS_SYSTEM, perms, NULL);
1583 }
1584 
1585 /* Check whether a task has a particular permission to an inode.
1586    The 'adp' parameter is optional and allows other audit
1587    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)1588 static int inode_has_perm(const struct cred *cred,
1589 			  struct inode *inode,
1590 			  u32 perms,
1591 			  struct common_audit_data *adp)
1592 {
1593 	struct inode_security_struct *isec;
1594 	u32 sid;
1595 
1596 	validate_creds(cred);
1597 
1598 	if (unlikely(IS_PRIVATE(inode)))
1599 		return 0;
1600 
1601 	sid = cred_sid(cred);
1602 	isec = inode->i_security;
1603 
1604 	return avc_has_perm(sid, isec->sid, isec->sclass, perms, adp);
1605 }
1606 
1607 /* Same as inode_has_perm, but pass explicit audit data containing
1608    the dentry to help the auditing code to more easily generate the
1609    pathname if needed. */
dentry_has_perm(const struct cred * cred,struct dentry * dentry,u32 av)1610 static inline int dentry_has_perm(const struct cred *cred,
1611 				  struct dentry *dentry,
1612 				  u32 av)
1613 {
1614 	struct inode *inode = d_backing_inode(dentry);
1615 	struct common_audit_data ad;
1616 
1617 	ad.type = LSM_AUDIT_DATA_DENTRY;
1618 	ad.u.dentry = dentry;
1619 	return inode_has_perm(cred, inode, av, &ad);
1620 }
1621 
1622 /* Same as inode_has_perm, but pass explicit audit data containing
1623    the path to help the auditing code to more easily generate the
1624    pathname if needed. */
path_has_perm(const struct cred * cred,const struct path * path,u32 av)1625 static inline int path_has_perm(const struct cred *cred,
1626 				const struct path *path,
1627 				u32 av)
1628 {
1629 	struct inode *inode = d_backing_inode(path->dentry);
1630 	struct common_audit_data ad;
1631 
1632 	ad.type = LSM_AUDIT_DATA_PATH;
1633 	ad.u.path = *path;
1634 	return inode_has_perm(cred, inode, av, &ad);
1635 }
1636 
1637 /* 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)1638 static inline int file_path_has_perm(const struct cred *cred,
1639 				     struct file *file,
1640 				     u32 av)
1641 {
1642 	struct common_audit_data ad;
1643 
1644 	ad.type = LSM_AUDIT_DATA_PATH;
1645 	ad.u.path = file->f_path;
1646 	return inode_has_perm(cred, file_inode(file), av, &ad);
1647 }
1648 
1649 /* Check whether a task can use an open file descriptor to
1650    access an inode in a given way.  Check access to the
1651    descriptor itself, and then use dentry_has_perm to
1652    check a particular permission to the file.
1653    Access to the descriptor is implicitly granted if it
1654    has the same SID as the process.  If av is zero, then
1655    access to the file is not checked, e.g. for cases
1656    where only the descriptor is affected like seek. */
file_has_perm(const struct cred * cred,struct file * file,u32 av)1657 static int file_has_perm(const struct cred *cred,
1658 			 struct file *file,
1659 			 u32 av)
1660 {
1661 	struct file_security_struct *fsec = file->f_security;
1662 	struct inode *inode = file_inode(file);
1663 	struct common_audit_data ad;
1664 	u32 sid = cred_sid(cred);
1665 	int rc;
1666 
1667 	ad.type = LSM_AUDIT_DATA_PATH;
1668 	ad.u.path = file->f_path;
1669 
1670 	if (sid != fsec->sid) {
1671 		rc = avc_has_perm(sid, fsec->sid,
1672 				  SECCLASS_FD,
1673 				  FD__USE,
1674 				  &ad);
1675 		if (rc)
1676 			goto out;
1677 	}
1678 
1679 	/* av is zero if only checking access to the descriptor. */
1680 	rc = 0;
1681 	if (av)
1682 		rc = inode_has_perm(cred, inode, av, &ad);
1683 
1684 out:
1685 	return rc;
1686 }
1687 
1688 /* Check whether a task can create a file. */
may_create(struct inode * dir,struct dentry * dentry,u16 tclass)1689 static int may_create(struct inode *dir,
1690 		      struct dentry *dentry,
1691 		      u16 tclass)
1692 {
1693 	const struct task_security_struct *tsec = current_security();
1694 	struct inode_security_struct *dsec;
1695 	struct superblock_security_struct *sbsec;
1696 	u32 sid, newsid;
1697 	struct common_audit_data ad;
1698 	int rc;
1699 
1700 	dsec = dir->i_security;
1701 	sbsec = dir->i_sb->s_security;
1702 
1703 	sid = tsec->sid;
1704 	newsid = tsec->create_sid;
1705 
1706 	ad.type = LSM_AUDIT_DATA_DENTRY;
1707 	ad.u.dentry = dentry;
1708 
1709 	rc = avc_has_perm(sid, dsec->sid, SECCLASS_DIR,
1710 			  DIR__ADD_NAME | DIR__SEARCH,
1711 			  &ad);
1712 	if (rc)
1713 		return rc;
1714 
1715 	if (!newsid || !(sbsec->flags & SBLABEL_MNT)) {
1716 		rc = security_transition_sid(sid, dsec->sid, tclass,
1717 					     &dentry->d_name, &newsid);
1718 		if (rc)
1719 			return rc;
1720 	}
1721 
1722 	rc = avc_has_perm(sid, newsid, tclass, FILE__CREATE, &ad);
1723 	if (rc)
1724 		return rc;
1725 
1726 	return avc_has_perm(newsid, sbsec->sid,
1727 			    SECCLASS_FILESYSTEM,
1728 			    FILESYSTEM__ASSOCIATE, &ad);
1729 }
1730 
1731 /* Check whether a task can create a key. */
may_create_key(u32 ksid,struct task_struct * ctx)1732 static int may_create_key(u32 ksid,
1733 			  struct task_struct *ctx)
1734 {
1735 	u32 sid = task_sid(ctx);
1736 
1737 	return avc_has_perm(sid, ksid, SECCLASS_KEY, KEY__CREATE, NULL);
1738 }
1739 
1740 #define MAY_LINK	0
1741 #define MAY_UNLINK	1
1742 #define MAY_RMDIR	2
1743 
1744 /* Check whether a task can link, unlink, or rmdir a file/directory. */
may_link(struct inode * dir,struct dentry * dentry,int kind)1745 static int may_link(struct inode *dir,
1746 		    struct dentry *dentry,
1747 		    int kind)
1748 
1749 {
1750 	struct inode_security_struct *dsec, *isec;
1751 	struct common_audit_data ad;
1752 	u32 sid = current_sid();
1753 	u32 av;
1754 	int rc;
1755 
1756 	dsec = dir->i_security;
1757 	isec = d_backing_inode(dentry)->i_security;
1758 
1759 	ad.type = LSM_AUDIT_DATA_DENTRY;
1760 	ad.u.dentry = dentry;
1761 
1762 	av = DIR__SEARCH;
1763 	av |= (kind ? DIR__REMOVE_NAME : DIR__ADD_NAME);
1764 	rc = avc_has_perm(sid, dsec->sid, SECCLASS_DIR, av, &ad);
1765 	if (rc)
1766 		return rc;
1767 
1768 	switch (kind) {
1769 	case MAY_LINK:
1770 		av = FILE__LINK;
1771 		break;
1772 	case MAY_UNLINK:
1773 		av = FILE__UNLINK;
1774 		break;
1775 	case MAY_RMDIR:
1776 		av = DIR__RMDIR;
1777 		break;
1778 	default:
1779 		printk(KERN_WARNING "SELinux: %s:  unrecognized kind %d\n",
1780 			__func__, kind);
1781 		return 0;
1782 	}
1783 
1784 	rc = avc_has_perm(sid, isec->sid, isec->sclass, av, &ad);
1785 	return rc;
1786 }
1787 
may_rename(struct inode * old_dir,struct dentry * old_dentry,struct inode * new_dir,struct dentry * new_dentry)1788 static inline int may_rename(struct inode *old_dir,
1789 			     struct dentry *old_dentry,
1790 			     struct inode *new_dir,
1791 			     struct dentry *new_dentry)
1792 {
1793 	struct inode_security_struct *old_dsec, *new_dsec, *old_isec, *new_isec;
1794 	struct common_audit_data ad;
1795 	u32 sid = current_sid();
1796 	u32 av;
1797 	int old_is_dir, new_is_dir;
1798 	int rc;
1799 
1800 	old_dsec = old_dir->i_security;
1801 	old_isec = d_backing_inode(old_dentry)->i_security;
1802 	old_is_dir = d_is_dir(old_dentry);
1803 	new_dsec = new_dir->i_security;
1804 
1805 	ad.type = LSM_AUDIT_DATA_DENTRY;
1806 
1807 	ad.u.dentry = old_dentry;
1808 	rc = avc_has_perm(sid, old_dsec->sid, SECCLASS_DIR,
1809 			  DIR__REMOVE_NAME | DIR__SEARCH, &ad);
1810 	if (rc)
1811 		return rc;
1812 	rc = avc_has_perm(sid, old_isec->sid,
1813 			  old_isec->sclass, FILE__RENAME, &ad);
1814 	if (rc)
1815 		return rc;
1816 	if (old_is_dir && new_dir != old_dir) {
1817 		rc = avc_has_perm(sid, old_isec->sid,
1818 				  old_isec->sclass, DIR__REPARENT, &ad);
1819 		if (rc)
1820 			return rc;
1821 	}
1822 
1823 	ad.u.dentry = new_dentry;
1824 	av = DIR__ADD_NAME | DIR__SEARCH;
1825 	if (d_is_positive(new_dentry))
1826 		av |= DIR__REMOVE_NAME;
1827 	rc = avc_has_perm(sid, new_dsec->sid, SECCLASS_DIR, av, &ad);
1828 	if (rc)
1829 		return rc;
1830 	if (d_is_positive(new_dentry)) {
1831 		new_isec = d_backing_inode(new_dentry)->i_security;
1832 		new_is_dir = d_is_dir(new_dentry);
1833 		rc = avc_has_perm(sid, new_isec->sid,
1834 				  new_isec->sclass,
1835 				  (new_is_dir ? DIR__RMDIR : FILE__UNLINK), &ad);
1836 		if (rc)
1837 			return rc;
1838 	}
1839 
1840 	return 0;
1841 }
1842 
1843 /* 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)1844 static int superblock_has_perm(const struct cred *cred,
1845 			       struct super_block *sb,
1846 			       u32 perms,
1847 			       struct common_audit_data *ad)
1848 {
1849 	struct superblock_security_struct *sbsec;
1850 	u32 sid = cred_sid(cred);
1851 
1852 	sbsec = sb->s_security;
1853 	return avc_has_perm(sid, sbsec->sid, SECCLASS_FILESYSTEM, perms, ad);
1854 }
1855 
1856 /* Convert a Linux mode and permission mask to an access vector. */
file_mask_to_av(int mode,int mask)1857 static inline u32 file_mask_to_av(int mode, int mask)
1858 {
1859 	u32 av = 0;
1860 
1861 	if (!S_ISDIR(mode)) {
1862 		if (mask & MAY_EXEC)
1863 			av |= FILE__EXECUTE;
1864 		if (mask & MAY_READ)
1865 			av |= FILE__READ;
1866 
1867 		if (mask & MAY_APPEND)
1868 			av |= FILE__APPEND;
1869 		else if (mask & MAY_WRITE)
1870 			av |= FILE__WRITE;
1871 
1872 	} else {
1873 		if (mask & MAY_EXEC)
1874 			av |= DIR__SEARCH;
1875 		if (mask & MAY_WRITE)
1876 			av |= DIR__WRITE;
1877 		if (mask & MAY_READ)
1878 			av |= DIR__READ;
1879 	}
1880 
1881 	return av;
1882 }
1883 
1884 /* Convert a Linux file to an access vector. */
file_to_av(struct file * file)1885 static inline u32 file_to_av(struct file *file)
1886 {
1887 	u32 av = 0;
1888 
1889 	if (file->f_mode & FMODE_READ)
1890 		av |= FILE__READ;
1891 	if (file->f_mode & FMODE_WRITE) {
1892 		if (file->f_flags & O_APPEND)
1893 			av |= FILE__APPEND;
1894 		else
1895 			av |= FILE__WRITE;
1896 	}
1897 	if (!av) {
1898 		/*
1899 		 * Special file opened with flags 3 for ioctl-only use.
1900 		 */
1901 		av = FILE__IOCTL;
1902 	}
1903 
1904 	return av;
1905 }
1906 
1907 /*
1908  * Convert a file to an access vector and include the correct open
1909  * open permission.
1910  */
open_file_to_av(struct file * file)1911 static inline u32 open_file_to_av(struct file *file)
1912 {
1913 	u32 av = file_to_av(file);
1914 
1915 	if (selinux_policycap_openperm)
1916 		av |= FILE__OPEN;
1917 
1918 	return av;
1919 }
1920 
1921 /* Hook functions begin here. */
1922 
selinux_binder_set_context_mgr(struct task_struct * mgr)1923 static int selinux_binder_set_context_mgr(struct task_struct *mgr)
1924 {
1925 	u32 mysid = current_sid();
1926 	u32 mgrsid = task_sid(mgr);
1927 
1928 	return avc_has_perm(mysid, mgrsid, SECCLASS_BINDER,
1929 			    BINDER__SET_CONTEXT_MGR, NULL);
1930 }
1931 
selinux_binder_transaction(struct task_struct * from,struct task_struct * to)1932 static int selinux_binder_transaction(struct task_struct *from,
1933 				      struct task_struct *to)
1934 {
1935 	u32 mysid = current_sid();
1936 	u32 fromsid = task_sid(from);
1937 	u32 tosid = task_sid(to);
1938 	int rc;
1939 
1940 	if (mysid != fromsid) {
1941 		rc = avc_has_perm(mysid, fromsid, SECCLASS_BINDER,
1942 				  BINDER__IMPERSONATE, NULL);
1943 		if (rc)
1944 			return rc;
1945 	}
1946 
1947 	return avc_has_perm(fromsid, tosid, SECCLASS_BINDER, BINDER__CALL,
1948 			    NULL);
1949 }
1950 
selinux_binder_transfer_binder(struct task_struct * from,struct task_struct * to)1951 static int selinux_binder_transfer_binder(struct task_struct *from,
1952 					  struct task_struct *to)
1953 {
1954 	u32 fromsid = task_sid(from);
1955 	u32 tosid = task_sid(to);
1956 
1957 	return avc_has_perm(fromsid, tosid, SECCLASS_BINDER, BINDER__TRANSFER,
1958 			    NULL);
1959 }
1960 
selinux_binder_transfer_file(struct task_struct * from,struct task_struct * to,struct file * file)1961 static int selinux_binder_transfer_file(struct task_struct *from,
1962 					struct task_struct *to,
1963 					struct file *file)
1964 {
1965 	u32 sid = task_sid(to);
1966 	struct file_security_struct *fsec = file->f_security;
1967 	struct inode *inode = d_backing_inode(file->f_path.dentry);
1968 	struct inode_security_struct *isec = inode->i_security;
1969 	struct common_audit_data ad;
1970 	int rc;
1971 
1972 	ad.type = LSM_AUDIT_DATA_PATH;
1973 	ad.u.path = file->f_path;
1974 
1975 	if (sid != fsec->sid) {
1976 		rc = avc_has_perm(sid, fsec->sid,
1977 				  SECCLASS_FD,
1978 				  FD__USE,
1979 				  &ad);
1980 		if (rc)
1981 			return rc;
1982 	}
1983 
1984 	if (unlikely(IS_PRIVATE(inode)))
1985 		return 0;
1986 
1987 	return avc_has_perm(sid, isec->sid, isec->sclass, file_to_av(file),
1988 			    &ad);
1989 }
1990 
selinux_ptrace_access_check(struct task_struct * child,unsigned int mode)1991 static int selinux_ptrace_access_check(struct task_struct *child,
1992 				     unsigned int mode)
1993 {
1994 	int rc;
1995 
1996 	rc = cap_ptrace_access_check(child, mode);
1997 	if (rc)
1998 		return rc;
1999 
2000 	if (mode & PTRACE_MODE_READ) {
2001 		u32 sid = current_sid();
2002 		u32 csid = task_sid(child);
2003 		return avc_has_perm(sid, csid, SECCLASS_FILE, FILE__READ, NULL);
2004 	}
2005 
2006 	return current_has_perm(child, PROCESS__PTRACE);
2007 }
2008 
selinux_ptrace_traceme(struct task_struct * parent)2009 static int selinux_ptrace_traceme(struct task_struct *parent)
2010 {
2011 	int rc;
2012 
2013 	rc = cap_ptrace_traceme(parent);
2014 	if (rc)
2015 		return rc;
2016 
2017 	return task_has_perm(parent, current, PROCESS__PTRACE);
2018 }
2019 
selinux_capget(struct task_struct * target,kernel_cap_t * effective,kernel_cap_t * inheritable,kernel_cap_t * permitted)2020 static int selinux_capget(struct task_struct *target, kernel_cap_t *effective,
2021 			  kernel_cap_t *inheritable, kernel_cap_t *permitted)
2022 {
2023 	int error;
2024 
2025 	error = current_has_perm(target, PROCESS__GETCAP);
2026 	if (error)
2027 		return error;
2028 
2029 	return cap_capget(target, effective, inheritable, permitted);
2030 }
2031 
selinux_capset(struct cred * new,const struct cred * old,const kernel_cap_t * effective,const kernel_cap_t * inheritable,const kernel_cap_t * permitted)2032 static int selinux_capset(struct cred *new, const struct cred *old,
2033 			  const kernel_cap_t *effective,
2034 			  const kernel_cap_t *inheritable,
2035 			  const kernel_cap_t *permitted)
2036 {
2037 	int error;
2038 
2039 	error = cap_capset(new, old,
2040 				      effective, inheritable, permitted);
2041 	if (error)
2042 		return error;
2043 
2044 	return cred_has_perm(old, new, PROCESS__SETCAP);
2045 }
2046 
2047 /*
2048  * (This comment used to live with the selinux_task_setuid hook,
2049  * which was removed).
2050  *
2051  * Since setuid only affects the current process, and since the SELinux
2052  * controls are not based on the Linux identity attributes, SELinux does not
2053  * need to control this operation.  However, SELinux does control the use of
2054  * the CAP_SETUID and CAP_SETGID capabilities using the capable hook.
2055  */
2056 
selinux_capable(const struct cred * cred,struct user_namespace * ns,int cap,int audit)2057 static int selinux_capable(const struct cred *cred, struct user_namespace *ns,
2058 			   int cap, int audit)
2059 {
2060 	int rc;
2061 
2062 	rc = cap_capable(cred, ns, cap, audit);
2063 	if (rc)
2064 		return rc;
2065 
2066 	return cred_has_capability(cred, cap, audit);
2067 }
2068 
selinux_quotactl(int cmds,int type,int id,struct super_block * sb)2069 static int selinux_quotactl(int cmds, int type, int id, struct super_block *sb)
2070 {
2071 	const struct cred *cred = current_cred();
2072 	int rc = 0;
2073 
2074 	if (!sb)
2075 		return 0;
2076 
2077 	switch (cmds) {
2078 	case Q_SYNC:
2079 	case Q_QUOTAON:
2080 	case Q_QUOTAOFF:
2081 	case Q_SETINFO:
2082 	case Q_SETQUOTA:
2083 		rc = superblock_has_perm(cred, sb, FILESYSTEM__QUOTAMOD, NULL);
2084 		break;
2085 	case Q_GETFMT:
2086 	case Q_GETINFO:
2087 	case Q_GETQUOTA:
2088 		rc = superblock_has_perm(cred, sb, FILESYSTEM__QUOTAGET, NULL);
2089 		break;
2090 	default:
2091 		rc = 0;  /* let the kernel handle invalid cmds */
2092 		break;
2093 	}
2094 	return rc;
2095 }
2096 
selinux_quota_on(struct dentry * dentry)2097 static int selinux_quota_on(struct dentry *dentry)
2098 {
2099 	const struct cred *cred = current_cred();
2100 
2101 	return dentry_has_perm(cred, dentry, FILE__QUOTAON);
2102 }
2103 
selinux_syslog(int type)2104 static int selinux_syslog(int type)
2105 {
2106 	int rc;
2107 
2108 	switch (type) {
2109 	case SYSLOG_ACTION_READ_ALL:	/* Read last kernel messages */
2110 	case SYSLOG_ACTION_SIZE_BUFFER:	/* Return size of the log buffer */
2111 		rc = task_has_system(current, SYSTEM__SYSLOG_READ);
2112 		break;
2113 	case SYSLOG_ACTION_CONSOLE_OFF:	/* Disable logging to console */
2114 	case SYSLOG_ACTION_CONSOLE_ON:	/* Enable logging to console */
2115 	/* Set level of messages printed to console */
2116 	case SYSLOG_ACTION_CONSOLE_LEVEL:
2117 		rc = task_has_system(current, SYSTEM__SYSLOG_CONSOLE);
2118 		break;
2119 	case SYSLOG_ACTION_CLOSE:	/* Close log */
2120 	case SYSLOG_ACTION_OPEN:	/* Open log */
2121 	case SYSLOG_ACTION_READ:	/* Read from log */
2122 	case SYSLOG_ACTION_READ_CLEAR:	/* Read/clear last kernel messages */
2123 	case SYSLOG_ACTION_CLEAR:	/* Clear ring buffer */
2124 	default:
2125 		rc = task_has_system(current, SYSTEM__SYSLOG_MOD);
2126 		break;
2127 	}
2128 	return rc;
2129 }
2130 
2131 /*
2132  * Check that a process has enough memory to allocate a new virtual
2133  * mapping. 0 means there is enough memory for the allocation to
2134  * succeed and -ENOMEM implies there is not.
2135  *
2136  * Do not audit the selinux permission check, as this is applied to all
2137  * processes that allocate mappings.
2138  */
selinux_vm_enough_memory(struct mm_struct * mm,long pages)2139 static int selinux_vm_enough_memory(struct mm_struct *mm, long pages)
2140 {
2141 	int rc, cap_sys_admin = 0;
2142 
2143 	rc = selinux_capable(current_cred(), &init_user_ns, CAP_SYS_ADMIN,
2144 			     SECURITY_CAP_NOAUDIT);
2145 	if (rc == 0)
2146 		cap_sys_admin = 1;
2147 
2148 	return __vm_enough_memory(mm, pages, cap_sys_admin);
2149 }
2150 
2151 /* binprm security operations */
2152 
check_nnp_nosuid(const struct linux_binprm * bprm,const struct task_security_struct * old_tsec,const struct task_security_struct * new_tsec)2153 static int check_nnp_nosuid(const struct linux_binprm *bprm,
2154 			    const struct task_security_struct *old_tsec,
2155 			    const struct task_security_struct *new_tsec)
2156 {
2157 	int nnp = (bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS);
2158 	int nosuid = (bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID);
2159 	int rc;
2160 
2161 	if (!nnp && !nosuid)
2162 		return 0; /* neither NNP nor nosuid */
2163 
2164 	if (new_tsec->sid == old_tsec->sid)
2165 		return 0; /* No change in credentials */
2166 
2167 	/*
2168 	 * The only transitions we permit under NNP or nosuid
2169 	 * are transitions to bounded SIDs, i.e. SIDs that are
2170 	 * guaranteed to only be allowed a subset of the permissions
2171 	 * of the current SID.
2172 	 */
2173 	rc = security_bounded_transition(old_tsec->sid, new_tsec->sid);
2174 	if (rc) {
2175 		/*
2176 		 * On failure, preserve the errno values for NNP vs nosuid.
2177 		 * NNP:  Operation not permitted for caller.
2178 		 * nosuid:  Permission denied to file.
2179 		 */
2180 		if (nnp)
2181 			return -EPERM;
2182 		else
2183 			return -EACCES;
2184 	}
2185 	return 0;
2186 }
2187 
selinux_bprm_set_creds(struct linux_binprm * bprm)2188 static int selinux_bprm_set_creds(struct linux_binprm *bprm)
2189 {
2190 	const struct task_security_struct *old_tsec;
2191 	struct task_security_struct *new_tsec;
2192 	struct inode_security_struct *isec;
2193 	struct common_audit_data ad;
2194 	struct inode *inode = file_inode(bprm->file);
2195 	int rc;
2196 
2197 	rc = cap_bprm_set_creds(bprm);
2198 	if (rc)
2199 		return rc;
2200 
2201 	/* SELinux context only depends on initial program or script and not
2202 	 * the script interpreter */
2203 	if (bprm->cred_prepared)
2204 		return 0;
2205 
2206 	old_tsec = current_security();
2207 	new_tsec = bprm->cred->security;
2208 	isec = inode->i_security;
2209 
2210 	/* Default to the current task SID. */
2211 	new_tsec->sid = old_tsec->sid;
2212 	new_tsec->osid = old_tsec->sid;
2213 
2214 	/* Reset fs, key, and sock SIDs on execve. */
2215 	new_tsec->create_sid = 0;
2216 	new_tsec->keycreate_sid = 0;
2217 	new_tsec->sockcreate_sid = 0;
2218 
2219 	if (old_tsec->exec_sid) {
2220 		new_tsec->sid = old_tsec->exec_sid;
2221 		/* Reset exec SID on execve. */
2222 		new_tsec->exec_sid = 0;
2223 
2224 		/* Fail on NNP or nosuid if not an allowed transition. */
2225 		rc = check_nnp_nosuid(bprm, old_tsec, new_tsec);
2226 		if (rc)
2227 			return rc;
2228 	} else {
2229 		/* Check for a default transition on this program. */
2230 		rc = security_transition_sid(old_tsec->sid, isec->sid,
2231 					     SECCLASS_PROCESS, NULL,
2232 					     &new_tsec->sid);
2233 		if (rc)
2234 			return rc;
2235 
2236 		/*
2237 		 * Fallback to old SID on NNP or nosuid if not an allowed
2238 		 * transition.
2239 		 */
2240 		rc = check_nnp_nosuid(bprm, old_tsec, new_tsec);
2241 		if (rc)
2242 			new_tsec->sid = old_tsec->sid;
2243 	}
2244 
2245 	ad.type = LSM_AUDIT_DATA_PATH;
2246 	ad.u.path = bprm->file->f_path;
2247 
2248 	if (new_tsec->sid == old_tsec->sid) {
2249 		rc = avc_has_perm(old_tsec->sid, isec->sid,
2250 				  SECCLASS_FILE, FILE__EXECUTE_NO_TRANS, &ad);
2251 		if (rc)
2252 			return rc;
2253 	} else {
2254 		/* Check permissions for the transition. */
2255 		rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
2256 				  SECCLASS_PROCESS, PROCESS__TRANSITION, &ad);
2257 		if (rc)
2258 			return rc;
2259 
2260 		rc = avc_has_perm(new_tsec->sid, isec->sid,
2261 				  SECCLASS_FILE, FILE__ENTRYPOINT, &ad);
2262 		if (rc)
2263 			return rc;
2264 
2265 		/* Check for shared state */
2266 		if (bprm->unsafe & LSM_UNSAFE_SHARE) {
2267 			rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
2268 					  SECCLASS_PROCESS, PROCESS__SHARE,
2269 					  NULL);
2270 			if (rc)
2271 				return -EPERM;
2272 		}
2273 
2274 		/* Make sure that anyone attempting to ptrace over a task that
2275 		 * changes its SID has the appropriate permit */
2276 		if (bprm->unsafe &
2277 		    (LSM_UNSAFE_PTRACE | LSM_UNSAFE_PTRACE_CAP)) {
2278 			struct task_struct *tracer;
2279 			struct task_security_struct *sec;
2280 			u32 ptsid = 0;
2281 
2282 			rcu_read_lock();
2283 			tracer = ptrace_parent(current);
2284 			if (likely(tracer != NULL)) {
2285 				sec = __task_cred(tracer)->security;
2286 				ptsid = sec->sid;
2287 			}
2288 			rcu_read_unlock();
2289 
2290 			if (ptsid != 0) {
2291 				rc = avc_has_perm(ptsid, new_tsec->sid,
2292 						  SECCLASS_PROCESS,
2293 						  PROCESS__PTRACE, NULL);
2294 				if (rc)
2295 					return -EPERM;
2296 			}
2297 		}
2298 
2299 		/* Clear any possibly unsafe personality bits on exec: */
2300 		bprm->per_clear |= PER_CLEAR_ON_SETID;
2301 	}
2302 
2303 	return 0;
2304 }
2305 
selinux_bprm_secureexec(struct linux_binprm * bprm)2306 static int selinux_bprm_secureexec(struct linux_binprm *bprm)
2307 {
2308 	const struct task_security_struct *tsec = current_security();
2309 	u32 sid, osid;
2310 	int atsecure = 0;
2311 
2312 	sid = tsec->sid;
2313 	osid = tsec->osid;
2314 
2315 	if (osid != sid) {
2316 		/* Enable secure mode for SIDs transitions unless
2317 		   the noatsecure permission is granted between
2318 		   the two SIDs, i.e. ahp returns 0. */
2319 		atsecure = avc_has_perm(osid, sid,
2320 					SECCLASS_PROCESS,
2321 					PROCESS__NOATSECURE, NULL);
2322 	}
2323 
2324 	return (atsecure || cap_bprm_secureexec(bprm));
2325 }
2326 
match_file(const void * p,struct file * file,unsigned fd)2327 static int match_file(const void *p, struct file *file, unsigned fd)
2328 {
2329 	return file_has_perm(p, file, file_to_av(file)) ? fd + 1 : 0;
2330 }
2331 
2332 /* Derived from fs/exec.c:flush_old_files. */
flush_unauthorized_files(const struct cred * cred,struct files_struct * files)2333 static inline void flush_unauthorized_files(const struct cred *cred,
2334 					    struct files_struct *files)
2335 {
2336 	struct file *file, *devnull = NULL;
2337 	struct tty_struct *tty;
2338 	int drop_tty = 0;
2339 	unsigned n;
2340 
2341 	tty = get_current_tty();
2342 	if (tty) {
2343 		spin_lock(&tty_files_lock);
2344 		if (!list_empty(&tty->tty_files)) {
2345 			struct tty_file_private *file_priv;
2346 
2347 			/* Revalidate access to controlling tty.
2348 			   Use file_path_has_perm on the tty path directly
2349 			   rather than using file_has_perm, as this particular
2350 			   open file may belong to another process and we are
2351 			   only interested in the inode-based check here. */
2352 			file_priv = list_first_entry(&tty->tty_files,
2353 						struct tty_file_private, list);
2354 			file = file_priv->file;
2355 			if (file_path_has_perm(cred, file, FILE__READ | FILE__WRITE))
2356 				drop_tty = 1;
2357 		}
2358 		spin_unlock(&tty_files_lock);
2359 		tty_kref_put(tty);
2360 	}
2361 	/* Reset controlling tty. */
2362 	if (drop_tty)
2363 		no_tty();
2364 
2365 	/* Revalidate access to inherited open files. */
2366 	n = iterate_fd(files, 0, match_file, cred);
2367 	if (!n) /* none found? */
2368 		return;
2369 
2370 	devnull = dentry_open(&selinux_null, O_RDWR, cred);
2371 	if (IS_ERR(devnull))
2372 		devnull = NULL;
2373 	/* replace all the matching ones with this */
2374 	do {
2375 		replace_fd(n - 1, devnull, 0);
2376 	} while ((n = iterate_fd(files, n, match_file, cred)) != 0);
2377 	if (devnull)
2378 		fput(devnull);
2379 }
2380 
2381 /*
2382  * Prepare a process for imminent new credential changes due to exec
2383  */
selinux_bprm_committing_creds(struct linux_binprm * bprm)2384 static void selinux_bprm_committing_creds(struct linux_binprm *bprm)
2385 {
2386 	struct task_security_struct *new_tsec;
2387 	struct rlimit *rlim, *initrlim;
2388 	int rc, i;
2389 
2390 	new_tsec = bprm->cred->security;
2391 	if (new_tsec->sid == new_tsec->osid)
2392 		return;
2393 
2394 	/* Close files for which the new task SID is not authorized. */
2395 	flush_unauthorized_files(bprm->cred, current->files);
2396 
2397 	/* Always clear parent death signal on SID transitions. */
2398 	current->pdeath_signal = 0;
2399 
2400 	/* Check whether the new SID can inherit resource limits from the old
2401 	 * SID.  If not, reset all soft limits to the lower of the current
2402 	 * task's hard limit and the init task's soft limit.
2403 	 *
2404 	 * Note that the setting of hard limits (even to lower them) can be
2405 	 * controlled by the setrlimit check.  The inclusion of the init task's
2406 	 * soft limit into the computation is to avoid resetting soft limits
2407 	 * higher than the default soft limit for cases where the default is
2408 	 * lower than the hard limit, e.g. RLIMIT_CORE or RLIMIT_STACK.
2409 	 */
2410 	rc = avc_has_perm(new_tsec->osid, new_tsec->sid, SECCLASS_PROCESS,
2411 			  PROCESS__RLIMITINH, NULL);
2412 	if (rc) {
2413 		/* protect against do_prlimit() */
2414 		task_lock(current);
2415 		for (i = 0; i < RLIM_NLIMITS; i++) {
2416 			rlim = current->signal->rlim + i;
2417 			initrlim = init_task.signal->rlim + i;
2418 			rlim->rlim_cur = min(rlim->rlim_max, initrlim->rlim_cur);
2419 		}
2420 		task_unlock(current);
2421 		update_rlimit_cpu(current, rlimit(RLIMIT_CPU));
2422 	}
2423 }
2424 
2425 /*
2426  * Clean up the process immediately after the installation of new credentials
2427  * due to exec
2428  */
selinux_bprm_committed_creds(struct linux_binprm * bprm)2429 static void selinux_bprm_committed_creds(struct linux_binprm *bprm)
2430 {
2431 	const struct task_security_struct *tsec = current_security();
2432 	struct itimerval itimer;
2433 	u32 osid, sid;
2434 	int rc, i;
2435 
2436 	osid = tsec->osid;
2437 	sid = tsec->sid;
2438 
2439 	if (sid == osid)
2440 		return;
2441 
2442 	/* Check whether the new SID can inherit signal state from the old SID.
2443 	 * If not, clear itimers to avoid subsequent signal generation and
2444 	 * flush and unblock signals.
2445 	 *
2446 	 * This must occur _after_ the task SID has been updated so that any
2447 	 * kill done after the flush will be checked against the new SID.
2448 	 */
2449 	rc = avc_has_perm(osid, sid, SECCLASS_PROCESS, PROCESS__SIGINH, NULL);
2450 	if (rc) {
2451 		memset(&itimer, 0, sizeof itimer);
2452 		for (i = 0; i < 3; i++)
2453 			do_setitimer(i, &itimer, NULL);
2454 		spin_lock_irq(&current->sighand->siglock);
2455 		if (!(current->signal->flags & SIGNAL_GROUP_EXIT)) {
2456 			__flush_signals(current);
2457 			flush_signal_handlers(current, 1);
2458 			sigemptyset(&current->blocked);
2459 		}
2460 		spin_unlock_irq(&current->sighand->siglock);
2461 	}
2462 
2463 	/* Wake up the parent if it is waiting so that it can recheck
2464 	 * wait permission to the new task SID. */
2465 	read_lock(&tasklist_lock);
2466 	__wake_up_parent(current, current->real_parent);
2467 	read_unlock(&tasklist_lock);
2468 }
2469 
2470 /* superblock security operations */
2471 
selinux_sb_alloc_security(struct super_block * sb)2472 static int selinux_sb_alloc_security(struct super_block *sb)
2473 {
2474 	return superblock_alloc_security(sb);
2475 }
2476 
selinux_sb_free_security(struct super_block * sb)2477 static void selinux_sb_free_security(struct super_block *sb)
2478 {
2479 	superblock_free_security(sb);
2480 }
2481 
match_prefix(char * prefix,int plen,char * option,int olen)2482 static inline int match_prefix(char *prefix, int plen, char *option, int olen)
2483 {
2484 	if (plen > olen)
2485 		return 0;
2486 
2487 	return !memcmp(prefix, option, plen);
2488 }
2489 
selinux_option(char * option,int len)2490 static inline int selinux_option(char *option, int len)
2491 {
2492 	return (match_prefix(CONTEXT_STR, sizeof(CONTEXT_STR)-1, option, len) ||
2493 		match_prefix(FSCONTEXT_STR, sizeof(FSCONTEXT_STR)-1, option, len) ||
2494 		match_prefix(DEFCONTEXT_STR, sizeof(DEFCONTEXT_STR)-1, option, len) ||
2495 		match_prefix(ROOTCONTEXT_STR, sizeof(ROOTCONTEXT_STR)-1, option, len) ||
2496 		match_prefix(LABELSUPP_STR, sizeof(LABELSUPP_STR)-1, option, len));
2497 }
2498 
take_option(char ** to,char * from,int * first,int len)2499 static inline void take_option(char **to, char *from, int *first, int len)
2500 {
2501 	if (!*first) {
2502 		**to = ',';
2503 		*to += 1;
2504 	} else
2505 		*first = 0;
2506 	memcpy(*to, from, len);
2507 	*to += len;
2508 }
2509 
take_selinux_option(char ** to,char * from,int * first,int len)2510 static inline void take_selinux_option(char **to, char *from, int *first,
2511 				       int len)
2512 {
2513 	int current_size = 0;
2514 
2515 	if (!*first) {
2516 		**to = '|';
2517 		*to += 1;
2518 	} else
2519 		*first = 0;
2520 
2521 	while (current_size < len) {
2522 		if (*from != '"') {
2523 			**to = *from;
2524 			*to += 1;
2525 		}
2526 		from += 1;
2527 		current_size += 1;
2528 	}
2529 }
2530 
selinux_sb_copy_data(char * orig,char * copy)2531 static int selinux_sb_copy_data(char *orig, char *copy)
2532 {
2533 	int fnosec, fsec, rc = 0;
2534 	char *in_save, *in_curr, *in_end;
2535 	char *sec_curr, *nosec_save, *nosec;
2536 	int open_quote = 0;
2537 
2538 	in_curr = orig;
2539 	sec_curr = copy;
2540 
2541 	nosec = (char *)get_zeroed_page(GFP_KERNEL);
2542 	if (!nosec) {
2543 		rc = -ENOMEM;
2544 		goto out;
2545 	}
2546 
2547 	nosec_save = nosec;
2548 	fnosec = fsec = 1;
2549 	in_save = in_end = orig;
2550 
2551 	do {
2552 		if (*in_end == '"')
2553 			open_quote = !open_quote;
2554 		if ((*in_end == ',' && open_quote == 0) ||
2555 				*in_end == '\0') {
2556 			int len = in_end - in_curr;
2557 
2558 			if (selinux_option(in_curr, len))
2559 				take_selinux_option(&sec_curr, in_curr, &fsec, len);
2560 			else
2561 				take_option(&nosec, in_curr, &fnosec, len);
2562 
2563 			in_curr = in_end + 1;
2564 		}
2565 	} while (*in_end++);
2566 
2567 	strcpy(in_save, nosec_save);
2568 	free_page((unsigned long)nosec_save);
2569 out:
2570 	return rc;
2571 }
2572 
selinux_sb_remount(struct super_block * sb,void * data)2573 static int selinux_sb_remount(struct super_block *sb, void *data)
2574 {
2575 	int rc, i, *flags;
2576 	struct security_mnt_opts opts;
2577 	char *secdata, **mount_options;
2578 	struct superblock_security_struct *sbsec = sb->s_security;
2579 
2580 	if (!(sbsec->flags & SE_SBINITIALIZED))
2581 		return 0;
2582 
2583 	if (!data)
2584 		return 0;
2585 
2586 	if (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA)
2587 		return 0;
2588 
2589 	security_init_mnt_opts(&opts);
2590 	secdata = alloc_secdata();
2591 	if (!secdata)
2592 		return -ENOMEM;
2593 	rc = selinux_sb_copy_data(data, secdata);
2594 	if (rc)
2595 		goto out_free_secdata;
2596 
2597 	rc = selinux_parse_opts_str(secdata, &opts);
2598 	if (rc)
2599 		goto out_free_secdata;
2600 
2601 	mount_options = opts.mnt_opts;
2602 	flags = opts.mnt_opts_flags;
2603 
2604 	for (i = 0; i < opts.num_mnt_opts; i++) {
2605 		u32 sid;
2606 		size_t len;
2607 
2608 		if (flags[i] == SBLABEL_MNT)
2609 			continue;
2610 		len = strlen(mount_options[i]);
2611 		rc = security_context_to_sid(mount_options[i], len, &sid,
2612 					     GFP_KERNEL);
2613 		if (rc) {
2614 			printk(KERN_WARNING "SELinux: security_context_to_sid"
2615 			       "(%s) failed for (dev %s, type %s) errno=%d\n",
2616 			       mount_options[i], sb->s_id, sb->s_type->name, rc);
2617 			goto out_free_opts;
2618 		}
2619 		rc = -EINVAL;
2620 		switch (flags[i]) {
2621 		case FSCONTEXT_MNT:
2622 			if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid, sid))
2623 				goto out_bad_option;
2624 			break;
2625 		case CONTEXT_MNT:
2626 			if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid, sid))
2627 				goto out_bad_option;
2628 			break;
2629 		case ROOTCONTEXT_MNT: {
2630 			struct inode_security_struct *root_isec;
2631 			root_isec = d_backing_inode(sb->s_root)->i_security;
2632 
2633 			if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid, sid))
2634 				goto out_bad_option;
2635 			break;
2636 		}
2637 		case DEFCONTEXT_MNT:
2638 			if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid, sid))
2639 				goto out_bad_option;
2640 			break;
2641 		default:
2642 			goto out_free_opts;
2643 		}
2644 	}
2645 
2646 	rc = 0;
2647 out_free_opts:
2648 	security_free_mnt_opts(&opts);
2649 out_free_secdata:
2650 	free_secdata(secdata);
2651 	return rc;
2652 out_bad_option:
2653 	printk(KERN_WARNING "SELinux: unable to change security options "
2654 	       "during remount (dev %s, type=%s)\n", sb->s_id,
2655 	       sb->s_type->name);
2656 	goto out_free_opts;
2657 }
2658 
selinux_sb_kern_mount(struct super_block * sb,int flags,void * data)2659 static int selinux_sb_kern_mount(struct super_block *sb, int flags, void *data)
2660 {
2661 	const struct cred *cred = current_cred();
2662 	struct common_audit_data ad;
2663 	int rc;
2664 
2665 	rc = superblock_doinit(sb, data);
2666 	if (rc)
2667 		return rc;
2668 
2669 	/* Allow all mounts performed by the kernel */
2670 	if (flags & MS_KERNMOUNT)
2671 		return 0;
2672 
2673 	ad.type = LSM_AUDIT_DATA_DENTRY;
2674 	ad.u.dentry = sb->s_root;
2675 	return superblock_has_perm(cred, sb, FILESYSTEM__MOUNT, &ad);
2676 }
2677 
selinux_sb_statfs(struct dentry * dentry)2678 static int selinux_sb_statfs(struct dentry *dentry)
2679 {
2680 	const struct cred *cred = current_cred();
2681 	struct common_audit_data ad;
2682 
2683 	ad.type = LSM_AUDIT_DATA_DENTRY;
2684 	ad.u.dentry = dentry->d_sb->s_root;
2685 	return superblock_has_perm(cred, dentry->d_sb, FILESYSTEM__GETATTR, &ad);
2686 }
2687 
selinux_mount(const char * dev_name,struct path * path,const char * type,unsigned long flags,void * data)2688 static int selinux_mount(const char *dev_name,
2689 			 struct path *path,
2690 			 const char *type,
2691 			 unsigned long flags,
2692 			 void *data)
2693 {
2694 	const struct cred *cred = current_cred();
2695 
2696 	if (flags & MS_REMOUNT)
2697 		return superblock_has_perm(cred, path->dentry->d_sb,
2698 					   FILESYSTEM__REMOUNT, NULL);
2699 	else
2700 		return path_has_perm(cred, path, FILE__MOUNTON);
2701 }
2702 
selinux_umount(struct vfsmount * mnt,int flags)2703 static int selinux_umount(struct vfsmount *mnt, int flags)
2704 {
2705 	const struct cred *cred = current_cred();
2706 
2707 	return superblock_has_perm(cred, mnt->mnt_sb,
2708 				   FILESYSTEM__UNMOUNT, NULL);
2709 }
2710 
2711 /* inode security operations */
2712 
selinux_inode_alloc_security(struct inode * inode)2713 static int selinux_inode_alloc_security(struct inode *inode)
2714 {
2715 	return inode_alloc_security(inode);
2716 }
2717 
selinux_inode_free_security(struct inode * inode)2718 static void selinux_inode_free_security(struct inode *inode)
2719 {
2720 	inode_free_security(inode);
2721 }
2722 
selinux_dentry_init_security(struct dentry * dentry,int mode,struct qstr * name,void ** ctx,u32 * ctxlen)2723 static int selinux_dentry_init_security(struct dentry *dentry, int mode,
2724 					struct qstr *name, void **ctx,
2725 					u32 *ctxlen)
2726 {
2727 	const struct cred *cred = current_cred();
2728 	struct task_security_struct *tsec;
2729 	struct inode_security_struct *dsec;
2730 	struct superblock_security_struct *sbsec;
2731 	struct inode *dir = d_backing_inode(dentry->d_parent);
2732 	u32 newsid;
2733 	int rc;
2734 
2735 	tsec = cred->security;
2736 	dsec = dir->i_security;
2737 	sbsec = dir->i_sb->s_security;
2738 
2739 	if (tsec->create_sid && sbsec->behavior != SECURITY_FS_USE_MNTPOINT) {
2740 		newsid = tsec->create_sid;
2741 	} else {
2742 		rc = security_transition_sid(tsec->sid, dsec->sid,
2743 					     inode_mode_to_security_class(mode),
2744 					     name,
2745 					     &newsid);
2746 		if (rc) {
2747 			printk(KERN_WARNING
2748 				"%s: security_transition_sid failed, rc=%d\n",
2749 			       __func__, -rc);
2750 			return rc;
2751 		}
2752 	}
2753 
2754 	return security_sid_to_context(newsid, (char **)ctx, ctxlen);
2755 }
2756 
selinux_inode_init_security(struct inode * inode,struct inode * dir,const struct qstr * qstr,const char ** name,void ** value,size_t * len)2757 static int selinux_inode_init_security(struct inode *inode, struct inode *dir,
2758 				       const struct qstr *qstr,
2759 				       const char **name,
2760 				       void **value, size_t *len)
2761 {
2762 	const struct task_security_struct *tsec = current_security();
2763 	struct inode_security_struct *dsec;
2764 	struct superblock_security_struct *sbsec;
2765 	u32 sid, newsid, clen;
2766 	int rc;
2767 	char *context;
2768 
2769 	dsec = dir->i_security;
2770 	sbsec = dir->i_sb->s_security;
2771 
2772 	sid = tsec->sid;
2773 	newsid = tsec->create_sid;
2774 
2775 	if ((sbsec->flags & SE_SBINITIALIZED) &&
2776 	    (sbsec->behavior == SECURITY_FS_USE_MNTPOINT))
2777 		newsid = sbsec->mntpoint_sid;
2778 	else if (!newsid || !(sbsec->flags & SBLABEL_MNT)) {
2779 		rc = security_transition_sid(sid, dsec->sid,
2780 					     inode_mode_to_security_class(inode->i_mode),
2781 					     qstr, &newsid);
2782 		if (rc) {
2783 			printk(KERN_WARNING "%s:  "
2784 			       "security_transition_sid failed, rc=%d (dev=%s "
2785 			       "ino=%ld)\n",
2786 			       __func__,
2787 			       -rc, inode->i_sb->s_id, inode->i_ino);
2788 			return rc;
2789 		}
2790 	}
2791 
2792 	/* Possibly defer initialization to selinux_complete_init. */
2793 	if (sbsec->flags & SE_SBINITIALIZED) {
2794 		struct inode_security_struct *isec = inode->i_security;
2795 		isec->sclass = inode_mode_to_security_class(inode->i_mode);
2796 		isec->sid = newsid;
2797 		isec->initialized = 1;
2798 	}
2799 
2800 	if (!ss_initialized || !(sbsec->flags & SBLABEL_MNT))
2801 		return -EOPNOTSUPP;
2802 
2803 	if (name)
2804 		*name = XATTR_SELINUX_SUFFIX;
2805 
2806 	if (value && len) {
2807 		rc = security_sid_to_context_force(newsid, &context, &clen);
2808 		if (rc)
2809 			return rc;
2810 		*value = context;
2811 		*len = clen;
2812 	}
2813 
2814 	return 0;
2815 }
2816 
selinux_inode_create(struct inode * dir,struct dentry * dentry,umode_t mode)2817 static int selinux_inode_create(struct inode *dir, struct dentry *dentry, umode_t mode)
2818 {
2819 	return may_create(dir, dentry, SECCLASS_FILE);
2820 }
2821 
selinux_inode_link(struct dentry * old_dentry,struct inode * dir,struct dentry * new_dentry)2822 static int selinux_inode_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
2823 {
2824 	return may_link(dir, old_dentry, MAY_LINK);
2825 }
2826 
selinux_inode_unlink(struct inode * dir,struct dentry * dentry)2827 static int selinux_inode_unlink(struct inode *dir, struct dentry *dentry)
2828 {
2829 	return may_link(dir, dentry, MAY_UNLINK);
2830 }
2831 
selinux_inode_symlink(struct inode * dir,struct dentry * dentry,const char * name)2832 static int selinux_inode_symlink(struct inode *dir, struct dentry *dentry, const char *name)
2833 {
2834 	return may_create(dir, dentry, SECCLASS_LNK_FILE);
2835 }
2836 
selinux_inode_mkdir(struct inode * dir,struct dentry * dentry,umode_t mask)2837 static int selinux_inode_mkdir(struct inode *dir, struct dentry *dentry, umode_t mask)
2838 {
2839 	return may_create(dir, dentry, SECCLASS_DIR);
2840 }
2841 
selinux_inode_rmdir(struct inode * dir,struct dentry * dentry)2842 static int selinux_inode_rmdir(struct inode *dir, struct dentry *dentry)
2843 {
2844 	return may_link(dir, dentry, MAY_RMDIR);
2845 }
2846 
selinux_inode_mknod(struct inode * dir,struct dentry * dentry,umode_t mode,dev_t dev)2847 static int selinux_inode_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
2848 {
2849 	return may_create(dir, dentry, inode_mode_to_security_class(mode));
2850 }
2851 
selinux_inode_rename(struct inode * old_inode,struct dentry * old_dentry,struct inode * new_inode,struct dentry * new_dentry)2852 static int selinux_inode_rename(struct inode *old_inode, struct dentry *old_dentry,
2853 				struct inode *new_inode, struct dentry *new_dentry)
2854 {
2855 	return may_rename(old_inode, old_dentry, new_inode, new_dentry);
2856 }
2857 
selinux_inode_readlink(struct dentry * dentry)2858 static int selinux_inode_readlink(struct dentry *dentry)
2859 {
2860 	const struct cred *cred = current_cred();
2861 
2862 	return dentry_has_perm(cred, dentry, FILE__READ);
2863 }
2864 
selinux_inode_follow_link(struct dentry * dentry,struct nameidata * nameidata)2865 static int selinux_inode_follow_link(struct dentry *dentry, struct nameidata *nameidata)
2866 {
2867 	const struct cred *cred = current_cred();
2868 
2869 	return dentry_has_perm(cred, dentry, FILE__READ);
2870 }
2871 
audit_inode_permission(struct inode * inode,u32 perms,u32 audited,u32 denied,int result,unsigned flags)2872 static noinline int audit_inode_permission(struct inode *inode,
2873 					   u32 perms, u32 audited, u32 denied,
2874 					   int result,
2875 					   unsigned flags)
2876 {
2877 	struct common_audit_data ad;
2878 	struct inode_security_struct *isec = inode->i_security;
2879 	int rc;
2880 
2881 	ad.type = LSM_AUDIT_DATA_INODE;
2882 	ad.u.inode = inode;
2883 
2884 	rc = slow_avc_audit(current_sid(), isec->sid, isec->sclass, perms,
2885 			    audited, denied, result, &ad, flags);
2886 	if (rc)
2887 		return rc;
2888 	return 0;
2889 }
2890 
selinux_inode_permission(struct inode * inode,int mask)2891 static int selinux_inode_permission(struct inode *inode, int mask)
2892 {
2893 	const struct cred *cred = current_cred();
2894 	u32 perms;
2895 	bool from_access;
2896 	unsigned flags = mask & MAY_NOT_BLOCK;
2897 	struct inode_security_struct *isec;
2898 	u32 sid;
2899 	struct av_decision avd;
2900 	int rc, rc2;
2901 	u32 audited, denied;
2902 
2903 	from_access = mask & MAY_ACCESS;
2904 	mask &= (MAY_READ|MAY_WRITE|MAY_EXEC|MAY_APPEND);
2905 
2906 	/* No permission to check.  Existence test. */
2907 	if (!mask)
2908 		return 0;
2909 
2910 	validate_creds(cred);
2911 
2912 	if (unlikely(IS_PRIVATE(inode)))
2913 		return 0;
2914 
2915 	perms = file_mask_to_av(inode->i_mode, mask);
2916 
2917 	sid = cred_sid(cred);
2918 	isec = inode->i_security;
2919 
2920 	rc = avc_has_perm_noaudit(sid, isec->sid, isec->sclass, perms, 0, &avd);
2921 	audited = avc_audit_required(perms, &avd, rc,
2922 				     from_access ? FILE__AUDIT_ACCESS : 0,
2923 				     &denied);
2924 	if (likely(!audited))
2925 		return rc;
2926 
2927 	rc2 = audit_inode_permission(inode, perms, audited, denied, rc, flags);
2928 	if (rc2)
2929 		return rc2;
2930 	return rc;
2931 }
2932 
selinux_inode_setattr(struct dentry * dentry,struct iattr * iattr)2933 static int selinux_inode_setattr(struct dentry *dentry, struct iattr *iattr)
2934 {
2935 	const struct cred *cred = current_cred();
2936 	unsigned int ia_valid = iattr->ia_valid;
2937 	__u32 av = FILE__WRITE;
2938 
2939 	/* ATTR_FORCE is just used for ATTR_KILL_S[UG]ID. */
2940 	if (ia_valid & ATTR_FORCE) {
2941 		ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_MODE |
2942 			      ATTR_FORCE);
2943 		if (!ia_valid)
2944 			return 0;
2945 	}
2946 
2947 	if (ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID |
2948 			ATTR_ATIME_SET | ATTR_MTIME_SET | ATTR_TIMES_SET))
2949 		return dentry_has_perm(cred, dentry, FILE__SETATTR);
2950 
2951 	if (selinux_policycap_openperm && (ia_valid & ATTR_SIZE))
2952 		av |= FILE__OPEN;
2953 
2954 	return dentry_has_perm(cred, dentry, av);
2955 }
2956 
selinux_inode_getattr(const struct path * path)2957 static int selinux_inode_getattr(const struct path *path)
2958 {
2959 	return path_has_perm(current_cred(), path, FILE__GETATTR);
2960 }
2961 
selinux_inode_setotherxattr(struct dentry * dentry,const char * name)2962 static int selinux_inode_setotherxattr(struct dentry *dentry, const char *name)
2963 {
2964 	const struct cred *cred = current_cred();
2965 
2966 	if (!strncmp(name, XATTR_SECURITY_PREFIX,
2967 		     sizeof XATTR_SECURITY_PREFIX - 1)) {
2968 		if (!strcmp(name, XATTR_NAME_CAPS)) {
2969 			if (!capable(CAP_SETFCAP))
2970 				return -EPERM;
2971 		} else if (!capable(CAP_SYS_ADMIN)) {
2972 			/* A different attribute in the security namespace.
2973 			   Restrict to administrator. */
2974 			return -EPERM;
2975 		}
2976 	}
2977 
2978 	/* Not an attribute we recognize, so just check the
2979 	   ordinary setattr permission. */
2980 	return dentry_has_perm(cred, dentry, FILE__SETATTR);
2981 }
2982 
selinux_inode_setxattr(struct dentry * dentry,const char * name,const void * value,size_t size,int flags)2983 static int selinux_inode_setxattr(struct dentry *dentry, const char *name,
2984 				  const void *value, size_t size, int flags)
2985 {
2986 	struct inode *inode = d_backing_inode(dentry);
2987 	struct inode_security_struct *isec = inode->i_security;
2988 	struct superblock_security_struct *sbsec;
2989 	struct common_audit_data ad;
2990 	u32 newsid, sid = current_sid();
2991 	int rc = 0;
2992 
2993 	if (strcmp(name, XATTR_NAME_SELINUX))
2994 		return selinux_inode_setotherxattr(dentry, name);
2995 
2996 	sbsec = inode->i_sb->s_security;
2997 	if (!(sbsec->flags & SBLABEL_MNT))
2998 		return -EOPNOTSUPP;
2999 
3000 	if (!inode_owner_or_capable(inode))
3001 		return -EPERM;
3002 
3003 	ad.type = LSM_AUDIT_DATA_DENTRY;
3004 	ad.u.dentry = dentry;
3005 
3006 	rc = avc_has_perm(sid, isec->sid, isec->sclass,
3007 			  FILE__RELABELFROM, &ad);
3008 	if (rc)
3009 		return rc;
3010 
3011 	rc = security_context_to_sid(value, size, &newsid, GFP_KERNEL);
3012 	if (rc == -EINVAL) {
3013 		if (!capable(CAP_MAC_ADMIN)) {
3014 			struct audit_buffer *ab;
3015 			size_t audit_size;
3016 			const char *str;
3017 
3018 			/* We strip a nul only if it is at the end, otherwise the
3019 			 * context contains a nul and we should audit that */
3020 			if (value) {
3021 				str = value;
3022 				if (str[size - 1] == '\0')
3023 					audit_size = size - 1;
3024 				else
3025 					audit_size = size;
3026 			} else {
3027 				str = "";
3028 				audit_size = 0;
3029 			}
3030 			ab = audit_log_start(current->audit_context, GFP_ATOMIC, AUDIT_SELINUX_ERR);
3031 			audit_log_format(ab, "op=setxattr invalid_context=");
3032 			audit_log_n_untrustedstring(ab, value, audit_size);
3033 			audit_log_end(ab);
3034 
3035 			return rc;
3036 		}
3037 		rc = security_context_to_sid_force(value, size, &newsid);
3038 	}
3039 	if (rc)
3040 		return rc;
3041 
3042 	rc = avc_has_perm(sid, newsid, isec->sclass,
3043 			  FILE__RELABELTO, &ad);
3044 	if (rc)
3045 		return rc;
3046 
3047 	rc = security_validate_transition(isec->sid, newsid, sid,
3048 					  isec->sclass);
3049 	if (rc)
3050 		return rc;
3051 
3052 	return avc_has_perm(newsid,
3053 			    sbsec->sid,
3054 			    SECCLASS_FILESYSTEM,
3055 			    FILESYSTEM__ASSOCIATE,
3056 			    &ad);
3057 }
3058 
selinux_inode_post_setxattr(struct dentry * dentry,const char * name,const void * value,size_t size,int flags)3059 static void selinux_inode_post_setxattr(struct dentry *dentry, const char *name,
3060 					const void *value, size_t size,
3061 					int flags)
3062 {
3063 	struct inode *inode = d_backing_inode(dentry);
3064 	struct inode_security_struct *isec = inode->i_security;
3065 	u32 newsid;
3066 	int rc;
3067 
3068 	if (strcmp(name, XATTR_NAME_SELINUX)) {
3069 		/* Not an attribute we recognize, so nothing to do. */
3070 		return;
3071 	}
3072 
3073 	rc = security_context_to_sid_force(value, size, &newsid);
3074 	if (rc) {
3075 		printk(KERN_ERR "SELinux:  unable to map context to SID"
3076 		       "for (%s, %lu), rc=%d\n",
3077 		       inode->i_sb->s_id, inode->i_ino, -rc);
3078 		return;
3079 	}
3080 
3081 	isec->sclass = inode_mode_to_security_class(inode->i_mode);
3082 	isec->sid = newsid;
3083 	isec->initialized = 1;
3084 
3085 	return;
3086 }
3087 
selinux_inode_getxattr(struct dentry * dentry,const char * name)3088 static int selinux_inode_getxattr(struct dentry *dentry, const char *name)
3089 {
3090 	const struct cred *cred = current_cred();
3091 
3092 	return dentry_has_perm(cred, dentry, FILE__GETATTR);
3093 }
3094 
selinux_inode_listxattr(struct dentry * dentry)3095 static int selinux_inode_listxattr(struct dentry *dentry)
3096 {
3097 	const struct cred *cred = current_cred();
3098 
3099 	return dentry_has_perm(cred, dentry, FILE__GETATTR);
3100 }
3101 
selinux_inode_removexattr(struct dentry * dentry,const char * name)3102 static int selinux_inode_removexattr(struct dentry *dentry, const char *name)
3103 {
3104 	if (strcmp(name, XATTR_NAME_SELINUX))
3105 		return selinux_inode_setotherxattr(dentry, name);
3106 
3107 	/* No one is allowed to remove a SELinux security label.
3108 	   You can change the label, but all data must be labeled. */
3109 	return -EACCES;
3110 }
3111 
3112 /*
3113  * Copy the inode security context value to the user.
3114  *
3115  * Permission check is handled by selinux_inode_getxattr hook.
3116  */
selinux_inode_getsecurity(const struct inode * inode,const char * name,void ** buffer,bool alloc)3117 static int selinux_inode_getsecurity(const struct inode *inode, const char *name, void **buffer, bool alloc)
3118 {
3119 	u32 size;
3120 	int error;
3121 	char *context = NULL;
3122 	struct inode_security_struct *isec = inode->i_security;
3123 
3124 	if (strcmp(name, XATTR_SELINUX_SUFFIX))
3125 		return -EOPNOTSUPP;
3126 
3127 	/*
3128 	 * If the caller has CAP_MAC_ADMIN, then get the raw context
3129 	 * value even if it is not defined by current policy; otherwise,
3130 	 * use the in-core value under current policy.
3131 	 * Use the non-auditing forms of the permission checks since
3132 	 * getxattr may be called by unprivileged processes commonly
3133 	 * and lack of permission just means that we fall back to the
3134 	 * in-core context value, not a denial.
3135 	 */
3136 	error = selinux_capable(current_cred(), &init_user_ns, CAP_MAC_ADMIN,
3137 				SECURITY_CAP_NOAUDIT);
3138 	if (!error)
3139 		error = security_sid_to_context_force(isec->sid, &context,
3140 						      &size);
3141 	else
3142 		error = security_sid_to_context(isec->sid, &context, &size);
3143 	if (error)
3144 		return error;
3145 	error = size;
3146 	if (alloc) {
3147 		*buffer = context;
3148 		goto out_nofree;
3149 	}
3150 	kfree(context);
3151 out_nofree:
3152 	return error;
3153 }
3154 
selinux_inode_setsecurity(struct inode * inode,const char * name,const void * value,size_t size,int flags)3155 static int selinux_inode_setsecurity(struct inode *inode, const char *name,
3156 				     const void *value, size_t size, int flags)
3157 {
3158 	struct inode_security_struct *isec = inode->i_security;
3159 	u32 newsid;
3160 	int rc;
3161 
3162 	if (strcmp(name, XATTR_SELINUX_SUFFIX))
3163 		return -EOPNOTSUPP;
3164 
3165 	if (!value || !size)
3166 		return -EACCES;
3167 
3168 	rc = security_context_to_sid((void *)value, size, &newsid, GFP_KERNEL);
3169 	if (rc)
3170 		return rc;
3171 
3172 	isec->sclass = inode_mode_to_security_class(inode->i_mode);
3173 	isec->sid = newsid;
3174 	isec->initialized = 1;
3175 	return 0;
3176 }
3177 
selinux_inode_listsecurity(struct inode * inode,char * buffer,size_t buffer_size)3178 static int selinux_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size)
3179 {
3180 	const int len = sizeof(XATTR_NAME_SELINUX);
3181 	if (buffer && len <= buffer_size)
3182 		memcpy(buffer, XATTR_NAME_SELINUX, len);
3183 	return len;
3184 }
3185 
selinux_inode_getsecid(const struct inode * inode,u32 * secid)3186 static void selinux_inode_getsecid(const struct inode *inode, u32 *secid)
3187 {
3188 	struct inode_security_struct *isec = inode->i_security;
3189 	*secid = isec->sid;
3190 }
3191 
3192 /* file security operations */
3193 
selinux_revalidate_file_permission(struct file * file,int mask)3194 static int selinux_revalidate_file_permission(struct file *file, int mask)
3195 {
3196 	const struct cred *cred = current_cred();
3197 	struct inode *inode = file_inode(file);
3198 
3199 	/* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */
3200 	if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE))
3201 		mask |= MAY_APPEND;
3202 
3203 	return file_has_perm(cred, file,
3204 			     file_mask_to_av(inode->i_mode, mask));
3205 }
3206 
selinux_file_permission(struct file * file,int mask)3207 static int selinux_file_permission(struct file *file, int mask)
3208 {
3209 	struct inode *inode = file_inode(file);
3210 	struct file_security_struct *fsec = file->f_security;
3211 	struct inode_security_struct *isec = inode->i_security;
3212 	u32 sid = current_sid();
3213 
3214 	if (!mask)
3215 		/* No permission to check.  Existence test. */
3216 		return 0;
3217 
3218 	if (sid == fsec->sid && fsec->isid == isec->sid &&
3219 	    fsec->pseqno == avc_policy_seqno())
3220 		/* No change since file_open check. */
3221 		return 0;
3222 
3223 	return selinux_revalidate_file_permission(file, mask);
3224 }
3225 
selinux_file_alloc_security(struct file * file)3226 static int selinux_file_alloc_security(struct file *file)
3227 {
3228 	return file_alloc_security(file);
3229 }
3230 
selinux_file_free_security(struct file * file)3231 static void selinux_file_free_security(struct file *file)
3232 {
3233 	file_free_security(file);
3234 }
3235 
selinux_file_ioctl(struct file * file,unsigned int cmd,unsigned long arg)3236 static int selinux_file_ioctl(struct file *file, unsigned int cmd,
3237 			      unsigned long arg)
3238 {
3239 	const struct cred *cred = current_cred();
3240 	int error = 0;
3241 
3242 	switch (cmd) {
3243 	case FIONREAD:
3244 	/* fall through */
3245 	case FIBMAP:
3246 	/* fall through */
3247 	case FIGETBSZ:
3248 	/* fall through */
3249 	case FS_IOC_GETFLAGS:
3250 	/* fall through */
3251 	case FS_IOC_GETVERSION:
3252 		error = file_has_perm(cred, file, FILE__GETATTR);
3253 		break;
3254 
3255 	case FS_IOC_SETFLAGS:
3256 	/* fall through */
3257 	case FS_IOC_SETVERSION:
3258 		error = file_has_perm(cred, file, FILE__SETATTR);
3259 		break;
3260 
3261 	/* sys_ioctl() checks */
3262 	case FIONBIO:
3263 	/* fall through */
3264 	case FIOASYNC:
3265 		error = file_has_perm(cred, file, 0);
3266 		break;
3267 
3268 	case KDSKBENT:
3269 	case KDSKBSENT:
3270 		error = cred_has_capability(cred, CAP_SYS_TTY_CONFIG,
3271 					    SECURITY_CAP_AUDIT);
3272 		break;
3273 
3274 	/* default case assumes that the command will go
3275 	 * to the file's ioctl() function.
3276 	 */
3277 	default:
3278 		error = file_has_perm(cred, file, FILE__IOCTL);
3279 	}
3280 	return error;
3281 }
3282 
3283 static int default_noexec;
3284 
file_map_prot_check(struct file * file,unsigned long prot,int shared)3285 static int file_map_prot_check(struct file *file, unsigned long prot, int shared)
3286 {
3287 	const struct cred *cred = current_cred();
3288 	int rc = 0;
3289 
3290 	if (default_noexec &&
3291 	    (prot & PROT_EXEC) && (!file || IS_PRIVATE(file_inode(file)) ||
3292 				   (!shared && (prot & PROT_WRITE)))) {
3293 		/*
3294 		 * We are making executable an anonymous mapping or a
3295 		 * private file mapping that will also be writable.
3296 		 * This has an additional check.
3297 		 */
3298 		rc = cred_has_perm(cred, cred, PROCESS__EXECMEM);
3299 		if (rc)
3300 			goto error;
3301 	}
3302 
3303 	if (file) {
3304 		/* read access is always possible with a mapping */
3305 		u32 av = FILE__READ;
3306 
3307 		/* write access only matters if the mapping is shared */
3308 		if (shared && (prot & PROT_WRITE))
3309 			av |= FILE__WRITE;
3310 
3311 		if (prot & PROT_EXEC)
3312 			av |= FILE__EXECUTE;
3313 
3314 		return file_has_perm(cred, file, av);
3315 	}
3316 
3317 error:
3318 	return rc;
3319 }
3320 
selinux_mmap_addr(unsigned long addr)3321 static int selinux_mmap_addr(unsigned long addr)
3322 {
3323 	int rc;
3324 
3325 	/* do DAC check on address space usage */
3326 	rc = cap_mmap_addr(addr);
3327 	if (rc)
3328 		return rc;
3329 
3330 	if (addr < CONFIG_LSM_MMAP_MIN_ADDR) {
3331 		u32 sid = current_sid();
3332 		rc = avc_has_perm(sid, sid, SECCLASS_MEMPROTECT,
3333 				  MEMPROTECT__MMAP_ZERO, NULL);
3334 	}
3335 
3336 	return rc;
3337 }
3338 
selinux_mmap_file(struct file * file,unsigned long reqprot,unsigned long prot,unsigned long flags)3339 static int selinux_mmap_file(struct file *file, unsigned long reqprot,
3340 			     unsigned long prot, unsigned long flags)
3341 {
3342 	if (selinux_checkreqprot)
3343 		prot = reqprot;
3344 
3345 	return file_map_prot_check(file, prot,
3346 				   (flags & MAP_TYPE) == MAP_SHARED);
3347 }
3348 
selinux_file_mprotect(struct vm_area_struct * vma,unsigned long reqprot,unsigned long prot)3349 static int selinux_file_mprotect(struct vm_area_struct *vma,
3350 				 unsigned long reqprot,
3351 				 unsigned long prot)
3352 {
3353 	const struct cred *cred = current_cred();
3354 
3355 	if (selinux_checkreqprot)
3356 		prot = reqprot;
3357 
3358 	if (default_noexec &&
3359 	    (prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) {
3360 		int rc = 0;
3361 		if (vma->vm_start >= vma->vm_mm->start_brk &&
3362 		    vma->vm_end <= vma->vm_mm->brk) {
3363 			rc = cred_has_perm(cred, cred, PROCESS__EXECHEAP);
3364 		} else if (!vma->vm_file &&
3365 			   vma->vm_start <= vma->vm_mm->start_stack &&
3366 			   vma->vm_end >= vma->vm_mm->start_stack) {
3367 			rc = current_has_perm(current, PROCESS__EXECSTACK);
3368 		} else if (vma->vm_file && vma->anon_vma) {
3369 			/*
3370 			 * We are making executable a file mapping that has
3371 			 * had some COW done. Since pages might have been
3372 			 * written, check ability to execute the possibly
3373 			 * modified content.  This typically should only
3374 			 * occur for text relocations.
3375 			 */
3376 			rc = file_has_perm(cred, vma->vm_file, FILE__EXECMOD);
3377 		}
3378 		if (rc)
3379 			return rc;
3380 	}
3381 
3382 	return file_map_prot_check(vma->vm_file, prot, vma->vm_flags&VM_SHARED);
3383 }
3384 
selinux_file_lock(struct file * file,unsigned int cmd)3385 static int selinux_file_lock(struct file *file, unsigned int cmd)
3386 {
3387 	const struct cred *cred = current_cred();
3388 
3389 	return file_has_perm(cred, file, FILE__LOCK);
3390 }
3391 
selinux_file_fcntl(struct file * file,unsigned int cmd,unsigned long arg)3392 static int selinux_file_fcntl(struct file *file, unsigned int cmd,
3393 			      unsigned long arg)
3394 {
3395 	const struct cred *cred = current_cred();
3396 	int err = 0;
3397 
3398 	switch (cmd) {
3399 	case F_SETFL:
3400 		if ((file->f_flags & O_APPEND) && !(arg & O_APPEND)) {
3401 			err = file_has_perm(cred, file, FILE__WRITE);
3402 			break;
3403 		}
3404 		/* fall through */
3405 	case F_SETOWN:
3406 	case F_SETSIG:
3407 	case F_GETFL:
3408 	case F_GETOWN:
3409 	case F_GETSIG:
3410 	case F_GETOWNER_UIDS:
3411 		/* Just check FD__USE permission */
3412 		err = file_has_perm(cred, file, 0);
3413 		break;
3414 	case F_GETLK:
3415 	case F_SETLK:
3416 	case F_SETLKW:
3417 	case F_OFD_GETLK:
3418 	case F_OFD_SETLK:
3419 	case F_OFD_SETLKW:
3420 #if BITS_PER_LONG == 32
3421 	case F_GETLK64:
3422 	case F_SETLK64:
3423 	case F_SETLKW64:
3424 #endif
3425 		err = file_has_perm(cred, file, FILE__LOCK);
3426 		break;
3427 	}
3428 
3429 	return err;
3430 }
3431 
selinux_file_set_fowner(struct file * file)3432 static void selinux_file_set_fowner(struct file *file)
3433 {
3434 	struct file_security_struct *fsec;
3435 
3436 	fsec = file->f_security;
3437 	fsec->fown_sid = current_sid();
3438 }
3439 
selinux_file_send_sigiotask(struct task_struct * tsk,struct fown_struct * fown,int signum)3440 static int selinux_file_send_sigiotask(struct task_struct *tsk,
3441 				       struct fown_struct *fown, int signum)
3442 {
3443 	struct file *file;
3444 	u32 sid = task_sid(tsk);
3445 	u32 perm;
3446 	struct file_security_struct *fsec;
3447 
3448 	/* struct fown_struct is never outside the context of a struct file */
3449 	file = container_of(fown, struct file, f_owner);
3450 
3451 	fsec = file->f_security;
3452 
3453 	if (!signum)
3454 		perm = signal_to_av(SIGIO); /* as per send_sigio_to_task */
3455 	else
3456 		perm = signal_to_av(signum);
3457 
3458 	return avc_has_perm(fsec->fown_sid, sid,
3459 			    SECCLASS_PROCESS, perm, NULL);
3460 }
3461 
selinux_file_receive(struct file * file)3462 static int selinux_file_receive(struct file *file)
3463 {
3464 	const struct cred *cred = current_cred();
3465 
3466 	return file_has_perm(cred, file, file_to_av(file));
3467 }
3468 
selinux_file_open(struct file * file,const struct cred * cred)3469 static int selinux_file_open(struct file *file, const struct cred *cred)
3470 {
3471 	struct file_security_struct *fsec;
3472 	struct inode_security_struct *isec;
3473 
3474 	fsec = file->f_security;
3475 	isec = file_inode(file)->i_security;
3476 	/*
3477 	 * Save inode label and policy sequence number
3478 	 * at open-time so that selinux_file_permission
3479 	 * can determine whether revalidation is necessary.
3480 	 * Task label is already saved in the file security
3481 	 * struct as its SID.
3482 	 */
3483 	fsec->isid = isec->sid;
3484 	fsec->pseqno = avc_policy_seqno();
3485 	/*
3486 	 * Since the inode label or policy seqno may have changed
3487 	 * between the selinux_inode_permission check and the saving
3488 	 * of state above, recheck that access is still permitted.
3489 	 * Otherwise, access might never be revalidated against the
3490 	 * new inode label or new policy.
3491 	 * This check is not redundant - do not remove.
3492 	 */
3493 	return file_path_has_perm(cred, file, open_file_to_av(file));
3494 }
3495 
3496 /* task security operations */
3497 
selinux_task_create(unsigned long clone_flags)3498 static int selinux_task_create(unsigned long clone_flags)
3499 {
3500 	return current_has_perm(current, PROCESS__FORK);
3501 }
3502 
3503 /*
3504  * allocate the SELinux part of blank credentials
3505  */
selinux_cred_alloc_blank(struct cred * cred,gfp_t gfp)3506 static int selinux_cred_alloc_blank(struct cred *cred, gfp_t gfp)
3507 {
3508 	struct task_security_struct *tsec;
3509 
3510 	tsec = kzalloc(sizeof(struct task_security_struct), gfp);
3511 	if (!tsec)
3512 		return -ENOMEM;
3513 
3514 	cred->security = tsec;
3515 	return 0;
3516 }
3517 
3518 /*
3519  * detach and free the LSM part of a set of credentials
3520  */
selinux_cred_free(struct cred * cred)3521 static void selinux_cred_free(struct cred *cred)
3522 {
3523 	struct task_security_struct *tsec = cred->security;
3524 
3525 	/*
3526 	 * cred->security == NULL if security_cred_alloc_blank() or
3527 	 * security_prepare_creds() returned an error.
3528 	 */
3529 	BUG_ON(cred->security && (unsigned long) cred->security < PAGE_SIZE);
3530 	cred->security = (void *) 0x7UL;
3531 	kfree(tsec);
3532 }
3533 
3534 /*
3535  * prepare a new set of credentials for modification
3536  */
selinux_cred_prepare(struct cred * new,const struct cred * old,gfp_t gfp)3537 static int selinux_cred_prepare(struct cred *new, const struct cred *old,
3538 				gfp_t gfp)
3539 {
3540 	const struct task_security_struct *old_tsec;
3541 	struct task_security_struct *tsec;
3542 
3543 	old_tsec = old->security;
3544 
3545 	tsec = kmemdup(old_tsec, sizeof(struct task_security_struct), gfp);
3546 	if (!tsec)
3547 		return -ENOMEM;
3548 
3549 	new->security = tsec;
3550 	return 0;
3551 }
3552 
3553 /*
3554  * transfer the SELinux data to a blank set of creds
3555  */
selinux_cred_transfer(struct cred * new,const struct cred * old)3556 static void selinux_cred_transfer(struct cred *new, const struct cred *old)
3557 {
3558 	const struct task_security_struct *old_tsec = old->security;
3559 	struct task_security_struct *tsec = new->security;
3560 
3561 	*tsec = *old_tsec;
3562 }
3563 
3564 /*
3565  * set the security data for a kernel service
3566  * - all the creation contexts are set to unlabelled
3567  */
selinux_kernel_act_as(struct cred * new,u32 secid)3568 static int selinux_kernel_act_as(struct cred *new, u32 secid)
3569 {
3570 	struct task_security_struct *tsec = new->security;
3571 	u32 sid = current_sid();
3572 	int ret;
3573 
3574 	ret = avc_has_perm(sid, secid,
3575 			   SECCLASS_KERNEL_SERVICE,
3576 			   KERNEL_SERVICE__USE_AS_OVERRIDE,
3577 			   NULL);
3578 	if (ret == 0) {
3579 		tsec->sid = secid;
3580 		tsec->create_sid = 0;
3581 		tsec->keycreate_sid = 0;
3582 		tsec->sockcreate_sid = 0;
3583 	}
3584 	return ret;
3585 }
3586 
3587 /*
3588  * set the file creation context in a security record to the same as the
3589  * objective context of the specified inode
3590  */
selinux_kernel_create_files_as(struct cred * new,struct inode * inode)3591 static int selinux_kernel_create_files_as(struct cred *new, struct inode *inode)
3592 {
3593 	struct inode_security_struct *isec = inode->i_security;
3594 	struct task_security_struct *tsec = new->security;
3595 	u32 sid = current_sid();
3596 	int ret;
3597 
3598 	ret = avc_has_perm(sid, isec->sid,
3599 			   SECCLASS_KERNEL_SERVICE,
3600 			   KERNEL_SERVICE__CREATE_FILES_AS,
3601 			   NULL);
3602 
3603 	if (ret == 0)
3604 		tsec->create_sid = isec->sid;
3605 	return ret;
3606 }
3607 
selinux_kernel_module_request(char * kmod_name)3608 static int selinux_kernel_module_request(char *kmod_name)
3609 {
3610 	u32 sid;
3611 	struct common_audit_data ad;
3612 
3613 	sid = task_sid(current);
3614 
3615 	ad.type = LSM_AUDIT_DATA_KMOD;
3616 	ad.u.kmod_name = kmod_name;
3617 
3618 	return avc_has_perm(sid, SECINITSID_KERNEL, SECCLASS_SYSTEM,
3619 			    SYSTEM__MODULE_REQUEST, &ad);
3620 }
3621 
selinux_task_setpgid(struct task_struct * p,pid_t pgid)3622 static int selinux_task_setpgid(struct task_struct *p, pid_t pgid)
3623 {
3624 	return current_has_perm(p, PROCESS__SETPGID);
3625 }
3626 
selinux_task_getpgid(struct task_struct * p)3627 static int selinux_task_getpgid(struct task_struct *p)
3628 {
3629 	return current_has_perm(p, PROCESS__GETPGID);
3630 }
3631 
selinux_task_getsid(struct task_struct * p)3632 static int selinux_task_getsid(struct task_struct *p)
3633 {
3634 	return current_has_perm(p, PROCESS__GETSESSION);
3635 }
3636 
selinux_task_getsecid(struct task_struct * p,u32 * secid)3637 static void selinux_task_getsecid(struct task_struct *p, u32 *secid)
3638 {
3639 	*secid = task_sid(p);
3640 }
3641 
selinux_task_setnice(struct task_struct * p,int nice)3642 static int selinux_task_setnice(struct task_struct *p, int nice)
3643 {
3644 	int rc;
3645 
3646 	rc = cap_task_setnice(p, nice);
3647 	if (rc)
3648 		return rc;
3649 
3650 	return current_has_perm(p, PROCESS__SETSCHED);
3651 }
3652 
selinux_task_setioprio(struct task_struct * p,int ioprio)3653 static int selinux_task_setioprio(struct task_struct *p, int ioprio)
3654 {
3655 	int rc;
3656 
3657 	rc = cap_task_setioprio(p, ioprio);
3658 	if (rc)
3659 		return rc;
3660 
3661 	return current_has_perm(p, PROCESS__SETSCHED);
3662 }
3663 
selinux_task_getioprio(struct task_struct * p)3664 static int selinux_task_getioprio(struct task_struct *p)
3665 {
3666 	return current_has_perm(p, PROCESS__GETSCHED);
3667 }
3668 
selinux_task_setrlimit(struct task_struct * p,unsigned int resource,struct rlimit * new_rlim)3669 static int selinux_task_setrlimit(struct task_struct *p, unsigned int resource,
3670 		struct rlimit *new_rlim)
3671 {
3672 	struct rlimit *old_rlim = p->signal->rlim + resource;
3673 
3674 	/* Control the ability to change the hard limit (whether
3675 	   lowering or raising it), so that the hard limit can
3676 	   later be used as a safe reset point for the soft limit
3677 	   upon context transitions.  See selinux_bprm_committing_creds. */
3678 	if (old_rlim->rlim_max != new_rlim->rlim_max)
3679 		return current_has_perm(p, PROCESS__SETRLIMIT);
3680 
3681 	return 0;
3682 }
3683 
selinux_task_setscheduler(struct task_struct * p)3684 static int selinux_task_setscheduler(struct task_struct *p)
3685 {
3686 	int rc;
3687 
3688 	rc = cap_task_setscheduler(p);
3689 	if (rc)
3690 		return rc;
3691 
3692 	return current_has_perm(p, PROCESS__SETSCHED);
3693 }
3694 
selinux_task_getscheduler(struct task_struct * p)3695 static int selinux_task_getscheduler(struct task_struct *p)
3696 {
3697 	return current_has_perm(p, PROCESS__GETSCHED);
3698 }
3699 
selinux_task_movememory(struct task_struct * p)3700 static int selinux_task_movememory(struct task_struct *p)
3701 {
3702 	return current_has_perm(p, PROCESS__SETSCHED);
3703 }
3704 
selinux_task_kill(struct task_struct * p,struct siginfo * info,int sig,u32 secid)3705 static int selinux_task_kill(struct task_struct *p, struct siginfo *info,
3706 				int sig, u32 secid)
3707 {
3708 	u32 perm;
3709 	int rc;
3710 
3711 	if (!sig)
3712 		perm = PROCESS__SIGNULL; /* null signal; existence test */
3713 	else
3714 		perm = signal_to_av(sig);
3715 	if (secid)
3716 		rc = avc_has_perm(secid, task_sid(p),
3717 				  SECCLASS_PROCESS, perm, NULL);
3718 	else
3719 		rc = current_has_perm(p, perm);
3720 	return rc;
3721 }
3722 
selinux_task_wait(struct task_struct * p)3723 static int selinux_task_wait(struct task_struct *p)
3724 {
3725 	return task_has_perm(p, current, PROCESS__SIGCHLD);
3726 }
3727 
selinux_task_to_inode(struct task_struct * p,struct inode * inode)3728 static void selinux_task_to_inode(struct task_struct *p,
3729 				  struct inode *inode)
3730 {
3731 	struct inode_security_struct *isec = inode->i_security;
3732 	u32 sid = task_sid(p);
3733 
3734 	isec->sid = sid;
3735 	isec->initialized = 1;
3736 }
3737 
3738 /* Returns error only if unable to parse addresses */
selinux_parse_skb_ipv4(struct sk_buff * skb,struct common_audit_data * ad,u8 * proto)3739 static int selinux_parse_skb_ipv4(struct sk_buff *skb,
3740 			struct common_audit_data *ad, u8 *proto)
3741 {
3742 	int offset, ihlen, ret = -EINVAL;
3743 	struct iphdr _iph, *ih;
3744 
3745 	offset = skb_network_offset(skb);
3746 	ih = skb_header_pointer(skb, offset, sizeof(_iph), &_iph);
3747 	if (ih == NULL)
3748 		goto out;
3749 
3750 	ihlen = ih->ihl * 4;
3751 	if (ihlen < sizeof(_iph))
3752 		goto out;
3753 
3754 	ad->u.net->v4info.saddr = ih->saddr;
3755 	ad->u.net->v4info.daddr = ih->daddr;
3756 	ret = 0;
3757 
3758 	if (proto)
3759 		*proto = ih->protocol;
3760 
3761 	switch (ih->protocol) {
3762 	case IPPROTO_TCP: {
3763 		struct tcphdr _tcph, *th;
3764 
3765 		if (ntohs(ih->frag_off) & IP_OFFSET)
3766 			break;
3767 
3768 		offset += ihlen;
3769 		th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
3770 		if (th == NULL)
3771 			break;
3772 
3773 		ad->u.net->sport = th->source;
3774 		ad->u.net->dport = th->dest;
3775 		break;
3776 	}
3777 
3778 	case IPPROTO_UDP: {
3779 		struct udphdr _udph, *uh;
3780 
3781 		if (ntohs(ih->frag_off) & IP_OFFSET)
3782 			break;
3783 
3784 		offset += ihlen;
3785 		uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
3786 		if (uh == NULL)
3787 			break;
3788 
3789 		ad->u.net->sport = uh->source;
3790 		ad->u.net->dport = uh->dest;
3791 		break;
3792 	}
3793 
3794 	case IPPROTO_DCCP: {
3795 		struct dccp_hdr _dccph, *dh;
3796 
3797 		if (ntohs(ih->frag_off) & IP_OFFSET)
3798 			break;
3799 
3800 		offset += ihlen;
3801 		dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph);
3802 		if (dh == NULL)
3803 			break;
3804 
3805 		ad->u.net->sport = dh->dccph_sport;
3806 		ad->u.net->dport = dh->dccph_dport;
3807 		break;
3808 	}
3809 
3810 	default:
3811 		break;
3812 	}
3813 out:
3814 	return ret;
3815 }
3816 
3817 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
3818 
3819 /* Returns error only if unable to parse addresses */
selinux_parse_skb_ipv6(struct sk_buff * skb,struct common_audit_data * ad,u8 * proto)3820 static int selinux_parse_skb_ipv6(struct sk_buff *skb,
3821 			struct common_audit_data *ad, u8 *proto)
3822 {
3823 	u8 nexthdr;
3824 	int ret = -EINVAL, offset;
3825 	struct ipv6hdr _ipv6h, *ip6;
3826 	__be16 frag_off;
3827 
3828 	offset = skb_network_offset(skb);
3829 	ip6 = skb_header_pointer(skb, offset, sizeof(_ipv6h), &_ipv6h);
3830 	if (ip6 == NULL)
3831 		goto out;
3832 
3833 	ad->u.net->v6info.saddr = ip6->saddr;
3834 	ad->u.net->v6info.daddr = ip6->daddr;
3835 	ret = 0;
3836 
3837 	nexthdr = ip6->nexthdr;
3838 	offset += sizeof(_ipv6h);
3839 	offset = ipv6_skip_exthdr(skb, offset, &nexthdr, &frag_off);
3840 	if (offset < 0)
3841 		goto out;
3842 
3843 	if (proto)
3844 		*proto = nexthdr;
3845 
3846 	switch (nexthdr) {
3847 	case IPPROTO_TCP: {
3848 		struct tcphdr _tcph, *th;
3849 
3850 		th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
3851 		if (th == NULL)
3852 			break;
3853 
3854 		ad->u.net->sport = th->source;
3855 		ad->u.net->dport = th->dest;
3856 		break;
3857 	}
3858 
3859 	case IPPROTO_UDP: {
3860 		struct udphdr _udph, *uh;
3861 
3862 		uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
3863 		if (uh == NULL)
3864 			break;
3865 
3866 		ad->u.net->sport = uh->source;
3867 		ad->u.net->dport = uh->dest;
3868 		break;
3869 	}
3870 
3871 	case IPPROTO_DCCP: {
3872 		struct dccp_hdr _dccph, *dh;
3873 
3874 		dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph);
3875 		if (dh == NULL)
3876 			break;
3877 
3878 		ad->u.net->sport = dh->dccph_sport;
3879 		ad->u.net->dport = dh->dccph_dport;
3880 		break;
3881 	}
3882 
3883 	/* includes fragments */
3884 	default:
3885 		break;
3886 	}
3887 out:
3888 	return ret;
3889 }
3890 
3891 #endif /* IPV6 */
3892 
selinux_parse_skb(struct sk_buff * skb,struct common_audit_data * ad,char ** _addrp,int src,u8 * proto)3893 static int selinux_parse_skb(struct sk_buff *skb, struct common_audit_data *ad,
3894 			     char **_addrp, int src, u8 *proto)
3895 {
3896 	char *addrp;
3897 	int ret;
3898 
3899 	switch (ad->u.net->family) {
3900 	case PF_INET:
3901 		ret = selinux_parse_skb_ipv4(skb, ad, proto);
3902 		if (ret)
3903 			goto parse_error;
3904 		addrp = (char *)(src ? &ad->u.net->v4info.saddr :
3905 				       &ad->u.net->v4info.daddr);
3906 		goto okay;
3907 
3908 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
3909 	case PF_INET6:
3910 		ret = selinux_parse_skb_ipv6(skb, ad, proto);
3911 		if (ret)
3912 			goto parse_error;
3913 		addrp = (char *)(src ? &ad->u.net->v6info.saddr :
3914 				       &ad->u.net->v6info.daddr);
3915 		goto okay;
3916 #endif	/* IPV6 */
3917 	default:
3918 		addrp = NULL;
3919 		goto okay;
3920 	}
3921 
3922 parse_error:
3923 	printk(KERN_WARNING
3924 	       "SELinux: failure in selinux_parse_skb(),"
3925 	       " unable to parse packet\n");
3926 	return ret;
3927 
3928 okay:
3929 	if (_addrp)
3930 		*_addrp = addrp;
3931 	return 0;
3932 }
3933 
3934 /**
3935  * selinux_skb_peerlbl_sid - Determine the peer label of a packet
3936  * @skb: the packet
3937  * @family: protocol family
3938  * @sid: the packet's peer label SID
3939  *
3940  * Description:
3941  * Check the various different forms of network peer labeling and determine
3942  * the peer label/SID for the packet; most of the magic actually occurs in
3943  * the security server function security_net_peersid_cmp().  The function
3944  * returns zero if the value in @sid is valid (although it may be SECSID_NULL)
3945  * or -EACCES if @sid is invalid due to inconsistencies with the different
3946  * peer labels.
3947  *
3948  */
selinux_skb_peerlbl_sid(struct sk_buff * skb,u16 family,u32 * sid)3949 static int selinux_skb_peerlbl_sid(struct sk_buff *skb, u16 family, u32 *sid)
3950 {
3951 	int err;
3952 	u32 xfrm_sid;
3953 	u32 nlbl_sid;
3954 	u32 nlbl_type;
3955 
3956 	err = selinux_xfrm_skb_sid(skb, &xfrm_sid);
3957 	if (unlikely(err))
3958 		return -EACCES;
3959 	err = selinux_netlbl_skbuff_getsid(skb, family, &nlbl_type, &nlbl_sid);
3960 	if (unlikely(err))
3961 		return -EACCES;
3962 
3963 	err = security_net_peersid_resolve(nlbl_sid, nlbl_type, xfrm_sid, sid);
3964 	if (unlikely(err)) {
3965 		printk(KERN_WARNING
3966 		       "SELinux: failure in selinux_skb_peerlbl_sid(),"
3967 		       " unable to determine packet's peer label\n");
3968 		return -EACCES;
3969 	}
3970 
3971 	return 0;
3972 }
3973 
3974 /**
3975  * selinux_conn_sid - Determine the child socket label for a connection
3976  * @sk_sid: the parent socket's SID
3977  * @skb_sid: the packet's SID
3978  * @conn_sid: the resulting connection SID
3979  *
3980  * If @skb_sid is valid then the user:role:type information from @sk_sid is
3981  * combined with the MLS information from @skb_sid in order to create
3982  * @conn_sid.  If @skb_sid is not valid then then @conn_sid is simply a copy
3983  * of @sk_sid.  Returns zero on success, negative values on failure.
3984  *
3985  */
selinux_conn_sid(u32 sk_sid,u32 skb_sid,u32 * conn_sid)3986 static int selinux_conn_sid(u32 sk_sid, u32 skb_sid, u32 *conn_sid)
3987 {
3988 	int err = 0;
3989 
3990 	if (skb_sid != SECSID_NULL)
3991 		err = security_sid_mls_copy(sk_sid, skb_sid, conn_sid);
3992 	else
3993 		*conn_sid = sk_sid;
3994 
3995 	return err;
3996 }
3997 
3998 /* socket security operations */
3999 
socket_sockcreate_sid(const struct task_security_struct * tsec,u16 secclass,u32 * socksid)4000 static int socket_sockcreate_sid(const struct task_security_struct *tsec,
4001 				 u16 secclass, u32 *socksid)
4002 {
4003 	if (tsec->sockcreate_sid > SECSID_NULL) {
4004 		*socksid = tsec->sockcreate_sid;
4005 		return 0;
4006 	}
4007 
4008 	return security_transition_sid(tsec->sid, tsec->sid, secclass, NULL,
4009 				       socksid);
4010 }
4011 
sock_has_perm(struct task_struct * task,struct sock * sk,u32 perms)4012 static int sock_has_perm(struct task_struct *task, struct sock *sk, u32 perms)
4013 {
4014 	struct sk_security_struct *sksec = sk->sk_security;
4015 	struct common_audit_data ad;
4016 	struct lsm_network_audit net = {0,};
4017 	u32 tsid = task_sid(task);
4018 
4019 	if (sksec->sid == SECINITSID_KERNEL)
4020 		return 0;
4021 
4022 	ad.type = LSM_AUDIT_DATA_NET;
4023 	ad.u.net = &net;
4024 	ad.u.net->sk = sk;
4025 
4026 	return avc_has_perm(tsid, sksec->sid, sksec->sclass, perms, &ad);
4027 }
4028 
selinux_socket_create(int family,int type,int protocol,int kern)4029 static int selinux_socket_create(int family, int type,
4030 				 int protocol, int kern)
4031 {
4032 	const struct task_security_struct *tsec = current_security();
4033 	u32 newsid;
4034 	u16 secclass;
4035 	int rc;
4036 
4037 	if (kern)
4038 		return 0;
4039 
4040 	secclass = socket_type_to_security_class(family, type, protocol);
4041 	rc = socket_sockcreate_sid(tsec, secclass, &newsid);
4042 	if (rc)
4043 		return rc;
4044 
4045 	return avc_has_perm(tsec->sid, newsid, secclass, SOCKET__CREATE, NULL);
4046 }
4047 
selinux_socket_post_create(struct socket * sock,int family,int type,int protocol,int kern)4048 static int selinux_socket_post_create(struct socket *sock, int family,
4049 				      int type, int protocol, int kern)
4050 {
4051 	const struct task_security_struct *tsec = current_security();
4052 	struct inode_security_struct *isec = SOCK_INODE(sock)->i_security;
4053 	struct sk_security_struct *sksec;
4054 	int err = 0;
4055 
4056 	isec->sclass = socket_type_to_security_class(family, type, protocol);
4057 
4058 	if (kern)
4059 		isec->sid = SECINITSID_KERNEL;
4060 	else {
4061 		err = socket_sockcreate_sid(tsec, isec->sclass, &(isec->sid));
4062 		if (err)
4063 			return err;
4064 	}
4065 
4066 	isec->initialized = 1;
4067 
4068 	if (sock->sk) {
4069 		sksec = sock->sk->sk_security;
4070 		sksec->sid = isec->sid;
4071 		sksec->sclass = isec->sclass;
4072 		err = selinux_netlbl_socket_post_create(sock->sk, family);
4073 	}
4074 
4075 	return err;
4076 }
4077 
4078 /* Range of port numbers used to automatically bind.
4079    Need to determine whether we should perform a name_bind
4080    permission check between the socket and the port number. */
4081 
selinux_socket_bind(struct socket * sock,struct sockaddr * address,int addrlen)4082 static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
4083 {
4084 	struct sock *sk = sock->sk;
4085 	u16 family;
4086 	int err;
4087 
4088 	err = sock_has_perm(current, sk, SOCKET__BIND);
4089 	if (err)
4090 		goto out;
4091 
4092 	/*
4093 	 * If PF_INET or PF_INET6, check name_bind permission for the port.
4094 	 * Multiple address binding for SCTP is not supported yet: we just
4095 	 * check the first address now.
4096 	 */
4097 	family = sk->sk_family;
4098 	if (family == PF_INET || family == PF_INET6) {
4099 		char *addrp;
4100 		struct sk_security_struct *sksec = sk->sk_security;
4101 		struct common_audit_data ad;
4102 		struct lsm_network_audit net = {0,};
4103 		struct sockaddr_in *addr4 = NULL;
4104 		struct sockaddr_in6 *addr6 = NULL;
4105 		unsigned short snum;
4106 		u32 sid, node_perm;
4107 
4108 		if (family == PF_INET) {
4109 			addr4 = (struct sockaddr_in *)address;
4110 			snum = ntohs(addr4->sin_port);
4111 			addrp = (char *)&addr4->sin_addr.s_addr;
4112 		} else {
4113 			addr6 = (struct sockaddr_in6 *)address;
4114 			snum = ntohs(addr6->sin6_port);
4115 			addrp = (char *)&addr6->sin6_addr.s6_addr;
4116 		}
4117 
4118 		if (snum) {
4119 			int low, high;
4120 
4121 			inet_get_local_port_range(sock_net(sk), &low, &high);
4122 
4123 			if (snum < max(PROT_SOCK, low) || snum > high) {
4124 				err = sel_netport_sid(sk->sk_protocol,
4125 						      snum, &sid);
4126 				if (err)
4127 					goto out;
4128 				ad.type = LSM_AUDIT_DATA_NET;
4129 				ad.u.net = &net;
4130 				ad.u.net->sport = htons(snum);
4131 				ad.u.net->family = family;
4132 				err = avc_has_perm(sksec->sid, sid,
4133 						   sksec->sclass,
4134 						   SOCKET__NAME_BIND, &ad);
4135 				if (err)
4136 					goto out;
4137 			}
4138 		}
4139 
4140 		switch (sksec->sclass) {
4141 		case SECCLASS_TCP_SOCKET:
4142 			node_perm = TCP_SOCKET__NODE_BIND;
4143 			break;
4144 
4145 		case SECCLASS_UDP_SOCKET:
4146 			node_perm = UDP_SOCKET__NODE_BIND;
4147 			break;
4148 
4149 		case SECCLASS_DCCP_SOCKET:
4150 			node_perm = DCCP_SOCKET__NODE_BIND;
4151 			break;
4152 
4153 		default:
4154 			node_perm = RAWIP_SOCKET__NODE_BIND;
4155 			break;
4156 		}
4157 
4158 		err = sel_netnode_sid(addrp, family, &sid);
4159 		if (err)
4160 			goto out;
4161 
4162 		ad.type = LSM_AUDIT_DATA_NET;
4163 		ad.u.net = &net;
4164 		ad.u.net->sport = htons(snum);
4165 		ad.u.net->family = family;
4166 
4167 		if (family == PF_INET)
4168 			ad.u.net->v4info.saddr = addr4->sin_addr.s_addr;
4169 		else
4170 			ad.u.net->v6info.saddr = addr6->sin6_addr;
4171 
4172 		err = avc_has_perm(sksec->sid, sid,
4173 				   sksec->sclass, node_perm, &ad);
4174 		if (err)
4175 			goto out;
4176 	}
4177 out:
4178 	return err;
4179 }
4180 
selinux_socket_connect(struct socket * sock,struct sockaddr * address,int addrlen)4181 static int selinux_socket_connect(struct socket *sock, struct sockaddr *address, int addrlen)
4182 {
4183 	struct sock *sk = sock->sk;
4184 	struct sk_security_struct *sksec = sk->sk_security;
4185 	int err;
4186 
4187 	err = sock_has_perm(current, sk, SOCKET__CONNECT);
4188 	if (err)
4189 		return err;
4190 
4191 	/*
4192 	 * If a TCP or DCCP socket, check name_connect permission for the port.
4193 	 */
4194 	if (sksec->sclass == SECCLASS_TCP_SOCKET ||
4195 	    sksec->sclass == SECCLASS_DCCP_SOCKET) {
4196 		struct common_audit_data ad;
4197 		struct lsm_network_audit net = {0,};
4198 		struct sockaddr_in *addr4 = NULL;
4199 		struct sockaddr_in6 *addr6 = NULL;
4200 		unsigned short snum;
4201 		u32 sid, perm;
4202 
4203 		if (sk->sk_family == PF_INET) {
4204 			addr4 = (struct sockaddr_in *)address;
4205 			if (addrlen < sizeof(struct sockaddr_in))
4206 				return -EINVAL;
4207 			snum = ntohs(addr4->sin_port);
4208 		} else {
4209 			addr6 = (struct sockaddr_in6 *)address;
4210 			if (addrlen < SIN6_LEN_RFC2133)
4211 				return -EINVAL;
4212 			snum = ntohs(addr6->sin6_port);
4213 		}
4214 
4215 		err = sel_netport_sid(sk->sk_protocol, snum, &sid);
4216 		if (err)
4217 			goto out;
4218 
4219 		perm = (sksec->sclass == SECCLASS_TCP_SOCKET) ?
4220 		       TCP_SOCKET__NAME_CONNECT : DCCP_SOCKET__NAME_CONNECT;
4221 
4222 		ad.type = LSM_AUDIT_DATA_NET;
4223 		ad.u.net = &net;
4224 		ad.u.net->dport = htons(snum);
4225 		ad.u.net->family = sk->sk_family;
4226 		err = avc_has_perm(sksec->sid, sid, sksec->sclass, perm, &ad);
4227 		if (err)
4228 			goto out;
4229 	}
4230 
4231 	err = selinux_netlbl_socket_connect(sk, address);
4232 
4233 out:
4234 	return err;
4235 }
4236 
selinux_socket_listen(struct socket * sock,int backlog)4237 static int selinux_socket_listen(struct socket *sock, int backlog)
4238 {
4239 	return sock_has_perm(current, sock->sk, SOCKET__LISTEN);
4240 }
4241 
selinux_socket_accept(struct socket * sock,struct socket * newsock)4242 static int selinux_socket_accept(struct socket *sock, struct socket *newsock)
4243 {
4244 	int err;
4245 	struct inode_security_struct *isec;
4246 	struct inode_security_struct *newisec;
4247 
4248 	err = sock_has_perm(current, sock->sk, SOCKET__ACCEPT);
4249 	if (err)
4250 		return err;
4251 
4252 	newisec = SOCK_INODE(newsock)->i_security;
4253 
4254 	isec = SOCK_INODE(sock)->i_security;
4255 	newisec->sclass = isec->sclass;
4256 	newisec->sid = isec->sid;
4257 	newisec->initialized = 1;
4258 
4259 	return 0;
4260 }
4261 
selinux_socket_sendmsg(struct socket * sock,struct msghdr * msg,int size)4262 static int selinux_socket_sendmsg(struct socket *sock, struct msghdr *msg,
4263 				  int size)
4264 {
4265 	return sock_has_perm(current, sock->sk, SOCKET__WRITE);
4266 }
4267 
selinux_socket_recvmsg(struct socket * sock,struct msghdr * msg,int size,int flags)4268 static int selinux_socket_recvmsg(struct socket *sock, struct msghdr *msg,
4269 				  int size, int flags)
4270 {
4271 	return sock_has_perm(current, sock->sk, SOCKET__READ);
4272 }
4273 
selinux_socket_getsockname(struct socket * sock)4274 static int selinux_socket_getsockname(struct socket *sock)
4275 {
4276 	return sock_has_perm(current, sock->sk, SOCKET__GETATTR);
4277 }
4278 
selinux_socket_getpeername(struct socket * sock)4279 static int selinux_socket_getpeername(struct socket *sock)
4280 {
4281 	return sock_has_perm(current, sock->sk, SOCKET__GETATTR);
4282 }
4283 
selinux_socket_setsockopt(struct socket * sock,int level,int optname)4284 static int selinux_socket_setsockopt(struct socket *sock, int level, int optname)
4285 {
4286 	int err;
4287 
4288 	err = sock_has_perm(current, sock->sk, SOCKET__SETOPT);
4289 	if (err)
4290 		return err;
4291 
4292 	return selinux_netlbl_socket_setsockopt(sock, level, optname);
4293 }
4294 
selinux_socket_getsockopt(struct socket * sock,int level,int optname)4295 static int selinux_socket_getsockopt(struct socket *sock, int level,
4296 				     int optname)
4297 {
4298 	return sock_has_perm(current, sock->sk, SOCKET__GETOPT);
4299 }
4300 
selinux_socket_shutdown(struct socket * sock,int how)4301 static int selinux_socket_shutdown(struct socket *sock, int how)
4302 {
4303 	return sock_has_perm(current, sock->sk, SOCKET__SHUTDOWN);
4304 }
4305 
selinux_socket_unix_stream_connect(struct sock * sock,struct sock * other,struct sock * newsk)4306 static int selinux_socket_unix_stream_connect(struct sock *sock,
4307 					      struct sock *other,
4308 					      struct sock *newsk)
4309 {
4310 	struct sk_security_struct *sksec_sock = sock->sk_security;
4311 	struct sk_security_struct *sksec_other = other->sk_security;
4312 	struct sk_security_struct *sksec_new = newsk->sk_security;
4313 	struct common_audit_data ad;
4314 	struct lsm_network_audit net = {0,};
4315 	int err;
4316 
4317 	ad.type = LSM_AUDIT_DATA_NET;
4318 	ad.u.net = &net;
4319 	ad.u.net->sk = other;
4320 
4321 	err = avc_has_perm(sksec_sock->sid, sksec_other->sid,
4322 			   sksec_other->sclass,
4323 			   UNIX_STREAM_SOCKET__CONNECTTO, &ad);
4324 	if (err)
4325 		return err;
4326 
4327 	/* server child socket */
4328 	sksec_new->peer_sid = sksec_sock->sid;
4329 	err = security_sid_mls_copy(sksec_other->sid, sksec_sock->sid,
4330 				    &sksec_new->sid);
4331 	if (err)
4332 		return err;
4333 
4334 	/* connecting socket */
4335 	sksec_sock->peer_sid = sksec_new->sid;
4336 
4337 	return 0;
4338 }
4339 
selinux_socket_unix_may_send(struct socket * sock,struct socket * other)4340 static int selinux_socket_unix_may_send(struct socket *sock,
4341 					struct socket *other)
4342 {
4343 	struct sk_security_struct *ssec = sock->sk->sk_security;
4344 	struct sk_security_struct *osec = other->sk->sk_security;
4345 	struct common_audit_data ad;
4346 	struct lsm_network_audit net = {0,};
4347 
4348 	ad.type = LSM_AUDIT_DATA_NET;
4349 	ad.u.net = &net;
4350 	ad.u.net->sk = other->sk;
4351 
4352 	return avc_has_perm(ssec->sid, osec->sid, osec->sclass, SOCKET__SENDTO,
4353 			    &ad);
4354 }
4355 
selinux_inet_sys_rcv_skb(struct net * ns,int ifindex,char * addrp,u16 family,u32 peer_sid,struct common_audit_data * ad)4356 static int selinux_inet_sys_rcv_skb(struct net *ns, int ifindex,
4357 				    char *addrp, u16 family, u32 peer_sid,
4358 				    struct common_audit_data *ad)
4359 {
4360 	int err;
4361 	u32 if_sid;
4362 	u32 node_sid;
4363 
4364 	err = sel_netif_sid(ns, ifindex, &if_sid);
4365 	if (err)
4366 		return err;
4367 	err = avc_has_perm(peer_sid, if_sid,
4368 			   SECCLASS_NETIF, NETIF__INGRESS, ad);
4369 	if (err)
4370 		return err;
4371 
4372 	err = sel_netnode_sid(addrp, family, &node_sid);
4373 	if (err)
4374 		return err;
4375 	return avc_has_perm(peer_sid, node_sid,
4376 			    SECCLASS_NODE, NODE__RECVFROM, ad);
4377 }
4378 
selinux_sock_rcv_skb_compat(struct sock * sk,struct sk_buff * skb,u16 family)4379 static int selinux_sock_rcv_skb_compat(struct sock *sk, struct sk_buff *skb,
4380 				       u16 family)
4381 {
4382 	int err = 0;
4383 	struct sk_security_struct *sksec = sk->sk_security;
4384 	u32 sk_sid = sksec->sid;
4385 	struct common_audit_data ad;
4386 	struct lsm_network_audit net = {0,};
4387 	char *addrp;
4388 
4389 	ad.type = LSM_AUDIT_DATA_NET;
4390 	ad.u.net = &net;
4391 	ad.u.net->netif = skb->skb_iif;
4392 	ad.u.net->family = family;
4393 	err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
4394 	if (err)
4395 		return err;
4396 
4397 	if (selinux_secmark_enabled()) {
4398 		err = avc_has_perm(sk_sid, skb->secmark, SECCLASS_PACKET,
4399 				   PACKET__RECV, &ad);
4400 		if (err)
4401 			return err;
4402 	}
4403 
4404 	err = selinux_netlbl_sock_rcv_skb(sksec, skb, family, &ad);
4405 	if (err)
4406 		return err;
4407 	err = selinux_xfrm_sock_rcv_skb(sksec->sid, skb, &ad);
4408 
4409 	return err;
4410 }
4411 
selinux_socket_sock_rcv_skb(struct sock * sk,struct sk_buff * skb)4412 static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
4413 {
4414 	int err;
4415 	struct sk_security_struct *sksec = sk->sk_security;
4416 	u16 family = sk->sk_family;
4417 	u32 sk_sid = sksec->sid;
4418 	struct common_audit_data ad;
4419 	struct lsm_network_audit net = {0,};
4420 	char *addrp;
4421 	u8 secmark_active;
4422 	u8 peerlbl_active;
4423 
4424 	if (family != PF_INET && family != PF_INET6)
4425 		return 0;
4426 
4427 	/* Handle mapped IPv4 packets arriving via IPv6 sockets */
4428 	if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
4429 		family = PF_INET;
4430 
4431 	/* If any sort of compatibility mode is enabled then handoff processing
4432 	 * to the selinux_sock_rcv_skb_compat() function to deal with the
4433 	 * special handling.  We do this in an attempt to keep this function
4434 	 * as fast and as clean as possible. */
4435 	if (!selinux_policycap_netpeer)
4436 		return selinux_sock_rcv_skb_compat(sk, skb, family);
4437 
4438 	secmark_active = selinux_secmark_enabled();
4439 	peerlbl_active = selinux_peerlbl_enabled();
4440 	if (!secmark_active && !peerlbl_active)
4441 		return 0;
4442 
4443 	ad.type = LSM_AUDIT_DATA_NET;
4444 	ad.u.net = &net;
4445 	ad.u.net->netif = skb->skb_iif;
4446 	ad.u.net->family = family;
4447 	err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
4448 	if (err)
4449 		return err;
4450 
4451 	if (peerlbl_active) {
4452 		u32 peer_sid;
4453 
4454 		err = selinux_skb_peerlbl_sid(skb, family, &peer_sid);
4455 		if (err)
4456 			return err;
4457 		err = selinux_inet_sys_rcv_skb(sock_net(sk), skb->skb_iif,
4458 					       addrp, family, peer_sid, &ad);
4459 		if (err) {
4460 			selinux_netlbl_err(skb, err, 0);
4461 			return err;
4462 		}
4463 		err = avc_has_perm(sk_sid, peer_sid, SECCLASS_PEER,
4464 				   PEER__RECV, &ad);
4465 		if (err) {
4466 			selinux_netlbl_err(skb, err, 0);
4467 			return err;
4468 		}
4469 	}
4470 
4471 	if (secmark_active) {
4472 		err = avc_has_perm(sk_sid, skb->secmark, SECCLASS_PACKET,
4473 				   PACKET__RECV, &ad);
4474 		if (err)
4475 			return err;
4476 	}
4477 
4478 	return err;
4479 }
4480 
selinux_socket_getpeersec_stream(struct socket * sock,char __user * optval,int __user * optlen,unsigned len)4481 static int selinux_socket_getpeersec_stream(struct socket *sock, char __user *optval,
4482 					    int __user *optlen, unsigned len)
4483 {
4484 	int err = 0;
4485 	char *scontext;
4486 	u32 scontext_len;
4487 	struct sk_security_struct *sksec = sock->sk->sk_security;
4488 	u32 peer_sid = SECSID_NULL;
4489 
4490 	if (sksec->sclass == SECCLASS_UNIX_STREAM_SOCKET ||
4491 	    sksec->sclass == SECCLASS_TCP_SOCKET)
4492 		peer_sid = sksec->peer_sid;
4493 	if (peer_sid == SECSID_NULL)
4494 		return -ENOPROTOOPT;
4495 
4496 	err = security_sid_to_context(peer_sid, &scontext, &scontext_len);
4497 	if (err)
4498 		return err;
4499 
4500 	if (scontext_len > len) {
4501 		err = -ERANGE;
4502 		goto out_len;
4503 	}
4504 
4505 	if (copy_to_user(optval, scontext, scontext_len))
4506 		err = -EFAULT;
4507 
4508 out_len:
4509 	if (put_user(scontext_len, optlen))
4510 		err = -EFAULT;
4511 	kfree(scontext);
4512 	return err;
4513 }
4514 
selinux_socket_getpeersec_dgram(struct socket * sock,struct sk_buff * skb,u32 * secid)4515 static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
4516 {
4517 	u32 peer_secid = SECSID_NULL;
4518 	u16 family;
4519 
4520 	if (skb && skb->protocol == htons(ETH_P_IP))
4521 		family = PF_INET;
4522 	else if (skb && skb->protocol == htons(ETH_P_IPV6))
4523 		family = PF_INET6;
4524 	else if (sock)
4525 		family = sock->sk->sk_family;
4526 	else
4527 		goto out;
4528 
4529 	if (sock && family == PF_UNIX)
4530 		selinux_inode_getsecid(SOCK_INODE(sock), &peer_secid);
4531 	else if (skb)
4532 		selinux_skb_peerlbl_sid(skb, family, &peer_secid);
4533 
4534 out:
4535 	*secid = peer_secid;
4536 	if (peer_secid == SECSID_NULL)
4537 		return -EINVAL;
4538 	return 0;
4539 }
4540 
selinux_sk_alloc_security(struct sock * sk,int family,gfp_t priority)4541 static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority)
4542 {
4543 	struct sk_security_struct *sksec;
4544 
4545 	sksec = kzalloc(sizeof(*sksec), priority);
4546 	if (!sksec)
4547 		return -ENOMEM;
4548 
4549 	sksec->peer_sid = SECINITSID_UNLABELED;
4550 	sksec->sid = SECINITSID_UNLABELED;
4551 	selinux_netlbl_sk_security_reset(sksec);
4552 	sk->sk_security = sksec;
4553 
4554 	return 0;
4555 }
4556 
selinux_sk_free_security(struct sock * sk)4557 static void selinux_sk_free_security(struct sock *sk)
4558 {
4559 	struct sk_security_struct *sksec = sk->sk_security;
4560 
4561 	sk->sk_security = NULL;
4562 	selinux_netlbl_sk_security_free(sksec);
4563 	kfree(sksec);
4564 }
4565 
selinux_sk_clone_security(const struct sock * sk,struct sock * newsk)4566 static void selinux_sk_clone_security(const struct sock *sk, struct sock *newsk)
4567 {
4568 	struct sk_security_struct *sksec = sk->sk_security;
4569 	struct sk_security_struct *newsksec = newsk->sk_security;
4570 
4571 	newsksec->sid = sksec->sid;
4572 	newsksec->peer_sid = sksec->peer_sid;
4573 	newsksec->sclass = sksec->sclass;
4574 
4575 	selinux_netlbl_sk_security_reset(newsksec);
4576 }
4577 
selinux_sk_getsecid(struct sock * sk,u32 * secid)4578 static void selinux_sk_getsecid(struct sock *sk, u32 *secid)
4579 {
4580 	if (!sk)
4581 		*secid = SECINITSID_ANY_SOCKET;
4582 	else {
4583 		struct sk_security_struct *sksec = sk->sk_security;
4584 
4585 		*secid = sksec->sid;
4586 	}
4587 }
4588 
selinux_sock_graft(struct sock * sk,struct socket * parent)4589 static void selinux_sock_graft(struct sock *sk, struct socket *parent)
4590 {
4591 	struct inode_security_struct *isec = SOCK_INODE(parent)->i_security;
4592 	struct sk_security_struct *sksec = sk->sk_security;
4593 
4594 	if (sk->sk_family == PF_INET || sk->sk_family == PF_INET6 ||
4595 	    sk->sk_family == PF_UNIX)
4596 		isec->sid = sksec->sid;
4597 	sksec->sclass = isec->sclass;
4598 }
4599 
selinux_inet_conn_request(struct sock * sk,struct sk_buff * skb,struct request_sock * req)4600 static int selinux_inet_conn_request(struct sock *sk, struct sk_buff *skb,
4601 				     struct request_sock *req)
4602 {
4603 	struct sk_security_struct *sksec = sk->sk_security;
4604 	int err;
4605 	u16 family = req->rsk_ops->family;
4606 	u32 connsid;
4607 	u32 peersid;
4608 
4609 	err = selinux_skb_peerlbl_sid(skb, family, &peersid);
4610 	if (err)
4611 		return err;
4612 	err = selinux_conn_sid(sksec->sid, peersid, &connsid);
4613 	if (err)
4614 		return err;
4615 	req->secid = connsid;
4616 	req->peer_secid = peersid;
4617 
4618 	return selinux_netlbl_inet_conn_request(req, family);
4619 }
4620 
selinux_inet_csk_clone(struct sock * newsk,const struct request_sock * req)4621 static void selinux_inet_csk_clone(struct sock *newsk,
4622 				   const struct request_sock *req)
4623 {
4624 	struct sk_security_struct *newsksec = newsk->sk_security;
4625 
4626 	newsksec->sid = req->secid;
4627 	newsksec->peer_sid = req->peer_secid;
4628 	/* NOTE: Ideally, we should also get the isec->sid for the
4629 	   new socket in sync, but we don't have the isec available yet.
4630 	   So we will wait until sock_graft to do it, by which
4631 	   time it will have been created and available. */
4632 
4633 	/* We don't need to take any sort of lock here as we are the only
4634 	 * thread with access to newsksec */
4635 	selinux_netlbl_inet_csk_clone(newsk, req->rsk_ops->family);
4636 }
4637 
selinux_inet_conn_established(struct sock * sk,struct sk_buff * skb)4638 static void selinux_inet_conn_established(struct sock *sk, struct sk_buff *skb)
4639 {
4640 	u16 family = sk->sk_family;
4641 	struct sk_security_struct *sksec = sk->sk_security;
4642 
4643 	/* handle mapped IPv4 packets arriving via IPv6 sockets */
4644 	if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
4645 		family = PF_INET;
4646 
4647 	selinux_skb_peerlbl_sid(skb, family, &sksec->peer_sid);
4648 }
4649 
selinux_secmark_relabel_packet(u32 sid)4650 static int selinux_secmark_relabel_packet(u32 sid)
4651 {
4652 	const struct task_security_struct *__tsec;
4653 	u32 tsid;
4654 
4655 	__tsec = current_security();
4656 	tsid = __tsec->sid;
4657 
4658 	return avc_has_perm(tsid, sid, SECCLASS_PACKET, PACKET__RELABELTO, NULL);
4659 }
4660 
selinux_secmark_refcount_inc(void)4661 static void selinux_secmark_refcount_inc(void)
4662 {
4663 	atomic_inc(&selinux_secmark_refcount);
4664 }
4665 
selinux_secmark_refcount_dec(void)4666 static void selinux_secmark_refcount_dec(void)
4667 {
4668 	atomic_dec(&selinux_secmark_refcount);
4669 }
4670 
selinux_req_classify_flow(const struct request_sock * req,struct flowi * fl)4671 static void selinux_req_classify_flow(const struct request_sock *req,
4672 				      struct flowi *fl)
4673 {
4674 	fl->flowi_secid = req->secid;
4675 }
4676 
selinux_tun_dev_alloc_security(void ** security)4677 static int selinux_tun_dev_alloc_security(void **security)
4678 {
4679 	struct tun_security_struct *tunsec;
4680 
4681 	tunsec = kzalloc(sizeof(*tunsec), GFP_KERNEL);
4682 	if (!tunsec)
4683 		return -ENOMEM;
4684 	tunsec->sid = current_sid();
4685 
4686 	*security = tunsec;
4687 	return 0;
4688 }
4689 
selinux_tun_dev_free_security(void * security)4690 static void selinux_tun_dev_free_security(void *security)
4691 {
4692 	kfree(security);
4693 }
4694 
selinux_tun_dev_create(void)4695 static int selinux_tun_dev_create(void)
4696 {
4697 	u32 sid = current_sid();
4698 
4699 	/* we aren't taking into account the "sockcreate" SID since the socket
4700 	 * that is being created here is not a socket in the traditional sense,
4701 	 * instead it is a private sock, accessible only to the kernel, and
4702 	 * representing a wide range of network traffic spanning multiple
4703 	 * connections unlike traditional sockets - check the TUN driver to
4704 	 * get a better understanding of why this socket is special */
4705 
4706 	return avc_has_perm(sid, sid, SECCLASS_TUN_SOCKET, TUN_SOCKET__CREATE,
4707 			    NULL);
4708 }
4709 
selinux_tun_dev_attach_queue(void * security)4710 static int selinux_tun_dev_attach_queue(void *security)
4711 {
4712 	struct tun_security_struct *tunsec = security;
4713 
4714 	return avc_has_perm(current_sid(), tunsec->sid, SECCLASS_TUN_SOCKET,
4715 			    TUN_SOCKET__ATTACH_QUEUE, NULL);
4716 }
4717 
selinux_tun_dev_attach(struct sock * sk,void * security)4718 static int selinux_tun_dev_attach(struct sock *sk, void *security)
4719 {
4720 	struct tun_security_struct *tunsec = security;
4721 	struct sk_security_struct *sksec = sk->sk_security;
4722 
4723 	/* we don't currently perform any NetLabel based labeling here and it
4724 	 * isn't clear that we would want to do so anyway; while we could apply
4725 	 * labeling without the support of the TUN user the resulting labeled
4726 	 * traffic from the other end of the connection would almost certainly
4727 	 * cause confusion to the TUN user that had no idea network labeling
4728 	 * protocols were being used */
4729 
4730 	sksec->sid = tunsec->sid;
4731 	sksec->sclass = SECCLASS_TUN_SOCKET;
4732 
4733 	return 0;
4734 }
4735 
selinux_tun_dev_open(void * security)4736 static int selinux_tun_dev_open(void *security)
4737 {
4738 	struct tun_security_struct *tunsec = security;
4739 	u32 sid = current_sid();
4740 	int err;
4741 
4742 	err = avc_has_perm(sid, tunsec->sid, SECCLASS_TUN_SOCKET,
4743 			   TUN_SOCKET__RELABELFROM, NULL);
4744 	if (err)
4745 		return err;
4746 	err = avc_has_perm(sid, sid, SECCLASS_TUN_SOCKET,
4747 			   TUN_SOCKET__RELABELTO, NULL);
4748 	if (err)
4749 		return err;
4750 	tunsec->sid = sid;
4751 
4752 	return 0;
4753 }
4754 
selinux_nlmsg_perm(struct sock * sk,struct sk_buff * skb)4755 static int selinux_nlmsg_perm(struct sock *sk, struct sk_buff *skb)
4756 {
4757 	int err = 0;
4758 	u32 perm;
4759 	struct nlmsghdr *nlh;
4760 	struct sk_security_struct *sksec = sk->sk_security;
4761 
4762 	if (skb->len < NLMSG_HDRLEN) {
4763 		err = -EINVAL;
4764 		goto out;
4765 	}
4766 	nlh = nlmsg_hdr(skb);
4767 
4768 	err = selinux_nlmsg_lookup(sksec->sclass, nlh->nlmsg_type, &perm);
4769 	if (err) {
4770 		if (err == -EINVAL) {
4771 			printk(KERN_WARNING
4772 			       "SELinux: unrecognized netlink message:"
4773 			       " protocol=%hu nlmsg_type=%hu sclass=%hu\n",
4774 			       sk->sk_protocol, nlh->nlmsg_type, sksec->sclass);
4775 			if (!selinux_enforcing || security_get_allow_unknown())
4776 				err = 0;
4777 		}
4778 
4779 		/* Ignore */
4780 		if (err == -ENOENT)
4781 			err = 0;
4782 		goto out;
4783 	}
4784 
4785 	err = sock_has_perm(current, sk, perm);
4786 out:
4787 	return err;
4788 }
4789 
4790 #ifdef CONFIG_NETFILTER
4791 
selinux_ip_forward(struct sk_buff * skb,const struct net_device * indev,u16 family)4792 static unsigned int selinux_ip_forward(struct sk_buff *skb,
4793 				       const struct net_device *indev,
4794 				       u16 family)
4795 {
4796 	int err;
4797 	char *addrp;
4798 	u32 peer_sid;
4799 	struct common_audit_data ad;
4800 	struct lsm_network_audit net = {0,};
4801 	u8 secmark_active;
4802 	u8 netlbl_active;
4803 	u8 peerlbl_active;
4804 
4805 	if (!selinux_policycap_netpeer)
4806 		return NF_ACCEPT;
4807 
4808 	secmark_active = selinux_secmark_enabled();
4809 	netlbl_active = netlbl_enabled();
4810 	peerlbl_active = selinux_peerlbl_enabled();
4811 	if (!secmark_active && !peerlbl_active)
4812 		return NF_ACCEPT;
4813 
4814 	if (selinux_skb_peerlbl_sid(skb, family, &peer_sid) != 0)
4815 		return NF_DROP;
4816 
4817 	ad.type = LSM_AUDIT_DATA_NET;
4818 	ad.u.net = &net;
4819 	ad.u.net->netif = indev->ifindex;
4820 	ad.u.net->family = family;
4821 	if (selinux_parse_skb(skb, &ad, &addrp, 1, NULL) != 0)
4822 		return NF_DROP;
4823 
4824 	if (peerlbl_active) {
4825 		err = selinux_inet_sys_rcv_skb(dev_net(indev), indev->ifindex,
4826 					       addrp, family, peer_sid, &ad);
4827 		if (err) {
4828 			selinux_netlbl_err(skb, err, 1);
4829 			return NF_DROP;
4830 		}
4831 	}
4832 
4833 	if (secmark_active)
4834 		if (avc_has_perm(peer_sid, skb->secmark,
4835 				 SECCLASS_PACKET, PACKET__FORWARD_IN, &ad))
4836 			return NF_DROP;
4837 
4838 	if (netlbl_active)
4839 		/* we do this in the FORWARD path and not the POST_ROUTING
4840 		 * path because we want to make sure we apply the necessary
4841 		 * labeling before IPsec is applied so we can leverage AH
4842 		 * protection */
4843 		if (selinux_netlbl_skbuff_setsid(skb, family, peer_sid) != 0)
4844 			return NF_DROP;
4845 
4846 	return NF_ACCEPT;
4847 }
4848 
selinux_ipv4_forward(const struct nf_hook_ops * ops,struct sk_buff * skb,const struct nf_hook_state * state)4849 static unsigned int selinux_ipv4_forward(const struct nf_hook_ops *ops,
4850 					 struct sk_buff *skb,
4851 					 const struct nf_hook_state *state)
4852 {
4853 	return selinux_ip_forward(skb, state->in, PF_INET);
4854 }
4855 
4856 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
selinux_ipv6_forward(const struct nf_hook_ops * ops,struct sk_buff * skb,const struct nf_hook_state * state)4857 static unsigned int selinux_ipv6_forward(const struct nf_hook_ops *ops,
4858 					 struct sk_buff *skb,
4859 					 const struct nf_hook_state *state)
4860 {
4861 	return selinux_ip_forward(skb, state->in, PF_INET6);
4862 }
4863 #endif	/* IPV6 */
4864 
selinux_ip_output(struct sk_buff * skb,u16 family)4865 static unsigned int selinux_ip_output(struct sk_buff *skb,
4866 				      u16 family)
4867 {
4868 	struct sock *sk;
4869 	u32 sid;
4870 
4871 	if (!netlbl_enabled())
4872 		return NF_ACCEPT;
4873 
4874 	/* we do this in the LOCAL_OUT path and not the POST_ROUTING path
4875 	 * because we want to make sure we apply the necessary labeling
4876 	 * before IPsec is applied so we can leverage AH protection */
4877 	sk = skb->sk;
4878 	if (sk) {
4879 		struct sk_security_struct *sksec;
4880 
4881 		if (sk->sk_state == TCP_LISTEN)
4882 			/* if the socket is the listening state then this
4883 			 * packet is a SYN-ACK packet which means it needs to
4884 			 * be labeled based on the connection/request_sock and
4885 			 * not the parent socket.  unfortunately, we can't
4886 			 * lookup the request_sock yet as it isn't queued on
4887 			 * the parent socket until after the SYN-ACK is sent.
4888 			 * the "solution" is to simply pass the packet as-is
4889 			 * as any IP option based labeling should be copied
4890 			 * from the initial connection request (in the IP
4891 			 * layer).  it is far from ideal, but until we get a
4892 			 * security label in the packet itself this is the
4893 			 * best we can do. */
4894 			return NF_ACCEPT;
4895 
4896 		/* standard practice, label using the parent socket */
4897 		sksec = sk->sk_security;
4898 		sid = sksec->sid;
4899 	} else
4900 		sid = SECINITSID_KERNEL;
4901 	if (selinux_netlbl_skbuff_setsid(skb, family, sid) != 0)
4902 		return NF_DROP;
4903 
4904 	return NF_ACCEPT;
4905 }
4906 
selinux_ipv4_output(const struct nf_hook_ops * ops,struct sk_buff * skb,const struct nf_hook_state * state)4907 static unsigned int selinux_ipv4_output(const struct nf_hook_ops *ops,
4908 					struct sk_buff *skb,
4909 					const struct nf_hook_state *state)
4910 {
4911 	return selinux_ip_output(skb, PF_INET);
4912 }
4913 
selinux_ip_postroute_compat(struct sk_buff * skb,int ifindex,u16 family)4914 static unsigned int selinux_ip_postroute_compat(struct sk_buff *skb,
4915 						int ifindex,
4916 						u16 family)
4917 {
4918 	struct sock *sk = skb->sk;
4919 	struct sk_security_struct *sksec;
4920 	struct common_audit_data ad;
4921 	struct lsm_network_audit net = {0,};
4922 	char *addrp;
4923 	u8 proto;
4924 
4925 	if (sk == NULL)
4926 		return NF_ACCEPT;
4927 	sksec = sk->sk_security;
4928 
4929 	ad.type = LSM_AUDIT_DATA_NET;
4930 	ad.u.net = &net;
4931 	ad.u.net->netif = ifindex;
4932 	ad.u.net->family = family;
4933 	if (selinux_parse_skb(skb, &ad, &addrp, 0, &proto))
4934 		return NF_DROP;
4935 
4936 	if (selinux_secmark_enabled())
4937 		if (avc_has_perm(sksec->sid, skb->secmark,
4938 				 SECCLASS_PACKET, PACKET__SEND, &ad))
4939 			return NF_DROP_ERR(-ECONNREFUSED);
4940 
4941 	if (selinux_xfrm_postroute_last(sksec->sid, skb, &ad, proto))
4942 		return NF_DROP_ERR(-ECONNREFUSED);
4943 
4944 	return NF_ACCEPT;
4945 }
4946 
selinux_ip_postroute(struct sk_buff * skb,const struct net_device * outdev,u16 family)4947 static unsigned int selinux_ip_postroute(struct sk_buff *skb,
4948 					 const struct net_device *outdev,
4949 					 u16 family)
4950 {
4951 	u32 secmark_perm;
4952 	u32 peer_sid;
4953 	int ifindex = outdev->ifindex;
4954 	struct sock *sk;
4955 	struct common_audit_data ad;
4956 	struct lsm_network_audit net = {0,};
4957 	char *addrp;
4958 	u8 secmark_active;
4959 	u8 peerlbl_active;
4960 
4961 	/* If any sort of compatibility mode is enabled then handoff processing
4962 	 * to the selinux_ip_postroute_compat() function to deal with the
4963 	 * special handling.  We do this in an attempt to keep this function
4964 	 * as fast and as clean as possible. */
4965 	if (!selinux_policycap_netpeer)
4966 		return selinux_ip_postroute_compat(skb, ifindex, family);
4967 
4968 	secmark_active = selinux_secmark_enabled();
4969 	peerlbl_active = selinux_peerlbl_enabled();
4970 	if (!secmark_active && !peerlbl_active)
4971 		return NF_ACCEPT;
4972 
4973 	sk = skb->sk;
4974 
4975 #ifdef CONFIG_XFRM
4976 	/* If skb->dst->xfrm is non-NULL then the packet is undergoing an IPsec
4977 	 * packet transformation so allow the packet to pass without any checks
4978 	 * since we'll have another chance to perform access control checks
4979 	 * when the packet is on it's final way out.
4980 	 * NOTE: there appear to be some IPv6 multicast cases where skb->dst
4981 	 *       is NULL, in this case go ahead and apply access control.
4982 	 * NOTE: if this is a local socket (skb->sk != NULL) that is in the
4983 	 *       TCP listening state we cannot wait until the XFRM processing
4984 	 *       is done as we will miss out on the SA label if we do;
4985 	 *       unfortunately, this means more work, but it is only once per
4986 	 *       connection. */
4987 	if (skb_dst(skb) != NULL && skb_dst(skb)->xfrm != NULL &&
4988 	    !(sk != NULL && sk->sk_state == TCP_LISTEN))
4989 		return NF_ACCEPT;
4990 #endif
4991 
4992 	if (sk == NULL) {
4993 		/* Without an associated socket the packet is either coming
4994 		 * from the kernel or it is being forwarded; check the packet
4995 		 * to determine which and if the packet is being forwarded
4996 		 * query the packet directly to determine the security label. */
4997 		if (skb->skb_iif) {
4998 			secmark_perm = PACKET__FORWARD_OUT;
4999 			if (selinux_skb_peerlbl_sid(skb, family, &peer_sid))
5000 				return NF_DROP;
5001 		} else {
5002 			secmark_perm = PACKET__SEND;
5003 			peer_sid = SECINITSID_KERNEL;
5004 		}
5005 	} else if (sk->sk_state == TCP_LISTEN) {
5006 		/* Locally generated packet but the associated socket is in the
5007 		 * listening state which means this is a SYN-ACK packet.  In
5008 		 * this particular case the correct security label is assigned
5009 		 * to the connection/request_sock but unfortunately we can't
5010 		 * query the request_sock as it isn't queued on the parent
5011 		 * socket until after the SYN-ACK packet is sent; the only
5012 		 * viable choice is to regenerate the label like we do in
5013 		 * selinux_inet_conn_request().  See also selinux_ip_output()
5014 		 * for similar problems. */
5015 		u32 skb_sid;
5016 		struct sk_security_struct *sksec = sk->sk_security;
5017 		if (selinux_skb_peerlbl_sid(skb, family, &skb_sid))
5018 			return NF_DROP;
5019 		/* At this point, if the returned skb peerlbl is SECSID_NULL
5020 		 * and the packet has been through at least one XFRM
5021 		 * transformation then we must be dealing with the "final"
5022 		 * form of labeled IPsec packet; since we've already applied
5023 		 * all of our access controls on this packet we can safely
5024 		 * pass the packet. */
5025 		if (skb_sid == SECSID_NULL) {
5026 			switch (family) {
5027 			case PF_INET:
5028 				if (IPCB(skb)->flags & IPSKB_XFRM_TRANSFORMED)
5029 					return NF_ACCEPT;
5030 				break;
5031 			case PF_INET6:
5032 				if (IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED)
5033 					return NF_ACCEPT;
5034 				break;
5035 			default:
5036 				return NF_DROP_ERR(-ECONNREFUSED);
5037 			}
5038 		}
5039 		if (selinux_conn_sid(sksec->sid, skb_sid, &peer_sid))
5040 			return NF_DROP;
5041 		secmark_perm = PACKET__SEND;
5042 	} else {
5043 		/* Locally generated packet, fetch the security label from the
5044 		 * associated socket. */
5045 		struct sk_security_struct *sksec = sk->sk_security;
5046 		peer_sid = sksec->sid;
5047 		secmark_perm = PACKET__SEND;
5048 	}
5049 
5050 	ad.type = LSM_AUDIT_DATA_NET;
5051 	ad.u.net = &net;
5052 	ad.u.net->netif = ifindex;
5053 	ad.u.net->family = family;
5054 	if (selinux_parse_skb(skb, &ad, &addrp, 0, NULL))
5055 		return NF_DROP;
5056 
5057 	if (secmark_active)
5058 		if (avc_has_perm(peer_sid, skb->secmark,
5059 				 SECCLASS_PACKET, secmark_perm, &ad))
5060 			return NF_DROP_ERR(-ECONNREFUSED);
5061 
5062 	if (peerlbl_active) {
5063 		u32 if_sid;
5064 		u32 node_sid;
5065 
5066 		if (sel_netif_sid(dev_net(outdev), ifindex, &if_sid))
5067 			return NF_DROP;
5068 		if (avc_has_perm(peer_sid, if_sid,
5069 				 SECCLASS_NETIF, NETIF__EGRESS, &ad))
5070 			return NF_DROP_ERR(-ECONNREFUSED);
5071 
5072 		if (sel_netnode_sid(addrp, family, &node_sid))
5073 			return NF_DROP;
5074 		if (avc_has_perm(peer_sid, node_sid,
5075 				 SECCLASS_NODE, NODE__SENDTO, &ad))
5076 			return NF_DROP_ERR(-ECONNREFUSED);
5077 	}
5078 
5079 	return NF_ACCEPT;
5080 }
5081 
selinux_ipv4_postroute(const struct nf_hook_ops * ops,struct sk_buff * skb,const struct nf_hook_state * state)5082 static unsigned int selinux_ipv4_postroute(const struct nf_hook_ops *ops,
5083 					   struct sk_buff *skb,
5084 					   const struct nf_hook_state *state)
5085 {
5086 	return selinux_ip_postroute(skb, state->out, PF_INET);
5087 }
5088 
5089 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
selinux_ipv6_postroute(const struct nf_hook_ops * ops,struct sk_buff * skb,const struct nf_hook_state * state)5090 static unsigned int selinux_ipv6_postroute(const struct nf_hook_ops *ops,
5091 					   struct sk_buff *skb,
5092 					   const struct nf_hook_state *state)
5093 {
5094 	return selinux_ip_postroute(skb, state->out, PF_INET6);
5095 }
5096 #endif	/* IPV6 */
5097 
5098 #endif	/* CONFIG_NETFILTER */
5099 
selinux_netlink_send(struct sock * sk,struct sk_buff * skb)5100 static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb)
5101 {
5102 	int err;
5103 
5104 	err = cap_netlink_send(sk, skb);
5105 	if (err)
5106 		return err;
5107 
5108 	return selinux_nlmsg_perm(sk, skb);
5109 }
5110 
ipc_alloc_security(struct task_struct * task,struct kern_ipc_perm * perm,u16 sclass)5111 static int ipc_alloc_security(struct task_struct *task,
5112 			      struct kern_ipc_perm *perm,
5113 			      u16 sclass)
5114 {
5115 	struct ipc_security_struct *isec;
5116 	u32 sid;
5117 
5118 	isec = kzalloc(sizeof(struct ipc_security_struct), GFP_KERNEL);
5119 	if (!isec)
5120 		return -ENOMEM;
5121 
5122 	sid = task_sid(task);
5123 	isec->sclass = sclass;
5124 	isec->sid = sid;
5125 	perm->security = isec;
5126 
5127 	return 0;
5128 }
5129 
ipc_free_security(struct kern_ipc_perm * perm)5130 static void ipc_free_security(struct kern_ipc_perm *perm)
5131 {
5132 	struct ipc_security_struct *isec = perm->security;
5133 	perm->security = NULL;
5134 	kfree(isec);
5135 }
5136 
msg_msg_alloc_security(struct msg_msg * msg)5137 static int msg_msg_alloc_security(struct msg_msg *msg)
5138 {
5139 	struct msg_security_struct *msec;
5140 
5141 	msec = kzalloc(sizeof(struct msg_security_struct), GFP_KERNEL);
5142 	if (!msec)
5143 		return -ENOMEM;
5144 
5145 	msec->sid = SECINITSID_UNLABELED;
5146 	msg->security = msec;
5147 
5148 	return 0;
5149 }
5150 
msg_msg_free_security(struct msg_msg * msg)5151 static void msg_msg_free_security(struct msg_msg *msg)
5152 {
5153 	struct msg_security_struct *msec = msg->security;
5154 
5155 	msg->security = NULL;
5156 	kfree(msec);
5157 }
5158 
ipc_has_perm(struct kern_ipc_perm * ipc_perms,u32 perms)5159 static int ipc_has_perm(struct kern_ipc_perm *ipc_perms,
5160 			u32 perms)
5161 {
5162 	struct ipc_security_struct *isec;
5163 	struct common_audit_data ad;
5164 	u32 sid = current_sid();
5165 
5166 	isec = ipc_perms->security;
5167 
5168 	ad.type = LSM_AUDIT_DATA_IPC;
5169 	ad.u.ipc_id = ipc_perms->key;
5170 
5171 	return avc_has_perm(sid, isec->sid, isec->sclass, perms, &ad);
5172 }
5173 
selinux_msg_msg_alloc_security(struct msg_msg * msg)5174 static int selinux_msg_msg_alloc_security(struct msg_msg *msg)
5175 {
5176 	return msg_msg_alloc_security(msg);
5177 }
5178 
selinux_msg_msg_free_security(struct msg_msg * msg)5179 static void selinux_msg_msg_free_security(struct msg_msg *msg)
5180 {
5181 	msg_msg_free_security(msg);
5182 }
5183 
5184 /* message queue security operations */
selinux_msg_queue_alloc_security(struct msg_queue * msq)5185 static int selinux_msg_queue_alloc_security(struct msg_queue *msq)
5186 {
5187 	struct ipc_security_struct *isec;
5188 	struct common_audit_data ad;
5189 	u32 sid = current_sid();
5190 	int rc;
5191 
5192 	rc = ipc_alloc_security(current, &msq->q_perm, SECCLASS_MSGQ);
5193 	if (rc)
5194 		return rc;
5195 
5196 	isec = msq->q_perm.security;
5197 
5198 	ad.type = LSM_AUDIT_DATA_IPC;
5199 	ad.u.ipc_id = msq->q_perm.key;
5200 
5201 	rc = avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
5202 			  MSGQ__CREATE, &ad);
5203 	if (rc) {
5204 		ipc_free_security(&msq->q_perm);
5205 		return rc;
5206 	}
5207 	return 0;
5208 }
5209 
selinux_msg_queue_free_security(struct msg_queue * msq)5210 static void selinux_msg_queue_free_security(struct msg_queue *msq)
5211 {
5212 	ipc_free_security(&msq->q_perm);
5213 }
5214 
selinux_msg_queue_associate(struct msg_queue * msq,int msqflg)5215 static int selinux_msg_queue_associate(struct msg_queue *msq, int msqflg)
5216 {
5217 	struct ipc_security_struct *isec;
5218 	struct common_audit_data ad;
5219 	u32 sid = current_sid();
5220 
5221 	isec = msq->q_perm.security;
5222 
5223 	ad.type = LSM_AUDIT_DATA_IPC;
5224 	ad.u.ipc_id = msq->q_perm.key;
5225 
5226 	return avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
5227 			    MSGQ__ASSOCIATE, &ad);
5228 }
5229 
selinux_msg_queue_msgctl(struct msg_queue * msq,int cmd)5230 static int selinux_msg_queue_msgctl(struct msg_queue *msq, int cmd)
5231 {
5232 	int err;
5233 	int perms;
5234 
5235 	switch (cmd) {
5236 	case IPC_INFO:
5237 	case MSG_INFO:
5238 		/* No specific object, just general system-wide information. */
5239 		return task_has_system(current, SYSTEM__IPC_INFO);
5240 	case IPC_STAT:
5241 	case MSG_STAT:
5242 		perms = MSGQ__GETATTR | MSGQ__ASSOCIATE;
5243 		break;
5244 	case IPC_SET:
5245 		perms = MSGQ__SETATTR;
5246 		break;
5247 	case IPC_RMID:
5248 		perms = MSGQ__DESTROY;
5249 		break;
5250 	default:
5251 		return 0;
5252 	}
5253 
5254 	err = ipc_has_perm(&msq->q_perm, perms);
5255 	return err;
5256 }
5257 
selinux_msg_queue_msgsnd(struct msg_queue * msq,struct msg_msg * msg,int msqflg)5258 static int selinux_msg_queue_msgsnd(struct msg_queue *msq, struct msg_msg *msg, int msqflg)
5259 {
5260 	struct ipc_security_struct *isec;
5261 	struct msg_security_struct *msec;
5262 	struct common_audit_data ad;
5263 	u32 sid = current_sid();
5264 	int rc;
5265 
5266 	isec = msq->q_perm.security;
5267 	msec = msg->security;
5268 
5269 	/*
5270 	 * First time through, need to assign label to the message
5271 	 */
5272 	if (msec->sid == SECINITSID_UNLABELED) {
5273 		/*
5274 		 * Compute new sid based on current process and
5275 		 * message queue this message will be stored in
5276 		 */
5277 		rc = security_transition_sid(sid, isec->sid, SECCLASS_MSG,
5278 					     NULL, &msec->sid);
5279 		if (rc)
5280 			return rc;
5281 	}
5282 
5283 	ad.type = LSM_AUDIT_DATA_IPC;
5284 	ad.u.ipc_id = msq->q_perm.key;
5285 
5286 	/* Can this process write to the queue? */
5287 	rc = avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
5288 			  MSGQ__WRITE, &ad);
5289 	if (!rc)
5290 		/* Can this process send the message */
5291 		rc = avc_has_perm(sid, msec->sid, SECCLASS_MSG,
5292 				  MSG__SEND, &ad);
5293 	if (!rc)
5294 		/* Can the message be put in the queue? */
5295 		rc = avc_has_perm(msec->sid, isec->sid, SECCLASS_MSGQ,
5296 				  MSGQ__ENQUEUE, &ad);
5297 
5298 	return rc;
5299 }
5300 
selinux_msg_queue_msgrcv(struct msg_queue * msq,struct msg_msg * msg,struct task_struct * target,long type,int mode)5301 static int selinux_msg_queue_msgrcv(struct msg_queue *msq, struct msg_msg *msg,
5302 				    struct task_struct *target,
5303 				    long type, int mode)
5304 {
5305 	struct ipc_security_struct *isec;
5306 	struct msg_security_struct *msec;
5307 	struct common_audit_data ad;
5308 	u32 sid = task_sid(target);
5309 	int rc;
5310 
5311 	isec = msq->q_perm.security;
5312 	msec = msg->security;
5313 
5314 	ad.type = LSM_AUDIT_DATA_IPC;
5315 	ad.u.ipc_id = msq->q_perm.key;
5316 
5317 	rc = avc_has_perm(sid, isec->sid,
5318 			  SECCLASS_MSGQ, MSGQ__READ, &ad);
5319 	if (!rc)
5320 		rc = avc_has_perm(sid, msec->sid,
5321 				  SECCLASS_MSG, MSG__RECEIVE, &ad);
5322 	return rc;
5323 }
5324 
5325 /* Shared Memory security operations */
selinux_shm_alloc_security(struct shmid_kernel * shp)5326 static int selinux_shm_alloc_security(struct shmid_kernel *shp)
5327 {
5328 	struct ipc_security_struct *isec;
5329 	struct common_audit_data ad;
5330 	u32 sid = current_sid();
5331 	int rc;
5332 
5333 	rc = ipc_alloc_security(current, &shp->shm_perm, SECCLASS_SHM);
5334 	if (rc)
5335 		return rc;
5336 
5337 	isec = shp->shm_perm.security;
5338 
5339 	ad.type = LSM_AUDIT_DATA_IPC;
5340 	ad.u.ipc_id = shp->shm_perm.key;
5341 
5342 	rc = avc_has_perm(sid, isec->sid, SECCLASS_SHM,
5343 			  SHM__CREATE, &ad);
5344 	if (rc) {
5345 		ipc_free_security(&shp->shm_perm);
5346 		return rc;
5347 	}
5348 	return 0;
5349 }
5350 
selinux_shm_free_security(struct shmid_kernel * shp)5351 static void selinux_shm_free_security(struct shmid_kernel *shp)
5352 {
5353 	ipc_free_security(&shp->shm_perm);
5354 }
5355 
selinux_shm_associate(struct shmid_kernel * shp,int shmflg)5356 static int selinux_shm_associate(struct shmid_kernel *shp, int shmflg)
5357 {
5358 	struct ipc_security_struct *isec;
5359 	struct common_audit_data ad;
5360 	u32 sid = current_sid();
5361 
5362 	isec = shp->shm_perm.security;
5363 
5364 	ad.type = LSM_AUDIT_DATA_IPC;
5365 	ad.u.ipc_id = shp->shm_perm.key;
5366 
5367 	return avc_has_perm(sid, isec->sid, SECCLASS_SHM,
5368 			    SHM__ASSOCIATE, &ad);
5369 }
5370 
5371 /* Note, at this point, shp is locked down */
selinux_shm_shmctl(struct shmid_kernel * shp,int cmd)5372 static int selinux_shm_shmctl(struct shmid_kernel *shp, int cmd)
5373 {
5374 	int perms;
5375 	int err;
5376 
5377 	switch (cmd) {
5378 	case IPC_INFO:
5379 	case SHM_INFO:
5380 		/* No specific object, just general system-wide information. */
5381 		return task_has_system(current, SYSTEM__IPC_INFO);
5382 	case IPC_STAT:
5383 	case SHM_STAT:
5384 		perms = SHM__GETATTR | SHM__ASSOCIATE;
5385 		break;
5386 	case IPC_SET:
5387 		perms = SHM__SETATTR;
5388 		break;
5389 	case SHM_LOCK:
5390 	case SHM_UNLOCK:
5391 		perms = SHM__LOCK;
5392 		break;
5393 	case IPC_RMID:
5394 		perms = SHM__DESTROY;
5395 		break;
5396 	default:
5397 		return 0;
5398 	}
5399 
5400 	err = ipc_has_perm(&shp->shm_perm, perms);
5401 	return err;
5402 }
5403 
selinux_shm_shmat(struct shmid_kernel * shp,char __user * shmaddr,int shmflg)5404 static int selinux_shm_shmat(struct shmid_kernel *shp,
5405 			     char __user *shmaddr, int shmflg)
5406 {
5407 	u32 perms;
5408 
5409 	if (shmflg & SHM_RDONLY)
5410 		perms = SHM__READ;
5411 	else
5412 		perms = SHM__READ | SHM__WRITE;
5413 
5414 	return ipc_has_perm(&shp->shm_perm, perms);
5415 }
5416 
5417 /* Semaphore security operations */
selinux_sem_alloc_security(struct sem_array * sma)5418 static int selinux_sem_alloc_security(struct sem_array *sma)
5419 {
5420 	struct ipc_security_struct *isec;
5421 	struct common_audit_data ad;
5422 	u32 sid = current_sid();
5423 	int rc;
5424 
5425 	rc = ipc_alloc_security(current, &sma->sem_perm, SECCLASS_SEM);
5426 	if (rc)
5427 		return rc;
5428 
5429 	isec = sma->sem_perm.security;
5430 
5431 	ad.type = LSM_AUDIT_DATA_IPC;
5432 	ad.u.ipc_id = sma->sem_perm.key;
5433 
5434 	rc = avc_has_perm(sid, isec->sid, SECCLASS_SEM,
5435 			  SEM__CREATE, &ad);
5436 	if (rc) {
5437 		ipc_free_security(&sma->sem_perm);
5438 		return rc;
5439 	}
5440 	return 0;
5441 }
5442 
selinux_sem_free_security(struct sem_array * sma)5443 static void selinux_sem_free_security(struct sem_array *sma)
5444 {
5445 	ipc_free_security(&sma->sem_perm);
5446 }
5447 
selinux_sem_associate(struct sem_array * sma,int semflg)5448 static int selinux_sem_associate(struct sem_array *sma, int semflg)
5449 {
5450 	struct ipc_security_struct *isec;
5451 	struct common_audit_data ad;
5452 	u32 sid = current_sid();
5453 
5454 	isec = sma->sem_perm.security;
5455 
5456 	ad.type = LSM_AUDIT_DATA_IPC;
5457 	ad.u.ipc_id = sma->sem_perm.key;
5458 
5459 	return avc_has_perm(sid, isec->sid, SECCLASS_SEM,
5460 			    SEM__ASSOCIATE, &ad);
5461 }
5462 
5463 /* Note, at this point, sma is locked down */
selinux_sem_semctl(struct sem_array * sma,int cmd)5464 static int selinux_sem_semctl(struct sem_array *sma, int cmd)
5465 {
5466 	int err;
5467 	u32 perms;
5468 
5469 	switch (cmd) {
5470 	case IPC_INFO:
5471 	case SEM_INFO:
5472 		/* No specific object, just general system-wide information. */
5473 		return task_has_system(current, SYSTEM__IPC_INFO);
5474 	case GETPID:
5475 	case GETNCNT:
5476 	case GETZCNT:
5477 		perms = SEM__GETATTR;
5478 		break;
5479 	case GETVAL:
5480 	case GETALL:
5481 		perms = SEM__READ;
5482 		break;
5483 	case SETVAL:
5484 	case SETALL:
5485 		perms = SEM__WRITE;
5486 		break;
5487 	case IPC_RMID:
5488 		perms = SEM__DESTROY;
5489 		break;
5490 	case IPC_SET:
5491 		perms = SEM__SETATTR;
5492 		break;
5493 	case IPC_STAT:
5494 	case SEM_STAT:
5495 		perms = SEM__GETATTR | SEM__ASSOCIATE;
5496 		break;
5497 	default:
5498 		return 0;
5499 	}
5500 
5501 	err = ipc_has_perm(&sma->sem_perm, perms);
5502 	return err;
5503 }
5504 
selinux_sem_semop(struct sem_array * sma,struct sembuf * sops,unsigned nsops,int alter)5505 static int selinux_sem_semop(struct sem_array *sma,
5506 			     struct sembuf *sops, unsigned nsops, int alter)
5507 {
5508 	u32 perms;
5509 
5510 	if (alter)
5511 		perms = SEM__READ | SEM__WRITE;
5512 	else
5513 		perms = SEM__READ;
5514 
5515 	return ipc_has_perm(&sma->sem_perm, perms);
5516 }
5517 
selinux_ipc_permission(struct kern_ipc_perm * ipcp,short flag)5518 static int selinux_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
5519 {
5520 	u32 av = 0;
5521 
5522 	av = 0;
5523 	if (flag & S_IRUGO)
5524 		av |= IPC__UNIX_READ;
5525 	if (flag & S_IWUGO)
5526 		av |= IPC__UNIX_WRITE;
5527 
5528 	if (av == 0)
5529 		return 0;
5530 
5531 	return ipc_has_perm(ipcp, av);
5532 }
5533 
selinux_ipc_getsecid(struct kern_ipc_perm * ipcp,u32 * secid)5534 static void selinux_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
5535 {
5536 	struct ipc_security_struct *isec = ipcp->security;
5537 	*secid = isec->sid;
5538 }
5539 
selinux_d_instantiate(struct dentry * dentry,struct inode * inode)5540 static void selinux_d_instantiate(struct dentry *dentry, struct inode *inode)
5541 {
5542 	if (inode)
5543 		inode_doinit_with_dentry(inode, dentry);
5544 }
5545 
selinux_getprocattr(struct task_struct * p,char * name,char ** value)5546 static int selinux_getprocattr(struct task_struct *p,
5547 			       char *name, char **value)
5548 {
5549 	const struct task_security_struct *__tsec;
5550 	u32 sid;
5551 	int error;
5552 	unsigned len;
5553 
5554 	if (current != p) {
5555 		error = current_has_perm(p, PROCESS__GETATTR);
5556 		if (error)
5557 			return error;
5558 	}
5559 
5560 	rcu_read_lock();
5561 	__tsec = __task_cred(p)->security;
5562 
5563 	if (!strcmp(name, "current"))
5564 		sid = __tsec->sid;
5565 	else if (!strcmp(name, "prev"))
5566 		sid = __tsec->osid;
5567 	else if (!strcmp(name, "exec"))
5568 		sid = __tsec->exec_sid;
5569 	else if (!strcmp(name, "fscreate"))
5570 		sid = __tsec->create_sid;
5571 	else if (!strcmp(name, "keycreate"))
5572 		sid = __tsec->keycreate_sid;
5573 	else if (!strcmp(name, "sockcreate"))
5574 		sid = __tsec->sockcreate_sid;
5575 	else
5576 		goto invalid;
5577 	rcu_read_unlock();
5578 
5579 	if (!sid)
5580 		return 0;
5581 
5582 	error = security_sid_to_context(sid, value, &len);
5583 	if (error)
5584 		return error;
5585 	return len;
5586 
5587 invalid:
5588 	rcu_read_unlock();
5589 	return -EINVAL;
5590 }
5591 
selinux_setprocattr(struct task_struct * p,char * name,void * value,size_t size)5592 static int selinux_setprocattr(struct task_struct *p,
5593 			       char *name, void *value, size_t size)
5594 {
5595 	struct task_security_struct *tsec;
5596 	struct task_struct *tracer;
5597 	struct cred *new;
5598 	u32 sid = 0, ptsid;
5599 	int error;
5600 	char *str = value;
5601 
5602 	if (current != p) {
5603 		/* SELinux only allows a process to change its own
5604 		   security attributes. */
5605 		return -EACCES;
5606 	}
5607 
5608 	/*
5609 	 * Basic control over ability to set these attributes at all.
5610 	 * current == p, but we'll pass them separately in case the
5611 	 * above restriction is ever removed.
5612 	 */
5613 	if (!strcmp(name, "exec"))
5614 		error = current_has_perm(p, PROCESS__SETEXEC);
5615 	else if (!strcmp(name, "fscreate"))
5616 		error = current_has_perm(p, PROCESS__SETFSCREATE);
5617 	else if (!strcmp(name, "keycreate"))
5618 		error = current_has_perm(p, PROCESS__SETKEYCREATE);
5619 	else if (!strcmp(name, "sockcreate"))
5620 		error = current_has_perm(p, PROCESS__SETSOCKCREATE);
5621 	else if (!strcmp(name, "current"))
5622 		error = current_has_perm(p, PROCESS__SETCURRENT);
5623 	else
5624 		error = -EINVAL;
5625 	if (error)
5626 		return error;
5627 
5628 	/* Obtain a SID for the context, if one was specified. */
5629 	if (size && str[1] && str[1] != '\n') {
5630 		if (str[size-1] == '\n') {
5631 			str[size-1] = 0;
5632 			size--;
5633 		}
5634 		error = security_context_to_sid(value, size, &sid, GFP_KERNEL);
5635 		if (error == -EINVAL && !strcmp(name, "fscreate")) {
5636 			if (!capable(CAP_MAC_ADMIN)) {
5637 				struct audit_buffer *ab;
5638 				size_t audit_size;
5639 
5640 				/* We strip a nul only if it is at the end, otherwise the
5641 				 * context contains a nul and we should audit that */
5642 				if (str[size - 1] == '\0')
5643 					audit_size = size - 1;
5644 				else
5645 					audit_size = size;
5646 				ab = audit_log_start(current->audit_context, GFP_ATOMIC, AUDIT_SELINUX_ERR);
5647 				audit_log_format(ab, "op=fscreate invalid_context=");
5648 				audit_log_n_untrustedstring(ab, value, audit_size);
5649 				audit_log_end(ab);
5650 
5651 				return error;
5652 			}
5653 			error = security_context_to_sid_force(value, size,
5654 							      &sid);
5655 		}
5656 		if (error)
5657 			return error;
5658 	}
5659 
5660 	new = prepare_creds();
5661 	if (!new)
5662 		return -ENOMEM;
5663 
5664 	/* Permission checking based on the specified context is
5665 	   performed during the actual operation (execve,
5666 	   open/mkdir/...), when we know the full context of the
5667 	   operation.  See selinux_bprm_set_creds for the execve
5668 	   checks and may_create for the file creation checks. The
5669 	   operation will then fail if the context is not permitted. */
5670 	tsec = new->security;
5671 	if (!strcmp(name, "exec")) {
5672 		tsec->exec_sid = sid;
5673 	} else if (!strcmp(name, "fscreate")) {
5674 		tsec->create_sid = sid;
5675 	} else if (!strcmp(name, "keycreate")) {
5676 		error = may_create_key(sid, p);
5677 		if (error)
5678 			goto abort_change;
5679 		tsec->keycreate_sid = sid;
5680 	} else if (!strcmp(name, "sockcreate")) {
5681 		tsec->sockcreate_sid = sid;
5682 	} else if (!strcmp(name, "current")) {
5683 		error = -EINVAL;
5684 		if (sid == 0)
5685 			goto abort_change;
5686 
5687 		/* Only allow single threaded processes to change context */
5688 		error = -EPERM;
5689 		if (!current_is_single_threaded()) {
5690 			error = security_bounded_transition(tsec->sid, sid);
5691 			if (error)
5692 				goto abort_change;
5693 		}
5694 
5695 		/* Check permissions for the transition. */
5696 		error = avc_has_perm(tsec->sid, sid, SECCLASS_PROCESS,
5697 				     PROCESS__DYNTRANSITION, NULL);
5698 		if (error)
5699 			goto abort_change;
5700 
5701 		/* Check for ptracing, and update the task SID if ok.
5702 		   Otherwise, leave SID unchanged and fail. */
5703 		ptsid = 0;
5704 		rcu_read_lock();
5705 		tracer = ptrace_parent(p);
5706 		if (tracer)
5707 			ptsid = task_sid(tracer);
5708 		rcu_read_unlock();
5709 
5710 		if (tracer) {
5711 			error = avc_has_perm(ptsid, sid, SECCLASS_PROCESS,
5712 					     PROCESS__PTRACE, NULL);
5713 			if (error)
5714 				goto abort_change;
5715 		}
5716 
5717 		tsec->sid = sid;
5718 	} else {
5719 		error = -EINVAL;
5720 		goto abort_change;
5721 	}
5722 
5723 	commit_creds(new);
5724 	return size;
5725 
5726 abort_change:
5727 	abort_creds(new);
5728 	return error;
5729 }
5730 
selinux_ismaclabel(const char * name)5731 static int selinux_ismaclabel(const char *name)
5732 {
5733 	return (strcmp(name, XATTR_SELINUX_SUFFIX) == 0);
5734 }
5735 
selinux_secid_to_secctx(u32 secid,char ** secdata,u32 * seclen)5736 static int selinux_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
5737 {
5738 	return security_sid_to_context(secid, secdata, seclen);
5739 }
5740 
selinux_secctx_to_secid(const char * secdata,u32 seclen,u32 * secid)5741 static int selinux_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid)
5742 {
5743 	return security_context_to_sid(secdata, seclen, secid, GFP_KERNEL);
5744 }
5745 
selinux_release_secctx(char * secdata,u32 seclen)5746 static void selinux_release_secctx(char *secdata, u32 seclen)
5747 {
5748 	kfree(secdata);
5749 }
5750 
5751 /*
5752  *	called with inode->i_mutex locked
5753  */
selinux_inode_notifysecctx(struct inode * inode,void * ctx,u32 ctxlen)5754 static int selinux_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen)
5755 {
5756 	return selinux_inode_setsecurity(inode, XATTR_SELINUX_SUFFIX, ctx, ctxlen, 0);
5757 }
5758 
5759 /*
5760  *	called with inode->i_mutex locked
5761  */
selinux_inode_setsecctx(struct dentry * dentry,void * ctx,u32 ctxlen)5762 static int selinux_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen)
5763 {
5764 	return __vfs_setxattr_noperm(dentry, XATTR_NAME_SELINUX, ctx, ctxlen, 0);
5765 }
5766 
selinux_inode_getsecctx(struct inode * inode,void ** ctx,u32 * ctxlen)5767 static int selinux_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen)
5768 {
5769 	int len = 0;
5770 	len = selinux_inode_getsecurity(inode, XATTR_SELINUX_SUFFIX,
5771 						ctx, true);
5772 	if (len < 0)
5773 		return len;
5774 	*ctxlen = len;
5775 	return 0;
5776 }
5777 #ifdef CONFIG_KEYS
5778 
selinux_key_alloc(struct key * k,const struct cred * cred,unsigned long flags)5779 static int selinux_key_alloc(struct key *k, const struct cred *cred,
5780 			     unsigned long flags)
5781 {
5782 	const struct task_security_struct *tsec;
5783 	struct key_security_struct *ksec;
5784 
5785 	ksec = kzalloc(sizeof(struct key_security_struct), GFP_KERNEL);
5786 	if (!ksec)
5787 		return -ENOMEM;
5788 
5789 	tsec = cred->security;
5790 	if (tsec->keycreate_sid)
5791 		ksec->sid = tsec->keycreate_sid;
5792 	else
5793 		ksec->sid = tsec->sid;
5794 
5795 	k->security = ksec;
5796 	return 0;
5797 }
5798 
selinux_key_free(struct key * k)5799 static void selinux_key_free(struct key *k)
5800 {
5801 	struct key_security_struct *ksec = k->security;
5802 
5803 	k->security = NULL;
5804 	kfree(ksec);
5805 }
5806 
selinux_key_permission(key_ref_t key_ref,const struct cred * cred,unsigned perm)5807 static int selinux_key_permission(key_ref_t key_ref,
5808 				  const struct cred *cred,
5809 				  unsigned perm)
5810 {
5811 	struct key *key;
5812 	struct key_security_struct *ksec;
5813 	u32 sid;
5814 
5815 	/* if no specific permissions are requested, we skip the
5816 	   permission check. No serious, additional covert channels
5817 	   appear to be created. */
5818 	if (perm == 0)
5819 		return 0;
5820 
5821 	sid = cred_sid(cred);
5822 
5823 	key = key_ref_to_ptr(key_ref);
5824 	ksec = key->security;
5825 
5826 	return avc_has_perm(sid, ksec->sid, SECCLASS_KEY, perm, NULL);
5827 }
5828 
selinux_key_getsecurity(struct key * key,char ** _buffer)5829 static int selinux_key_getsecurity(struct key *key, char **_buffer)
5830 {
5831 	struct key_security_struct *ksec = key->security;
5832 	char *context = NULL;
5833 	unsigned len;
5834 	int rc;
5835 
5836 	rc = security_sid_to_context(ksec->sid, &context, &len);
5837 	if (!rc)
5838 		rc = len;
5839 	*_buffer = context;
5840 	return rc;
5841 }
5842 
5843 #endif
5844 
5845 static struct security_operations selinux_ops = {
5846 	.name =				"selinux",
5847 
5848 	.binder_set_context_mgr =	selinux_binder_set_context_mgr,
5849 	.binder_transaction =		selinux_binder_transaction,
5850 	.binder_transfer_binder =	selinux_binder_transfer_binder,
5851 	.binder_transfer_file =		selinux_binder_transfer_file,
5852 
5853 	.ptrace_access_check =		selinux_ptrace_access_check,
5854 	.ptrace_traceme =		selinux_ptrace_traceme,
5855 	.capget =			selinux_capget,
5856 	.capset =			selinux_capset,
5857 	.capable =			selinux_capable,
5858 	.quotactl =			selinux_quotactl,
5859 	.quota_on =			selinux_quota_on,
5860 	.syslog =			selinux_syslog,
5861 	.vm_enough_memory =		selinux_vm_enough_memory,
5862 
5863 	.netlink_send =			selinux_netlink_send,
5864 
5865 	.bprm_set_creds =		selinux_bprm_set_creds,
5866 	.bprm_committing_creds =	selinux_bprm_committing_creds,
5867 	.bprm_committed_creds =		selinux_bprm_committed_creds,
5868 	.bprm_secureexec =		selinux_bprm_secureexec,
5869 
5870 	.sb_alloc_security =		selinux_sb_alloc_security,
5871 	.sb_free_security =		selinux_sb_free_security,
5872 	.sb_copy_data =			selinux_sb_copy_data,
5873 	.sb_remount =			selinux_sb_remount,
5874 	.sb_kern_mount =		selinux_sb_kern_mount,
5875 	.sb_show_options =		selinux_sb_show_options,
5876 	.sb_statfs =			selinux_sb_statfs,
5877 	.sb_mount =			selinux_mount,
5878 	.sb_umount =			selinux_umount,
5879 	.sb_set_mnt_opts =		selinux_set_mnt_opts,
5880 	.sb_clone_mnt_opts =		selinux_sb_clone_mnt_opts,
5881 	.sb_parse_opts_str = 		selinux_parse_opts_str,
5882 
5883 	.dentry_init_security =		selinux_dentry_init_security,
5884 
5885 	.inode_alloc_security =		selinux_inode_alloc_security,
5886 	.inode_free_security =		selinux_inode_free_security,
5887 	.inode_init_security =		selinux_inode_init_security,
5888 	.inode_create =			selinux_inode_create,
5889 	.inode_link =			selinux_inode_link,
5890 	.inode_unlink =			selinux_inode_unlink,
5891 	.inode_symlink =		selinux_inode_symlink,
5892 	.inode_mkdir =			selinux_inode_mkdir,
5893 	.inode_rmdir =			selinux_inode_rmdir,
5894 	.inode_mknod =			selinux_inode_mknod,
5895 	.inode_rename =			selinux_inode_rename,
5896 	.inode_readlink =		selinux_inode_readlink,
5897 	.inode_follow_link =		selinux_inode_follow_link,
5898 	.inode_permission =		selinux_inode_permission,
5899 	.inode_setattr =		selinux_inode_setattr,
5900 	.inode_getattr =		selinux_inode_getattr,
5901 	.inode_setxattr =		selinux_inode_setxattr,
5902 	.inode_post_setxattr =		selinux_inode_post_setxattr,
5903 	.inode_getxattr =		selinux_inode_getxattr,
5904 	.inode_listxattr =		selinux_inode_listxattr,
5905 	.inode_removexattr =		selinux_inode_removexattr,
5906 	.inode_getsecurity =		selinux_inode_getsecurity,
5907 	.inode_setsecurity =		selinux_inode_setsecurity,
5908 	.inode_listsecurity =		selinux_inode_listsecurity,
5909 	.inode_getsecid =		selinux_inode_getsecid,
5910 
5911 	.file_permission =		selinux_file_permission,
5912 	.file_alloc_security =		selinux_file_alloc_security,
5913 	.file_free_security =		selinux_file_free_security,
5914 	.file_ioctl =			selinux_file_ioctl,
5915 	.mmap_file =			selinux_mmap_file,
5916 	.mmap_addr =			selinux_mmap_addr,
5917 	.file_mprotect =		selinux_file_mprotect,
5918 	.file_lock =			selinux_file_lock,
5919 	.file_fcntl =			selinux_file_fcntl,
5920 	.file_set_fowner =		selinux_file_set_fowner,
5921 	.file_send_sigiotask =		selinux_file_send_sigiotask,
5922 	.file_receive =			selinux_file_receive,
5923 
5924 	.file_open =			selinux_file_open,
5925 
5926 	.task_create =			selinux_task_create,
5927 	.cred_alloc_blank =		selinux_cred_alloc_blank,
5928 	.cred_free =			selinux_cred_free,
5929 	.cred_prepare =			selinux_cred_prepare,
5930 	.cred_transfer =		selinux_cred_transfer,
5931 	.kernel_act_as =		selinux_kernel_act_as,
5932 	.kernel_create_files_as =	selinux_kernel_create_files_as,
5933 	.kernel_module_request =	selinux_kernel_module_request,
5934 	.task_setpgid =			selinux_task_setpgid,
5935 	.task_getpgid =			selinux_task_getpgid,
5936 	.task_getsid =			selinux_task_getsid,
5937 	.task_getsecid =		selinux_task_getsecid,
5938 	.task_setnice =			selinux_task_setnice,
5939 	.task_setioprio =		selinux_task_setioprio,
5940 	.task_getioprio =		selinux_task_getioprio,
5941 	.task_setrlimit =		selinux_task_setrlimit,
5942 	.task_setscheduler =		selinux_task_setscheduler,
5943 	.task_getscheduler =		selinux_task_getscheduler,
5944 	.task_movememory =		selinux_task_movememory,
5945 	.task_kill =			selinux_task_kill,
5946 	.task_wait =			selinux_task_wait,
5947 	.task_to_inode =		selinux_task_to_inode,
5948 
5949 	.ipc_permission =		selinux_ipc_permission,
5950 	.ipc_getsecid =			selinux_ipc_getsecid,
5951 
5952 	.msg_msg_alloc_security =	selinux_msg_msg_alloc_security,
5953 	.msg_msg_free_security =	selinux_msg_msg_free_security,
5954 
5955 	.msg_queue_alloc_security =	selinux_msg_queue_alloc_security,
5956 	.msg_queue_free_security =	selinux_msg_queue_free_security,
5957 	.msg_queue_associate =		selinux_msg_queue_associate,
5958 	.msg_queue_msgctl =		selinux_msg_queue_msgctl,
5959 	.msg_queue_msgsnd =		selinux_msg_queue_msgsnd,
5960 	.msg_queue_msgrcv =		selinux_msg_queue_msgrcv,
5961 
5962 	.shm_alloc_security =		selinux_shm_alloc_security,
5963 	.shm_free_security =		selinux_shm_free_security,
5964 	.shm_associate =		selinux_shm_associate,
5965 	.shm_shmctl =			selinux_shm_shmctl,
5966 	.shm_shmat =			selinux_shm_shmat,
5967 
5968 	.sem_alloc_security =		selinux_sem_alloc_security,
5969 	.sem_free_security =		selinux_sem_free_security,
5970 	.sem_associate =		selinux_sem_associate,
5971 	.sem_semctl =			selinux_sem_semctl,
5972 	.sem_semop =			selinux_sem_semop,
5973 
5974 	.d_instantiate =		selinux_d_instantiate,
5975 
5976 	.getprocattr =			selinux_getprocattr,
5977 	.setprocattr =			selinux_setprocattr,
5978 
5979 	.ismaclabel =			selinux_ismaclabel,
5980 	.secid_to_secctx =		selinux_secid_to_secctx,
5981 	.secctx_to_secid =		selinux_secctx_to_secid,
5982 	.release_secctx =		selinux_release_secctx,
5983 	.inode_notifysecctx =		selinux_inode_notifysecctx,
5984 	.inode_setsecctx =		selinux_inode_setsecctx,
5985 	.inode_getsecctx =		selinux_inode_getsecctx,
5986 
5987 	.unix_stream_connect =		selinux_socket_unix_stream_connect,
5988 	.unix_may_send =		selinux_socket_unix_may_send,
5989 
5990 	.socket_create =		selinux_socket_create,
5991 	.socket_post_create =		selinux_socket_post_create,
5992 	.socket_bind =			selinux_socket_bind,
5993 	.socket_connect =		selinux_socket_connect,
5994 	.socket_listen =		selinux_socket_listen,
5995 	.socket_accept =		selinux_socket_accept,
5996 	.socket_sendmsg =		selinux_socket_sendmsg,
5997 	.socket_recvmsg =		selinux_socket_recvmsg,
5998 	.socket_getsockname =		selinux_socket_getsockname,
5999 	.socket_getpeername =		selinux_socket_getpeername,
6000 	.socket_getsockopt =		selinux_socket_getsockopt,
6001 	.socket_setsockopt =		selinux_socket_setsockopt,
6002 	.socket_shutdown =		selinux_socket_shutdown,
6003 	.socket_sock_rcv_skb =		selinux_socket_sock_rcv_skb,
6004 	.socket_getpeersec_stream =	selinux_socket_getpeersec_stream,
6005 	.socket_getpeersec_dgram =	selinux_socket_getpeersec_dgram,
6006 	.sk_alloc_security =		selinux_sk_alloc_security,
6007 	.sk_free_security =		selinux_sk_free_security,
6008 	.sk_clone_security =		selinux_sk_clone_security,
6009 	.sk_getsecid =			selinux_sk_getsecid,
6010 	.sock_graft =			selinux_sock_graft,
6011 	.inet_conn_request =		selinux_inet_conn_request,
6012 	.inet_csk_clone =		selinux_inet_csk_clone,
6013 	.inet_conn_established =	selinux_inet_conn_established,
6014 	.secmark_relabel_packet =	selinux_secmark_relabel_packet,
6015 	.secmark_refcount_inc =		selinux_secmark_refcount_inc,
6016 	.secmark_refcount_dec =		selinux_secmark_refcount_dec,
6017 	.req_classify_flow =		selinux_req_classify_flow,
6018 	.tun_dev_alloc_security =	selinux_tun_dev_alloc_security,
6019 	.tun_dev_free_security =	selinux_tun_dev_free_security,
6020 	.tun_dev_create =		selinux_tun_dev_create,
6021 	.tun_dev_attach_queue =		selinux_tun_dev_attach_queue,
6022 	.tun_dev_attach =		selinux_tun_dev_attach,
6023 	.tun_dev_open =			selinux_tun_dev_open,
6024 
6025 #ifdef CONFIG_SECURITY_NETWORK_XFRM
6026 	.xfrm_policy_alloc_security =	selinux_xfrm_policy_alloc,
6027 	.xfrm_policy_clone_security =	selinux_xfrm_policy_clone,
6028 	.xfrm_policy_free_security =	selinux_xfrm_policy_free,
6029 	.xfrm_policy_delete_security =	selinux_xfrm_policy_delete,
6030 	.xfrm_state_alloc =		selinux_xfrm_state_alloc,
6031 	.xfrm_state_alloc_acquire =	selinux_xfrm_state_alloc_acquire,
6032 	.xfrm_state_free_security =	selinux_xfrm_state_free,
6033 	.xfrm_state_delete_security =	selinux_xfrm_state_delete,
6034 	.xfrm_policy_lookup =		selinux_xfrm_policy_lookup,
6035 	.xfrm_state_pol_flow_match =	selinux_xfrm_state_pol_flow_match,
6036 	.xfrm_decode_session =		selinux_xfrm_decode_session,
6037 #endif
6038 
6039 #ifdef CONFIG_KEYS
6040 	.key_alloc =			selinux_key_alloc,
6041 	.key_free =			selinux_key_free,
6042 	.key_permission =		selinux_key_permission,
6043 	.key_getsecurity =		selinux_key_getsecurity,
6044 #endif
6045 
6046 #ifdef CONFIG_AUDIT
6047 	.audit_rule_init =		selinux_audit_rule_init,
6048 	.audit_rule_known =		selinux_audit_rule_known,
6049 	.audit_rule_match =		selinux_audit_rule_match,
6050 	.audit_rule_free =		selinux_audit_rule_free,
6051 #endif
6052 };
6053 
selinux_init(void)6054 static __init int selinux_init(void)
6055 {
6056 	if (!security_module_enable(&selinux_ops)) {
6057 		selinux_enabled = 0;
6058 		return 0;
6059 	}
6060 
6061 	if (!selinux_enabled) {
6062 		printk(KERN_INFO "SELinux:  Disabled at boot.\n");
6063 		return 0;
6064 	}
6065 
6066 	printk(KERN_INFO "SELinux:  Initializing.\n");
6067 
6068 	/* Set the security state for the initial task. */
6069 	cred_init_security();
6070 
6071 	default_noexec = !(VM_DATA_DEFAULT_FLAGS & VM_EXEC);
6072 
6073 	sel_inode_cache = kmem_cache_create("selinux_inode_security",
6074 					    sizeof(struct inode_security_struct),
6075 					    0, SLAB_PANIC, NULL);
6076 	avc_init();
6077 
6078 	if (register_security(&selinux_ops))
6079 		panic("SELinux: Unable to register with kernel.\n");
6080 
6081 	if (avc_add_callback(selinux_netcache_avc_callback, AVC_CALLBACK_RESET))
6082 		panic("SELinux: Unable to register AVC netcache callback\n");
6083 
6084 	if (selinux_enforcing)
6085 		printk(KERN_DEBUG "SELinux:  Starting in enforcing mode\n");
6086 	else
6087 		printk(KERN_DEBUG "SELinux:  Starting in permissive mode\n");
6088 
6089 	return 0;
6090 }
6091 
delayed_superblock_init(struct super_block * sb,void * unused)6092 static void delayed_superblock_init(struct super_block *sb, void *unused)
6093 {
6094 	superblock_doinit(sb, NULL);
6095 }
6096 
selinux_complete_init(void)6097 void selinux_complete_init(void)
6098 {
6099 	printk(KERN_DEBUG "SELinux:  Completing initialization.\n");
6100 
6101 	/* Set up any superblocks initialized prior to the policy load. */
6102 	printk(KERN_DEBUG "SELinux:  Setting up existing superblocks.\n");
6103 	iterate_supers(delayed_superblock_init, NULL);
6104 }
6105 
6106 /* SELinux requires early initialization in order to label
6107    all processes and objects when they are created. */
6108 security_initcall(selinux_init);
6109 
6110 #if defined(CONFIG_NETFILTER)
6111 
6112 static struct nf_hook_ops selinux_nf_ops[] = {
6113 	{
6114 		.hook =		selinux_ipv4_postroute,
6115 		.owner =	THIS_MODULE,
6116 		.pf =		NFPROTO_IPV4,
6117 		.hooknum =	NF_INET_POST_ROUTING,
6118 		.priority =	NF_IP_PRI_SELINUX_LAST,
6119 	},
6120 	{
6121 		.hook =		selinux_ipv4_forward,
6122 		.owner =	THIS_MODULE,
6123 		.pf =		NFPROTO_IPV4,
6124 		.hooknum =	NF_INET_FORWARD,
6125 		.priority =	NF_IP_PRI_SELINUX_FIRST,
6126 	},
6127 	{
6128 		.hook =		selinux_ipv4_output,
6129 		.owner =	THIS_MODULE,
6130 		.pf =		NFPROTO_IPV4,
6131 		.hooknum =	NF_INET_LOCAL_OUT,
6132 		.priority =	NF_IP_PRI_SELINUX_FIRST,
6133 	},
6134 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
6135 	{
6136 		.hook =		selinux_ipv6_postroute,
6137 		.owner =	THIS_MODULE,
6138 		.pf =		NFPROTO_IPV6,
6139 		.hooknum =	NF_INET_POST_ROUTING,
6140 		.priority =	NF_IP6_PRI_SELINUX_LAST,
6141 	},
6142 	{
6143 		.hook =		selinux_ipv6_forward,
6144 		.owner =	THIS_MODULE,
6145 		.pf =		NFPROTO_IPV6,
6146 		.hooknum =	NF_INET_FORWARD,
6147 		.priority =	NF_IP6_PRI_SELINUX_FIRST,
6148 	},
6149 #endif	/* IPV6 */
6150 };
6151 
selinux_nf_ip_init(void)6152 static int __init selinux_nf_ip_init(void)
6153 {
6154 	int err;
6155 
6156 	if (!selinux_enabled)
6157 		return 0;
6158 
6159 	printk(KERN_DEBUG "SELinux:  Registering netfilter hooks\n");
6160 
6161 	err = nf_register_hooks(selinux_nf_ops, ARRAY_SIZE(selinux_nf_ops));
6162 	if (err)
6163 		panic("SELinux: nf_register_hooks: error %d\n", err);
6164 
6165 	return 0;
6166 }
6167 
6168 __initcall(selinux_nf_ip_init);
6169 
6170 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
selinux_nf_ip_exit(void)6171 static void selinux_nf_ip_exit(void)
6172 {
6173 	printk(KERN_DEBUG "SELinux:  Unregistering netfilter hooks\n");
6174 
6175 	nf_unregister_hooks(selinux_nf_ops, ARRAY_SIZE(selinux_nf_ops));
6176 }
6177 #endif
6178 
6179 #else /* CONFIG_NETFILTER */
6180 
6181 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
6182 #define selinux_nf_ip_exit()
6183 #endif
6184 
6185 #endif /* CONFIG_NETFILTER */
6186 
6187 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
6188 static int selinux_disabled;
6189 
selinux_disable(void)6190 int selinux_disable(void)
6191 {
6192 	if (ss_initialized) {
6193 		/* Not permitted after initial policy load. */
6194 		return -EINVAL;
6195 	}
6196 
6197 	if (selinux_disabled) {
6198 		/* Only do this once. */
6199 		return -EINVAL;
6200 	}
6201 
6202 	printk(KERN_INFO "SELinux:  Disabled at runtime.\n");
6203 
6204 	selinux_disabled = 1;
6205 	selinux_enabled = 0;
6206 
6207 	reset_security_ops();
6208 
6209 	/* Try to destroy the avc node cache */
6210 	avc_disable();
6211 
6212 	/* Unregister netfilter hooks. */
6213 	selinux_nf_ip_exit();
6214 
6215 	/* Unregister selinuxfs. */
6216 	exit_sel_fs();
6217 
6218 	return 0;
6219 }
6220 #endif
6221