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