2 * NSA Security-Enhanced Linux (SELinux) security module
4 * This file contains the SELinux hook function implementations.
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>
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.moore@hp.com>
18 * Copyright (C) 2007 Hitachi Software Engineering Co., Ltd.
19 * Yuichi Nakamura <ynakam@hitachisoft.jp>
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.
26 #include <linux/init.h>
27 #include <linux/kernel.h>
28 #include <linux/tracehook.h>
29 #include <linux/errno.h>
30 #include <linux/sched.h>
31 #include <linux/security.h>
32 #include <linux/xattr.h>
33 #include <linux/capability.h>
34 #include <linux/unistd.h>
36 #include <linux/mman.h>
37 #include <linux/slab.h>
38 #include <linux/pagemap.h>
39 #include <linux/swap.h>
40 #include <linux/spinlock.h>
41 #include <linux/syscalls.h>
42 #include <linux/file.h>
43 #include <linux/fdtable.h>
44 #include <linux/namei.h>
45 #include <linux/mount.h>
46 #include <linux/proc_fs.h>
47 #include <linux/netfilter_ipv4.h>
48 #include <linux/netfilter_ipv6.h>
49 #include <linux/tty.h>
51 #include <net/ip.h> /* for local_port_range[] */
52 #include <net/tcp.h> /* struct or_callable used in sock_rcv_skb */
53 #include <net/net_namespace.h>
54 #include <net/netlabel.h>
55 #include <linux/uaccess.h>
56 #include <asm/ioctls.h>
57 #include <asm/atomic.h>
58 #include <linux/bitops.h>
59 #include <linux/interrupt.h>
60 #include <linux/netdevice.h> /* for network interface checks */
61 #include <linux/netlink.h>
62 #include <linux/tcp.h>
63 #include <linux/udp.h>
64 #include <linux/dccp.h>
65 #include <linux/quota.h>
66 #include <linux/un.h> /* for Unix socket types */
67 #include <net/af_unix.h> /* for Unix socket types */
68 #include <linux/parser.h>
69 #include <linux/nfs_mount.h>
71 #include <linux/hugetlb.h>
72 #include <linux/personality.h>
73 #include <linux/sysctl.h>
74 #include <linux/audit.h>
75 #include <linux/string.h>
76 #include <linux/selinux.h>
77 #include <linux/mutex.h>
78 #include <linux/posix-timers.h>
89 #define XATTR_SELINUX_SUFFIX "selinux"
90 #define XATTR_NAME_SELINUX XATTR_SECURITY_PREFIX XATTR_SELINUX_SUFFIX
92 #define NUM_SEL_MNT_OPTS 5
94 extern int selinux_nlmsg_lookup(u16 sclass, u16 nlmsg_type, u32 *perm);
95 extern struct security_operations *security_ops;
97 /* SECMARK reference count */
98 atomic_t selinux_secmark_refcount = ATOMIC_INIT(0);
100 #ifdef CONFIG_SECURITY_SELINUX_DEVELOP
101 int selinux_enforcing;
103 static int __init enforcing_setup(char *str)
105 unsigned long enforcing;
106 if (!strict_strtoul(str, 0, &enforcing))
107 selinux_enforcing = enforcing ? 1 : 0;
110 __setup("enforcing=", enforcing_setup);
113 #ifdef CONFIG_SECURITY_SELINUX_BOOTPARAM
114 int selinux_enabled = CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE;
116 static int __init selinux_enabled_setup(char *str)
118 unsigned long enabled;
119 if (!strict_strtoul(str, 0, &enabled))
120 selinux_enabled = enabled ? 1 : 0;
123 __setup("selinux=", selinux_enabled_setup);
125 int selinux_enabled = 1;
130 * Minimal support for a secondary security module,
131 * just to allow the use of the capability module.
133 static struct security_operations *secondary_ops;
135 /* Lists of inode and superblock security structures initialized
136 before the policy was loaded. */
137 static LIST_HEAD(superblock_security_head);
138 static DEFINE_SPINLOCK(sb_security_lock);
140 static struct kmem_cache *sel_inode_cache;
143 * selinux_secmark_enabled - Check to see if SECMARK is currently enabled
146 * This function checks the SECMARK reference counter to see if any SECMARK
147 * targets are currently configured, if the reference counter is greater than
148 * zero SECMARK is considered to be enabled. Returns true (1) if SECMARK is
149 * enabled, false (0) if SECMARK is disabled.
152 static int selinux_secmark_enabled(void)
154 return (atomic_read(&selinux_secmark_refcount) > 0);
158 * initialise the security for the init task
160 static void cred_init_security(void)
162 struct cred *cred = (struct cred *) current->real_cred;
163 struct task_security_struct *tsec;
165 tsec = kzalloc(sizeof(struct task_security_struct), GFP_KERNEL);
167 panic("SELinux: Failed to initialize initial task.\n");
169 tsec->osid = tsec->sid = SECINITSID_KERNEL;
170 cred->security = tsec;
174 * get the security ID of a set of credentials
176 static inline u32 cred_sid(const struct cred *cred)
178 const struct task_security_struct *tsec;
180 tsec = cred->security;
185 * get the objective security ID of a task
187 static inline u32 task_sid(const struct task_struct *task)
192 sid = cred_sid(__task_cred(task));
198 * get the subjective security ID of the current task
200 static inline u32 current_sid(void)
202 const struct task_security_struct *tsec = current_cred()->security;
207 /* Allocate and free functions for each kind of security blob. */
209 static int inode_alloc_security(struct inode *inode)
211 struct inode_security_struct *isec;
212 u32 sid = current_sid();
214 isec = kmem_cache_zalloc(sel_inode_cache, GFP_NOFS);
218 mutex_init(&isec->lock);
219 INIT_LIST_HEAD(&isec->list);
221 isec->sid = SECINITSID_UNLABELED;
222 isec->sclass = SECCLASS_FILE;
223 isec->task_sid = sid;
224 inode->i_security = isec;
229 static void inode_free_security(struct inode *inode)
231 struct inode_security_struct *isec = inode->i_security;
232 struct superblock_security_struct *sbsec = inode->i_sb->s_security;
234 spin_lock(&sbsec->isec_lock);
235 if (!list_empty(&isec->list))
236 list_del_init(&isec->list);
237 spin_unlock(&sbsec->isec_lock);
239 inode->i_security = NULL;
240 kmem_cache_free(sel_inode_cache, isec);
243 static int file_alloc_security(struct file *file)
245 struct file_security_struct *fsec;
246 u32 sid = current_sid();
248 fsec = kzalloc(sizeof(struct file_security_struct), GFP_KERNEL);
253 fsec->fown_sid = sid;
254 file->f_security = fsec;
259 static void file_free_security(struct file *file)
261 struct file_security_struct *fsec = file->f_security;
262 file->f_security = NULL;
266 static int superblock_alloc_security(struct super_block *sb)
268 struct superblock_security_struct *sbsec;
270 sbsec = kzalloc(sizeof(struct superblock_security_struct), GFP_KERNEL);
274 mutex_init(&sbsec->lock);
275 INIT_LIST_HEAD(&sbsec->list);
276 INIT_LIST_HEAD(&sbsec->isec_head);
277 spin_lock_init(&sbsec->isec_lock);
279 sbsec->sid = SECINITSID_UNLABELED;
280 sbsec->def_sid = SECINITSID_FILE;
281 sbsec->mntpoint_sid = SECINITSID_UNLABELED;
282 sb->s_security = sbsec;
287 static void superblock_free_security(struct super_block *sb)
289 struct superblock_security_struct *sbsec = sb->s_security;
291 spin_lock(&sb_security_lock);
292 if (!list_empty(&sbsec->list))
293 list_del_init(&sbsec->list);
294 spin_unlock(&sb_security_lock);
296 sb->s_security = NULL;
300 static int sk_alloc_security(struct sock *sk, int family, gfp_t priority)
302 struct sk_security_struct *ssec;
304 ssec = kzalloc(sizeof(*ssec), priority);
308 ssec->peer_sid = SECINITSID_UNLABELED;
309 ssec->sid = SECINITSID_UNLABELED;
310 sk->sk_security = ssec;
312 selinux_netlbl_sk_security_reset(ssec);
317 static void sk_free_security(struct sock *sk)
319 struct sk_security_struct *ssec = sk->sk_security;
321 sk->sk_security = NULL;
322 selinux_netlbl_sk_security_free(ssec);
326 /* The security server must be initialized before
327 any labeling or access decisions can be provided. */
328 extern int ss_initialized;
330 /* The file system's label must be initialized prior to use. */
332 static char *labeling_behaviors[6] = {
334 "uses transition SIDs",
336 "uses genfs_contexts",
337 "not configured for labeling",
338 "uses mountpoint labeling",
341 static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry);
343 static inline int inode_doinit(struct inode *inode)
345 return inode_doinit_with_dentry(inode, NULL);
354 Opt_labelsupport = 5,
357 static const match_table_t tokens = {
358 {Opt_context, CONTEXT_STR "%s"},
359 {Opt_fscontext, FSCONTEXT_STR "%s"},
360 {Opt_defcontext, DEFCONTEXT_STR "%s"},
361 {Opt_rootcontext, ROOTCONTEXT_STR "%s"},
362 {Opt_labelsupport, LABELSUPP_STR},
366 #define SEL_MOUNT_FAIL_MSG "SELinux: duplicate or incompatible mount options\n"
368 static int may_context_mount_sb_relabel(u32 sid,
369 struct superblock_security_struct *sbsec,
370 const struct cred *cred)
372 const struct task_security_struct *tsec = cred->security;
375 rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
376 FILESYSTEM__RELABELFROM, NULL);
380 rc = avc_has_perm(tsec->sid, sid, SECCLASS_FILESYSTEM,
381 FILESYSTEM__RELABELTO, NULL);
385 static int may_context_mount_inode_relabel(u32 sid,
386 struct superblock_security_struct *sbsec,
387 const struct cred *cred)
389 const struct task_security_struct *tsec = cred->security;
391 rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
392 FILESYSTEM__RELABELFROM, NULL);
396 rc = avc_has_perm(sid, sbsec->sid, SECCLASS_FILESYSTEM,
397 FILESYSTEM__ASSOCIATE, NULL);
401 static int sb_finish_set_opts(struct super_block *sb)
403 struct superblock_security_struct *sbsec = sb->s_security;
404 struct dentry *root = sb->s_root;
405 struct inode *root_inode = root->d_inode;
408 if (sbsec->behavior == SECURITY_FS_USE_XATTR) {
409 /* Make sure that the xattr handler exists and that no
410 error other than -ENODATA is returned by getxattr on
411 the root directory. -ENODATA is ok, as this may be
412 the first boot of the SELinux kernel before we have
413 assigned xattr values to the filesystem. */
414 if (!root_inode->i_op->getxattr) {
415 printk(KERN_WARNING "SELinux: (dev %s, type %s) has no "
416 "xattr support\n", sb->s_id, sb->s_type->name);
420 rc = root_inode->i_op->getxattr(root, XATTR_NAME_SELINUX, NULL, 0);
421 if (rc < 0 && rc != -ENODATA) {
422 if (rc == -EOPNOTSUPP)
423 printk(KERN_WARNING "SELinux: (dev %s, type "
424 "%s) has no security xattr handler\n",
425 sb->s_id, sb->s_type->name);
427 printk(KERN_WARNING "SELinux: (dev %s, type "
428 "%s) getxattr errno %d\n", sb->s_id,
429 sb->s_type->name, -rc);
434 sbsec->flags |= (SE_SBINITIALIZED | SE_SBLABELSUPP);
436 if (sbsec->behavior > ARRAY_SIZE(labeling_behaviors))
437 printk(KERN_ERR "SELinux: initialized (dev %s, type %s), unknown behavior\n",
438 sb->s_id, sb->s_type->name);
440 printk(KERN_DEBUG "SELinux: initialized (dev %s, type %s), %s\n",
441 sb->s_id, sb->s_type->name,
442 labeling_behaviors[sbsec->behavior-1]);
444 if (sbsec->behavior == SECURITY_FS_USE_GENFS ||
445 sbsec->behavior == SECURITY_FS_USE_MNTPOINT ||
446 sbsec->behavior == SECURITY_FS_USE_NONE ||
447 sbsec->behavior > ARRAY_SIZE(labeling_behaviors))
448 sbsec->flags &= ~SE_SBLABELSUPP;
450 /* Special handling for sysfs. Is genfs but also has setxattr handler*/
451 if (strncmp(sb->s_type->name, "sysfs", sizeof("sysfs")) == 0)
452 sbsec->flags |= SE_SBLABELSUPP;
454 /* Initialize the root inode. */
455 rc = inode_doinit_with_dentry(root_inode, root);
457 /* Initialize any other inodes associated with the superblock, e.g.
458 inodes created prior to initial policy load or inodes created
459 during get_sb by a pseudo filesystem that directly
461 spin_lock(&sbsec->isec_lock);
463 if (!list_empty(&sbsec->isec_head)) {
464 struct inode_security_struct *isec =
465 list_entry(sbsec->isec_head.next,
466 struct inode_security_struct, list);
467 struct inode *inode = isec->inode;
468 spin_unlock(&sbsec->isec_lock);
469 inode = igrab(inode);
471 if (!IS_PRIVATE(inode))
475 spin_lock(&sbsec->isec_lock);
476 list_del_init(&isec->list);
479 spin_unlock(&sbsec->isec_lock);
485 * This function should allow an FS to ask what it's mount security
486 * options were so it can use those later for submounts, displaying
487 * mount options, or whatever.
489 static int selinux_get_mnt_opts(const struct super_block *sb,
490 struct security_mnt_opts *opts)
493 struct superblock_security_struct *sbsec = sb->s_security;
494 char *context = NULL;
498 security_init_mnt_opts(opts);
500 if (!(sbsec->flags & SE_SBINITIALIZED))
506 tmp = sbsec->flags & SE_MNTMASK;
507 /* count the number of mount options for this sb */
508 for (i = 0; i < 8; i++) {
510 opts->num_mnt_opts++;
513 /* Check if the Label support flag is set */
514 if (sbsec->flags & SE_SBLABELSUPP)
515 opts->num_mnt_opts++;
517 opts->mnt_opts = kcalloc(opts->num_mnt_opts, sizeof(char *), GFP_ATOMIC);
518 if (!opts->mnt_opts) {
523 opts->mnt_opts_flags = kcalloc(opts->num_mnt_opts, sizeof(int), GFP_ATOMIC);
524 if (!opts->mnt_opts_flags) {
530 if (sbsec->flags & FSCONTEXT_MNT) {
531 rc = security_sid_to_context(sbsec->sid, &context, &len);
534 opts->mnt_opts[i] = context;
535 opts->mnt_opts_flags[i++] = FSCONTEXT_MNT;
537 if (sbsec->flags & CONTEXT_MNT) {
538 rc = security_sid_to_context(sbsec->mntpoint_sid, &context, &len);
541 opts->mnt_opts[i] = context;
542 opts->mnt_opts_flags[i++] = CONTEXT_MNT;
544 if (sbsec->flags & DEFCONTEXT_MNT) {
545 rc = security_sid_to_context(sbsec->def_sid, &context, &len);
548 opts->mnt_opts[i] = context;
549 opts->mnt_opts_flags[i++] = DEFCONTEXT_MNT;
551 if (sbsec->flags & ROOTCONTEXT_MNT) {
552 struct inode *root = sbsec->sb->s_root->d_inode;
553 struct inode_security_struct *isec = root->i_security;
555 rc = security_sid_to_context(isec->sid, &context, &len);
558 opts->mnt_opts[i] = context;
559 opts->mnt_opts_flags[i++] = ROOTCONTEXT_MNT;
561 if (sbsec->flags & SE_SBLABELSUPP) {
562 opts->mnt_opts[i] = NULL;
563 opts->mnt_opts_flags[i++] = SE_SBLABELSUPP;
566 BUG_ON(i != opts->num_mnt_opts);
571 security_free_mnt_opts(opts);
575 static int bad_option(struct superblock_security_struct *sbsec, char flag,
576 u32 old_sid, u32 new_sid)
578 char mnt_flags = sbsec->flags & SE_MNTMASK;
580 /* check if the old mount command had the same options */
581 if (sbsec->flags & SE_SBINITIALIZED)
582 if (!(sbsec->flags & flag) ||
583 (old_sid != new_sid))
586 /* check if we were passed the same options twice,
587 * aka someone passed context=a,context=b
589 if (!(sbsec->flags & SE_SBINITIALIZED))
590 if (mnt_flags & flag)
596 * Allow filesystems with binary mount data to explicitly set mount point
597 * labeling information.
599 static int selinux_set_mnt_opts(struct super_block *sb,
600 struct security_mnt_opts *opts)
602 const struct cred *cred = current_cred();
604 struct superblock_security_struct *sbsec = sb->s_security;
605 const char *name = sb->s_type->name;
606 struct inode *inode = sbsec->sb->s_root->d_inode;
607 struct inode_security_struct *root_isec = inode->i_security;
608 u32 fscontext_sid = 0, context_sid = 0, rootcontext_sid = 0;
609 u32 defcontext_sid = 0;
610 char **mount_options = opts->mnt_opts;
611 int *flags = opts->mnt_opts_flags;
612 int num_opts = opts->num_mnt_opts;
614 mutex_lock(&sbsec->lock);
616 if (!ss_initialized) {
618 /* Defer initialization until selinux_complete_init,
619 after the initial policy is loaded and the security
620 server is ready to handle calls. */
621 spin_lock(&sb_security_lock);
622 if (list_empty(&sbsec->list))
623 list_add(&sbsec->list, &superblock_security_head);
624 spin_unlock(&sb_security_lock);
628 printk(KERN_WARNING "SELinux: Unable to set superblock options "
629 "before the security server is initialized\n");
634 * Binary mount data FS will come through this function twice. Once
635 * from an explicit call and once from the generic calls from the vfs.
636 * Since the generic VFS calls will not contain any security mount data
637 * we need to skip the double mount verification.
639 * This does open a hole in which we will not notice if the first
640 * mount using this sb set explict options and a second mount using
641 * this sb does not set any security options. (The first options
642 * will be used for both mounts)
644 if ((sbsec->flags & SE_SBINITIALIZED) && (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA)
649 * parse the mount options, check if they are valid sids.
650 * also check if someone is trying to mount the same sb more
651 * than once with different security options.
653 for (i = 0; i < num_opts; i++) {
656 if (flags[i] == SE_SBLABELSUPP)
658 rc = security_context_to_sid(mount_options[i],
659 strlen(mount_options[i]), &sid);
661 printk(KERN_WARNING "SELinux: security_context_to_sid"
662 "(%s) failed for (dev %s, type %s) errno=%d\n",
663 mount_options[i], sb->s_id, name, rc);
670 if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid,
672 goto out_double_mount;
674 sbsec->flags |= FSCONTEXT_MNT;
679 if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid,
681 goto out_double_mount;
683 sbsec->flags |= CONTEXT_MNT;
685 case ROOTCONTEXT_MNT:
686 rootcontext_sid = sid;
688 if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid,
690 goto out_double_mount;
692 sbsec->flags |= ROOTCONTEXT_MNT;
696 defcontext_sid = sid;
698 if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid,
700 goto out_double_mount;
702 sbsec->flags |= DEFCONTEXT_MNT;
711 if (sbsec->flags & SE_SBINITIALIZED) {
712 /* previously mounted with options, but not on this attempt? */
713 if ((sbsec->flags & SE_MNTMASK) && !num_opts)
714 goto out_double_mount;
719 if (strcmp(sb->s_type->name, "proc") == 0)
720 sbsec->flags |= SE_SBPROC;
722 /* Determine the labeling behavior to use for this filesystem type. */
723 rc = security_fs_use((sbsec->flags & SE_SBPROC) ? "proc" : sb->s_type->name, &sbsec->behavior, &sbsec->sid);
725 printk(KERN_WARNING "%s: security_fs_use(%s) returned %d\n",
726 __func__, sb->s_type->name, rc);
730 /* sets the context of the superblock for the fs being mounted. */
732 rc = may_context_mount_sb_relabel(fscontext_sid, sbsec, cred);
736 sbsec->sid = fscontext_sid;
740 * Switch to using mount point labeling behavior.
741 * sets the label used on all file below the mountpoint, and will set
742 * the superblock context if not already set.
745 if (!fscontext_sid) {
746 rc = may_context_mount_sb_relabel(context_sid, sbsec,
750 sbsec->sid = context_sid;
752 rc = may_context_mount_inode_relabel(context_sid, sbsec,
757 if (!rootcontext_sid)
758 rootcontext_sid = context_sid;
760 sbsec->mntpoint_sid = context_sid;
761 sbsec->behavior = SECURITY_FS_USE_MNTPOINT;
764 if (rootcontext_sid) {
765 rc = may_context_mount_inode_relabel(rootcontext_sid, sbsec,
770 root_isec->sid = rootcontext_sid;
771 root_isec->initialized = 1;
774 if (defcontext_sid) {
775 if (sbsec->behavior != SECURITY_FS_USE_XATTR) {
777 printk(KERN_WARNING "SELinux: defcontext option is "
778 "invalid for this filesystem type\n");
782 if (defcontext_sid != sbsec->def_sid) {
783 rc = may_context_mount_inode_relabel(defcontext_sid,
789 sbsec->def_sid = defcontext_sid;
792 rc = sb_finish_set_opts(sb);
794 mutex_unlock(&sbsec->lock);
798 printk(KERN_WARNING "SELinux: mount invalid. Same superblock, different "
799 "security settings for (dev %s, type %s)\n", sb->s_id, name);
803 static void selinux_sb_clone_mnt_opts(const struct super_block *oldsb,
804 struct super_block *newsb)
806 const struct superblock_security_struct *oldsbsec = oldsb->s_security;
807 struct superblock_security_struct *newsbsec = newsb->s_security;
809 int set_fscontext = (oldsbsec->flags & FSCONTEXT_MNT);
810 int set_context = (oldsbsec->flags & CONTEXT_MNT);
811 int set_rootcontext = (oldsbsec->flags & ROOTCONTEXT_MNT);
814 * if the parent was able to be mounted it clearly had no special lsm
815 * mount options. thus we can safely put this sb on the list and deal
818 if (!ss_initialized) {
819 spin_lock(&sb_security_lock);
820 if (list_empty(&newsbsec->list))
821 list_add(&newsbsec->list, &superblock_security_head);
822 spin_unlock(&sb_security_lock);
826 /* how can we clone if the old one wasn't set up?? */
827 BUG_ON(!(oldsbsec->flags & SE_SBINITIALIZED));
829 /* if fs is reusing a sb, just let its options stand... */
830 if (newsbsec->flags & SE_SBINITIALIZED)
833 mutex_lock(&newsbsec->lock);
835 newsbsec->flags = oldsbsec->flags;
837 newsbsec->sid = oldsbsec->sid;
838 newsbsec->def_sid = oldsbsec->def_sid;
839 newsbsec->behavior = oldsbsec->behavior;
842 u32 sid = oldsbsec->mntpoint_sid;
846 if (!set_rootcontext) {
847 struct inode *newinode = newsb->s_root->d_inode;
848 struct inode_security_struct *newisec = newinode->i_security;
851 newsbsec->mntpoint_sid = sid;
853 if (set_rootcontext) {
854 const struct inode *oldinode = oldsb->s_root->d_inode;
855 const struct inode_security_struct *oldisec = oldinode->i_security;
856 struct inode *newinode = newsb->s_root->d_inode;
857 struct inode_security_struct *newisec = newinode->i_security;
859 newisec->sid = oldisec->sid;
862 sb_finish_set_opts(newsb);
863 mutex_unlock(&newsbsec->lock);
866 static int selinux_parse_opts_str(char *options,
867 struct security_mnt_opts *opts)
870 char *context = NULL, *defcontext = NULL;
871 char *fscontext = NULL, *rootcontext = NULL;
872 int rc, num_mnt_opts = 0;
874 opts->num_mnt_opts = 0;
876 /* Standard string-based options. */
877 while ((p = strsep(&options, "|")) != NULL) {
879 substring_t args[MAX_OPT_ARGS];
884 token = match_token(p, tokens, args);
888 if (context || defcontext) {
890 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
893 context = match_strdup(&args[0]);
903 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
906 fscontext = match_strdup(&args[0]);
913 case Opt_rootcontext:
916 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
919 rootcontext = match_strdup(&args[0]);
927 if (context || defcontext) {
929 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
932 defcontext = match_strdup(&args[0]);
938 case Opt_labelsupport:
942 printk(KERN_WARNING "SELinux: unknown mount option\n");
949 opts->mnt_opts = kcalloc(NUM_SEL_MNT_OPTS, sizeof(char *), GFP_ATOMIC);
953 opts->mnt_opts_flags = kcalloc(NUM_SEL_MNT_OPTS, sizeof(int), GFP_ATOMIC);
954 if (!opts->mnt_opts_flags) {
955 kfree(opts->mnt_opts);
960 opts->mnt_opts[num_mnt_opts] = fscontext;
961 opts->mnt_opts_flags[num_mnt_opts++] = FSCONTEXT_MNT;
964 opts->mnt_opts[num_mnt_opts] = context;
965 opts->mnt_opts_flags[num_mnt_opts++] = CONTEXT_MNT;
968 opts->mnt_opts[num_mnt_opts] = rootcontext;
969 opts->mnt_opts_flags[num_mnt_opts++] = ROOTCONTEXT_MNT;
972 opts->mnt_opts[num_mnt_opts] = defcontext;
973 opts->mnt_opts_flags[num_mnt_opts++] = DEFCONTEXT_MNT;
976 opts->num_mnt_opts = num_mnt_opts;
987 * string mount options parsing and call set the sbsec
989 static int superblock_doinit(struct super_block *sb, void *data)
992 char *options = data;
993 struct security_mnt_opts opts;
995 security_init_mnt_opts(&opts);
1000 BUG_ON(sb->s_type->fs_flags & FS_BINARY_MOUNTDATA);
1002 rc = selinux_parse_opts_str(options, &opts);
1007 rc = selinux_set_mnt_opts(sb, &opts);
1010 security_free_mnt_opts(&opts);
1014 static void selinux_write_opts(struct seq_file *m,
1015 struct security_mnt_opts *opts)
1020 for (i = 0; i < opts->num_mnt_opts; i++) {
1023 if (opts->mnt_opts[i])
1024 has_comma = strchr(opts->mnt_opts[i], ',');
1028 switch (opts->mnt_opts_flags[i]) {
1030 prefix = CONTEXT_STR;
1033 prefix = FSCONTEXT_STR;
1035 case ROOTCONTEXT_MNT:
1036 prefix = ROOTCONTEXT_STR;
1038 case DEFCONTEXT_MNT:
1039 prefix = DEFCONTEXT_STR;
1041 case SE_SBLABELSUPP:
1043 seq_puts(m, LABELSUPP_STR);
1048 /* we need a comma before each option */
1050 seq_puts(m, prefix);
1053 seq_puts(m, opts->mnt_opts[i]);
1059 static int selinux_sb_show_options(struct seq_file *m, struct super_block *sb)
1061 struct security_mnt_opts opts;
1064 rc = selinux_get_mnt_opts(sb, &opts);
1066 /* before policy load we may get EINVAL, don't show anything */
1072 selinux_write_opts(m, &opts);
1074 security_free_mnt_opts(&opts);
1079 static inline u16 inode_mode_to_security_class(umode_t mode)
1081 switch (mode & S_IFMT) {
1083 return SECCLASS_SOCK_FILE;
1085 return SECCLASS_LNK_FILE;
1087 return SECCLASS_FILE;
1089 return SECCLASS_BLK_FILE;
1091 return SECCLASS_DIR;
1093 return SECCLASS_CHR_FILE;
1095 return SECCLASS_FIFO_FILE;
1099 return SECCLASS_FILE;
1102 static inline int default_protocol_stream(int protocol)
1104 return (protocol == IPPROTO_IP || protocol == IPPROTO_TCP);
1107 static inline int default_protocol_dgram(int protocol)
1109 return (protocol == IPPROTO_IP || protocol == IPPROTO_UDP);
1112 static inline u16 socket_type_to_security_class(int family, int type, int protocol)
1118 case SOCK_SEQPACKET:
1119 return SECCLASS_UNIX_STREAM_SOCKET;
1121 return SECCLASS_UNIX_DGRAM_SOCKET;
1128 if (default_protocol_stream(protocol))
1129 return SECCLASS_TCP_SOCKET;
1131 return SECCLASS_RAWIP_SOCKET;
1133 if (default_protocol_dgram(protocol))
1134 return SECCLASS_UDP_SOCKET;
1136 return SECCLASS_RAWIP_SOCKET;
1138 return SECCLASS_DCCP_SOCKET;
1140 return SECCLASS_RAWIP_SOCKET;
1146 return SECCLASS_NETLINK_ROUTE_SOCKET;
1147 case NETLINK_FIREWALL:
1148 return SECCLASS_NETLINK_FIREWALL_SOCKET;
1149 case NETLINK_INET_DIAG:
1150 return SECCLASS_NETLINK_TCPDIAG_SOCKET;
1152 return SECCLASS_NETLINK_NFLOG_SOCKET;
1154 return SECCLASS_NETLINK_XFRM_SOCKET;
1155 case NETLINK_SELINUX:
1156 return SECCLASS_NETLINK_SELINUX_SOCKET;
1158 return SECCLASS_NETLINK_AUDIT_SOCKET;
1159 case NETLINK_IP6_FW:
1160 return SECCLASS_NETLINK_IP6FW_SOCKET;
1161 case NETLINK_DNRTMSG:
1162 return SECCLASS_NETLINK_DNRT_SOCKET;
1163 case NETLINK_KOBJECT_UEVENT:
1164 return SECCLASS_NETLINK_KOBJECT_UEVENT_SOCKET;
1166 return SECCLASS_NETLINK_SOCKET;
1169 return SECCLASS_PACKET_SOCKET;
1171 return SECCLASS_KEY_SOCKET;
1173 return SECCLASS_APPLETALK_SOCKET;
1176 return SECCLASS_SOCKET;
1179 #ifdef CONFIG_PROC_FS
1180 static int selinux_proc_get_sid(struct proc_dir_entry *de,
1185 char *buffer, *path, *end;
1187 buffer = (char *)__get_free_page(GFP_KERNEL);
1192 end = buffer+buflen;
1197 while (de && de != de->parent) {
1198 buflen -= de->namelen + 1;
1202 memcpy(end, de->name, de->namelen);
1207 rc = security_genfs_sid("proc", path, tclass, sid);
1208 free_page((unsigned long)buffer);
1212 static int selinux_proc_get_sid(struct proc_dir_entry *de,
1220 /* The inode's security attributes must be initialized before first use. */
1221 static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry)
1223 struct superblock_security_struct *sbsec = NULL;
1224 struct inode_security_struct *isec = inode->i_security;
1226 struct dentry *dentry;
1227 #define INITCONTEXTLEN 255
1228 char *context = NULL;
1232 if (isec->initialized)
1235 mutex_lock(&isec->lock);
1236 if (isec->initialized)
1239 sbsec = inode->i_sb->s_security;
1240 if (!(sbsec->flags & SE_SBINITIALIZED)) {
1241 /* Defer initialization until selinux_complete_init,
1242 after the initial policy is loaded and the security
1243 server is ready to handle calls. */
1244 spin_lock(&sbsec->isec_lock);
1245 if (list_empty(&isec->list))
1246 list_add(&isec->list, &sbsec->isec_head);
1247 spin_unlock(&sbsec->isec_lock);
1251 switch (sbsec->behavior) {
1252 case SECURITY_FS_USE_XATTR:
1253 if (!inode->i_op->getxattr) {
1254 isec->sid = sbsec->def_sid;
1258 /* Need a dentry, since the xattr API requires one.
1259 Life would be simpler if we could just pass the inode. */
1261 /* Called from d_instantiate or d_splice_alias. */
1262 dentry = dget(opt_dentry);
1264 /* Called from selinux_complete_init, try to find a dentry. */
1265 dentry = d_find_alias(inode);
1269 * this is can be hit on boot when a file is accessed
1270 * before the policy is loaded. When we load policy we
1271 * may find inodes that have no dentry on the
1272 * sbsec->isec_head list. No reason to complain as these
1273 * will get fixed up the next time we go through
1274 * inode_doinit with a dentry, before these inodes could
1275 * be used again by userspace.
1280 len = INITCONTEXTLEN;
1281 context = kmalloc(len+1, GFP_NOFS);
1287 context[len] = '\0';
1288 rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX,
1290 if (rc == -ERANGE) {
1293 /* Need a larger buffer. Query for the right size. */
1294 rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX,
1301 context = kmalloc(len+1, GFP_NOFS);
1307 context[len] = '\0';
1308 rc = inode->i_op->getxattr(dentry,
1314 if (rc != -ENODATA) {
1315 printk(KERN_WARNING "SELinux: %s: getxattr returned "
1316 "%d for dev=%s ino=%ld\n", __func__,
1317 -rc, inode->i_sb->s_id, inode->i_ino);
1321 /* Map ENODATA to the default file SID */
1322 sid = sbsec->def_sid;
1325 rc = security_context_to_sid_default(context, rc, &sid,
1329 char *dev = inode->i_sb->s_id;
1330 unsigned long ino = inode->i_ino;
1332 if (rc == -EINVAL) {
1333 if (printk_ratelimit())
1334 printk(KERN_NOTICE "SELinux: inode=%lu on dev=%s was found to have an invalid "
1335 "context=%s. This indicates you may need to relabel the inode or the "
1336 "filesystem in question.\n", ino, dev, context);
1338 printk(KERN_WARNING "SELinux: %s: context_to_sid(%s) "
1339 "returned %d for dev=%s ino=%ld\n",
1340 __func__, context, -rc, dev, ino);
1343 /* Leave with the unlabeled SID */
1351 case SECURITY_FS_USE_TASK:
1352 isec->sid = isec->task_sid;
1354 case SECURITY_FS_USE_TRANS:
1355 /* Default to the fs SID. */
1356 isec->sid = sbsec->sid;
1358 /* Try to obtain a transition SID. */
1359 isec->sclass = inode_mode_to_security_class(inode->i_mode);
1360 rc = security_transition_sid(isec->task_sid,
1368 case SECURITY_FS_USE_MNTPOINT:
1369 isec->sid = sbsec->mntpoint_sid;
1372 /* Default to the fs superblock SID. */
1373 isec->sid = sbsec->sid;
1375 if ((sbsec->flags & SE_SBPROC) && !S_ISLNK(inode->i_mode)) {
1376 struct proc_inode *proci = PROC_I(inode);
1378 isec->sclass = inode_mode_to_security_class(inode->i_mode);
1379 rc = selinux_proc_get_sid(proci->pde,
1390 isec->initialized = 1;
1393 mutex_unlock(&isec->lock);
1395 if (isec->sclass == SECCLASS_FILE)
1396 isec->sclass = inode_mode_to_security_class(inode->i_mode);
1400 /* Convert a Linux signal to an access vector. */
1401 static inline u32 signal_to_av(int sig)
1407 /* Commonly granted from child to parent. */
1408 perm = PROCESS__SIGCHLD;
1411 /* Cannot be caught or ignored */
1412 perm = PROCESS__SIGKILL;
1415 /* Cannot be caught or ignored */
1416 perm = PROCESS__SIGSTOP;
1419 /* All other signals. */
1420 perm = PROCESS__SIGNAL;
1428 * Check permission between a pair of credentials
1429 * fork check, ptrace check, etc.
1431 static int cred_has_perm(const struct cred *actor,
1432 const struct cred *target,
1435 u32 asid = cred_sid(actor), tsid = cred_sid(target);
1437 return avc_has_perm(asid, tsid, SECCLASS_PROCESS, perms, NULL);
1441 * Check permission between a pair of tasks, e.g. signal checks,
1442 * fork check, ptrace check, etc.
1443 * tsk1 is the actor and tsk2 is the target
1444 * - this uses the default subjective creds of tsk1
1446 static int task_has_perm(const struct task_struct *tsk1,
1447 const struct task_struct *tsk2,
1450 const struct task_security_struct *__tsec1, *__tsec2;
1454 __tsec1 = __task_cred(tsk1)->security; sid1 = __tsec1->sid;
1455 __tsec2 = __task_cred(tsk2)->security; sid2 = __tsec2->sid;
1457 return avc_has_perm(sid1, sid2, SECCLASS_PROCESS, perms, NULL);
1461 * Check permission between current and another task, e.g. signal checks,
1462 * fork check, ptrace check, etc.
1463 * current is the actor and tsk2 is the target
1464 * - this uses current's subjective creds
1466 static int current_has_perm(const struct task_struct *tsk,
1471 sid = current_sid();
1472 tsid = task_sid(tsk);
1473 return avc_has_perm(sid, tsid, SECCLASS_PROCESS, perms, NULL);
1476 #if CAP_LAST_CAP > 63
1477 #error Fix SELinux to handle capabilities > 63.
1480 /* Check whether a task is allowed to use a capability. */
1481 static int task_has_capability(struct task_struct *tsk,
1482 const struct cred *cred,
1485 struct common_audit_data ad;
1486 struct av_decision avd;
1488 u32 sid = cred_sid(cred);
1489 u32 av = CAP_TO_MASK(cap);
1492 COMMON_AUDIT_DATA_INIT(&ad, CAP);
1496 switch (CAP_TO_INDEX(cap)) {
1498 sclass = SECCLASS_CAPABILITY;
1501 sclass = SECCLASS_CAPABILITY2;
1505 "SELinux: out of range capability %d\n", cap);
1509 rc = avc_has_perm_noaudit(sid, sid, sclass, av, 0, &avd);
1510 if (audit == SECURITY_CAP_AUDIT)
1511 avc_audit(sid, sid, sclass, av, &avd, rc, &ad);
1515 /* Check whether a task is allowed to use a system operation. */
1516 static int task_has_system(struct task_struct *tsk,
1519 u32 sid = task_sid(tsk);
1521 return avc_has_perm(sid, SECINITSID_KERNEL,
1522 SECCLASS_SYSTEM, perms, NULL);
1525 /* Check whether a task has a particular permission to an inode.
1526 The 'adp' parameter is optional and allows other audit
1527 data to be passed (e.g. the dentry). */
1528 static int inode_has_perm(const struct cred *cred,
1529 struct inode *inode,
1531 struct common_audit_data *adp)
1533 struct inode_security_struct *isec;
1534 struct common_audit_data ad;
1537 validate_creds(cred);
1539 if (unlikely(IS_PRIVATE(inode)))
1542 sid = cred_sid(cred);
1543 isec = inode->i_security;
1547 COMMON_AUDIT_DATA_INIT(&ad, FS);
1548 ad.u.fs.inode = inode;
1551 return avc_has_perm(sid, isec->sid, isec->sclass, perms, adp);
1554 /* Same as inode_has_perm, but pass explicit audit data containing
1555 the dentry to help the auditing code to more easily generate the
1556 pathname if needed. */
1557 static inline int dentry_has_perm(const struct cred *cred,
1558 struct vfsmount *mnt,
1559 struct dentry *dentry,
1562 struct inode *inode = dentry->d_inode;
1563 struct common_audit_data ad;
1565 COMMON_AUDIT_DATA_INIT(&ad, FS);
1566 ad.u.fs.path.mnt = mnt;
1567 ad.u.fs.path.dentry = dentry;
1568 return inode_has_perm(cred, inode, av, &ad);
1571 /* Check whether a task can use an open file descriptor to
1572 access an inode in a given way. Check access to the
1573 descriptor itself, and then use dentry_has_perm to
1574 check a particular permission to the file.
1575 Access to the descriptor is implicitly granted if it
1576 has the same SID as the process. If av is zero, then
1577 access to the file is not checked, e.g. for cases
1578 where only the descriptor is affected like seek. */
1579 static int file_has_perm(const struct cred *cred,
1583 struct file_security_struct *fsec = file->f_security;
1584 struct inode *inode = file->f_path.dentry->d_inode;
1585 struct common_audit_data ad;
1586 u32 sid = cred_sid(cred);
1589 COMMON_AUDIT_DATA_INIT(&ad, FS);
1590 ad.u.fs.path = file->f_path;
1592 if (sid != fsec->sid) {
1593 rc = avc_has_perm(sid, fsec->sid,
1601 /* av is zero if only checking access to the descriptor. */
1604 rc = inode_has_perm(cred, inode, av, &ad);
1610 /* Check whether a task can create a file. */
1611 static int may_create(struct inode *dir,
1612 struct dentry *dentry,
1615 const struct cred *cred = current_cred();
1616 const struct task_security_struct *tsec = cred->security;
1617 struct inode_security_struct *dsec;
1618 struct superblock_security_struct *sbsec;
1620 struct common_audit_data ad;
1623 dsec = dir->i_security;
1624 sbsec = dir->i_sb->s_security;
1627 newsid = tsec->create_sid;
1629 COMMON_AUDIT_DATA_INIT(&ad, FS);
1630 ad.u.fs.path.dentry = dentry;
1632 rc = avc_has_perm(sid, dsec->sid, SECCLASS_DIR,
1633 DIR__ADD_NAME | DIR__SEARCH,
1638 if (!newsid || !(sbsec->flags & SE_SBLABELSUPP)) {
1639 rc = security_transition_sid(sid, dsec->sid, tclass, &newsid);
1644 rc = avc_has_perm(sid, newsid, tclass, FILE__CREATE, &ad);
1648 return avc_has_perm(newsid, sbsec->sid,
1649 SECCLASS_FILESYSTEM,
1650 FILESYSTEM__ASSOCIATE, &ad);
1653 /* Check whether a task can create a key. */
1654 static int may_create_key(u32 ksid,
1655 struct task_struct *ctx)
1657 u32 sid = task_sid(ctx);
1659 return avc_has_perm(sid, ksid, SECCLASS_KEY, KEY__CREATE, NULL);
1663 #define MAY_UNLINK 1
1666 /* Check whether a task can link, unlink, or rmdir a file/directory. */
1667 static int may_link(struct inode *dir,
1668 struct dentry *dentry,
1672 struct inode_security_struct *dsec, *isec;
1673 struct common_audit_data ad;
1674 u32 sid = current_sid();
1678 dsec = dir->i_security;
1679 isec = dentry->d_inode->i_security;
1681 COMMON_AUDIT_DATA_INIT(&ad, FS);
1682 ad.u.fs.path.dentry = dentry;
1685 av |= (kind ? DIR__REMOVE_NAME : DIR__ADD_NAME);
1686 rc = avc_has_perm(sid, dsec->sid, SECCLASS_DIR, av, &ad);
1701 printk(KERN_WARNING "SELinux: %s: unrecognized kind %d\n",
1706 rc = avc_has_perm(sid, isec->sid, isec->sclass, av, &ad);
1710 static inline int may_rename(struct inode *old_dir,
1711 struct dentry *old_dentry,
1712 struct inode *new_dir,
1713 struct dentry *new_dentry)
1715 struct inode_security_struct *old_dsec, *new_dsec, *old_isec, *new_isec;
1716 struct common_audit_data ad;
1717 u32 sid = current_sid();
1719 int old_is_dir, new_is_dir;
1722 old_dsec = old_dir->i_security;
1723 old_isec = old_dentry->d_inode->i_security;
1724 old_is_dir = S_ISDIR(old_dentry->d_inode->i_mode);
1725 new_dsec = new_dir->i_security;
1727 COMMON_AUDIT_DATA_INIT(&ad, FS);
1729 ad.u.fs.path.dentry = old_dentry;
1730 rc = avc_has_perm(sid, old_dsec->sid, SECCLASS_DIR,
1731 DIR__REMOVE_NAME | DIR__SEARCH, &ad);
1734 rc = avc_has_perm(sid, old_isec->sid,
1735 old_isec->sclass, FILE__RENAME, &ad);
1738 if (old_is_dir && new_dir != old_dir) {
1739 rc = avc_has_perm(sid, old_isec->sid,
1740 old_isec->sclass, DIR__REPARENT, &ad);
1745 ad.u.fs.path.dentry = new_dentry;
1746 av = DIR__ADD_NAME | DIR__SEARCH;
1747 if (new_dentry->d_inode)
1748 av |= DIR__REMOVE_NAME;
1749 rc = avc_has_perm(sid, new_dsec->sid, SECCLASS_DIR, av, &ad);
1752 if (new_dentry->d_inode) {
1753 new_isec = new_dentry->d_inode->i_security;
1754 new_is_dir = S_ISDIR(new_dentry->d_inode->i_mode);
1755 rc = avc_has_perm(sid, new_isec->sid,
1757 (new_is_dir ? DIR__RMDIR : FILE__UNLINK), &ad);
1765 /* Check whether a task can perform a filesystem operation. */
1766 static int superblock_has_perm(const struct cred *cred,
1767 struct super_block *sb,
1769 struct common_audit_data *ad)
1771 struct superblock_security_struct *sbsec;
1772 u32 sid = cred_sid(cred);
1774 sbsec = sb->s_security;
1775 return avc_has_perm(sid, sbsec->sid, SECCLASS_FILESYSTEM, perms, ad);
1778 /* Convert a Linux mode and permission mask to an access vector. */
1779 static inline u32 file_mask_to_av(int mode, int mask)
1783 if ((mode & S_IFMT) != S_IFDIR) {
1784 if (mask & MAY_EXEC)
1785 av |= FILE__EXECUTE;
1786 if (mask & MAY_READ)
1789 if (mask & MAY_APPEND)
1791 else if (mask & MAY_WRITE)
1795 if (mask & MAY_EXEC)
1797 if (mask & MAY_WRITE)
1799 if (mask & MAY_READ)
1806 /* Convert a Linux file to an access vector. */
1807 static inline u32 file_to_av(struct file *file)
1811 if (file->f_mode & FMODE_READ)
1813 if (file->f_mode & FMODE_WRITE) {
1814 if (file->f_flags & O_APPEND)
1821 * Special file opened with flags 3 for ioctl-only use.
1830 * Convert a file to an access vector and include the correct open
1833 static inline u32 open_file_to_av(struct file *file)
1835 u32 av = file_to_av(file);
1837 if (selinux_policycap_openperm) {
1838 mode_t mode = file->f_path.dentry->d_inode->i_mode;
1840 * lnk files and socks do not really have an 'open'
1844 else if (S_ISCHR(mode))
1845 av |= CHR_FILE__OPEN;
1846 else if (S_ISBLK(mode))
1847 av |= BLK_FILE__OPEN;
1848 else if (S_ISFIFO(mode))
1849 av |= FIFO_FILE__OPEN;
1850 else if (S_ISDIR(mode))
1852 else if (S_ISSOCK(mode))
1853 av |= SOCK_FILE__OPEN;
1855 printk(KERN_ERR "SELinux: WARNING: inside %s with "
1856 "unknown mode:%o\n", __func__, mode);
1861 /* Hook functions begin here. */
1863 static int selinux_ptrace_access_check(struct task_struct *child,
1868 rc = cap_ptrace_access_check(child, mode);
1872 if (mode == PTRACE_MODE_READ) {
1873 u32 sid = current_sid();
1874 u32 csid = task_sid(child);
1875 return avc_has_perm(sid, csid, SECCLASS_FILE, FILE__READ, NULL);
1878 return current_has_perm(child, PROCESS__PTRACE);
1881 static int selinux_ptrace_traceme(struct task_struct *parent)
1885 rc = cap_ptrace_traceme(parent);
1889 return task_has_perm(parent, current, PROCESS__PTRACE);
1892 static int selinux_capget(struct task_struct *target, kernel_cap_t *effective,
1893 kernel_cap_t *inheritable, kernel_cap_t *permitted)
1897 error = current_has_perm(target, PROCESS__GETCAP);
1901 return cap_capget(target, effective, inheritable, permitted);
1904 static int selinux_capset(struct cred *new, const struct cred *old,
1905 const kernel_cap_t *effective,
1906 const kernel_cap_t *inheritable,
1907 const kernel_cap_t *permitted)
1911 error = cap_capset(new, old,
1912 effective, inheritable, permitted);
1916 return cred_has_perm(old, new, PROCESS__SETCAP);
1920 * (This comment used to live with the selinux_task_setuid hook,
1921 * which was removed).
1923 * Since setuid only affects the current process, and since the SELinux
1924 * controls are not based on the Linux identity attributes, SELinux does not
1925 * need to control this operation. However, SELinux does control the use of
1926 * the CAP_SETUID and CAP_SETGID capabilities using the capable hook.
1929 static int selinux_capable(struct task_struct *tsk, const struct cred *cred,
1934 rc = cap_capable(tsk, cred, cap, audit);
1938 return task_has_capability(tsk, cred, cap, audit);
1941 static int selinux_sysctl_get_sid(ctl_table *table, u16 tclass, u32 *sid)
1944 char *buffer, *path, *end;
1947 buffer = (char *)__get_free_page(GFP_KERNEL);
1952 end = buffer+buflen;
1958 const char *name = table->procname;
1959 size_t namelen = strlen(name);
1960 buflen -= namelen + 1;
1964 memcpy(end, name, namelen);
1967 table = table->parent;
1973 memcpy(end, "/sys", 4);
1975 rc = security_genfs_sid("proc", path, tclass, sid);
1977 free_page((unsigned long)buffer);
1982 static int selinux_sysctl(ctl_table *table, int op)
1989 sid = current_sid();
1991 rc = selinux_sysctl_get_sid(table, (op == 0001) ?
1992 SECCLASS_DIR : SECCLASS_FILE, &tsid);
1994 /* Default to the well-defined sysctl SID. */
1995 tsid = SECINITSID_SYSCTL;
1998 /* The op values are "defined" in sysctl.c, thereby creating
1999 * a bad coupling between this module and sysctl.c */
2001 error = avc_has_perm(sid, tsid,
2002 SECCLASS_DIR, DIR__SEARCH, NULL);
2010 error = avc_has_perm(sid, tsid,
2011 SECCLASS_FILE, av, NULL);
2017 static int selinux_quotactl(int cmds, int type, int id, struct super_block *sb)
2019 const struct cred *cred = current_cred();
2031 rc = superblock_has_perm(cred, sb, FILESYSTEM__QUOTAMOD, NULL);
2036 rc = superblock_has_perm(cred, sb, FILESYSTEM__QUOTAGET, NULL);
2039 rc = 0; /* let the kernel handle invalid cmds */
2045 static int selinux_quota_on(struct dentry *dentry)
2047 const struct cred *cred = current_cred();
2049 return dentry_has_perm(cred, NULL, dentry, FILE__QUOTAON);
2052 static int selinux_syslog(int type)
2056 rc = cap_syslog(type);
2061 case 3: /* Read last kernel messages */
2062 case 10: /* Return size of the log buffer */
2063 rc = task_has_system(current, SYSTEM__SYSLOG_READ);
2065 case 6: /* Disable logging to console */
2066 case 7: /* Enable logging to console */
2067 case 8: /* Set level of messages printed to console */
2068 rc = task_has_system(current, SYSTEM__SYSLOG_CONSOLE);
2070 case 0: /* Close log */
2071 case 1: /* Open log */
2072 case 2: /* Read from log */
2073 case 4: /* Read/clear last kernel messages */
2074 case 5: /* Clear ring buffer */
2076 rc = task_has_system(current, SYSTEM__SYSLOG_MOD);
2083 * Check that a process has enough memory to allocate a new virtual
2084 * mapping. 0 means there is enough memory for the allocation to
2085 * succeed and -ENOMEM implies there is not.
2087 * Do not audit the selinux permission check, as this is applied to all
2088 * processes that allocate mappings.
2090 static int selinux_vm_enough_memory(struct mm_struct *mm, long pages)
2092 int rc, cap_sys_admin = 0;
2094 rc = selinux_capable(current, current_cred(), CAP_SYS_ADMIN,
2095 SECURITY_CAP_NOAUDIT);
2099 return __vm_enough_memory(mm, pages, cap_sys_admin);
2102 /* binprm security operations */
2104 static int selinux_bprm_set_creds(struct linux_binprm *bprm)
2106 const struct task_security_struct *old_tsec;
2107 struct task_security_struct *new_tsec;
2108 struct inode_security_struct *isec;
2109 struct common_audit_data ad;
2110 struct inode *inode = bprm->file->f_path.dentry->d_inode;
2113 rc = cap_bprm_set_creds(bprm);
2117 /* SELinux context only depends on initial program or script and not
2118 * the script interpreter */
2119 if (bprm->cred_prepared)
2122 old_tsec = current_security();
2123 new_tsec = bprm->cred->security;
2124 isec = inode->i_security;
2126 /* Default to the current task SID. */
2127 new_tsec->sid = old_tsec->sid;
2128 new_tsec->osid = old_tsec->sid;
2130 /* Reset fs, key, and sock SIDs on execve. */
2131 new_tsec->create_sid = 0;
2132 new_tsec->keycreate_sid = 0;
2133 new_tsec->sockcreate_sid = 0;
2135 if (old_tsec->exec_sid) {
2136 new_tsec->sid = old_tsec->exec_sid;
2137 /* Reset exec SID on execve. */
2138 new_tsec->exec_sid = 0;
2140 /* Check for a default transition on this program. */
2141 rc = security_transition_sid(old_tsec->sid, isec->sid,
2142 SECCLASS_PROCESS, &new_tsec->sid);
2147 COMMON_AUDIT_DATA_INIT(&ad, FS);
2148 ad.u.fs.path = bprm->file->f_path;
2150 if (bprm->file->f_path.mnt->mnt_flags & MNT_NOSUID)
2151 new_tsec->sid = old_tsec->sid;
2153 if (new_tsec->sid == old_tsec->sid) {
2154 rc = avc_has_perm(old_tsec->sid, isec->sid,
2155 SECCLASS_FILE, FILE__EXECUTE_NO_TRANS, &ad);
2159 /* Check permissions for the transition. */
2160 rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
2161 SECCLASS_PROCESS, PROCESS__TRANSITION, &ad);
2165 rc = avc_has_perm(new_tsec->sid, isec->sid,
2166 SECCLASS_FILE, FILE__ENTRYPOINT, &ad);
2170 /* Check for shared state */
2171 if (bprm->unsafe & LSM_UNSAFE_SHARE) {
2172 rc = avc_has_perm(old_tsec->sid, new_tsec->sid,
2173 SECCLASS_PROCESS, PROCESS__SHARE,
2179 /* Make sure that anyone attempting to ptrace over a task that
2180 * changes its SID has the appropriate permit */
2182 (LSM_UNSAFE_PTRACE | LSM_UNSAFE_PTRACE_CAP)) {
2183 struct task_struct *tracer;
2184 struct task_security_struct *sec;
2188 tracer = tracehook_tracer_task(current);
2189 if (likely(tracer != NULL)) {
2190 sec = __task_cred(tracer)->security;
2196 rc = avc_has_perm(ptsid, new_tsec->sid,
2198 PROCESS__PTRACE, NULL);
2204 /* Clear any possibly unsafe personality bits on exec: */
2205 bprm->per_clear |= PER_CLEAR_ON_SETID;
2211 static int selinux_bprm_secureexec(struct linux_binprm *bprm)
2213 const struct cred *cred = current_cred();
2214 const struct task_security_struct *tsec = cred->security;
2222 /* Enable secure mode for SIDs transitions unless
2223 the noatsecure permission is granted between
2224 the two SIDs, i.e. ahp returns 0. */
2225 atsecure = avc_has_perm(osid, sid,
2227 PROCESS__NOATSECURE, NULL);
2230 return (atsecure || cap_bprm_secureexec(bprm));
2233 extern struct vfsmount *selinuxfs_mount;
2234 extern struct dentry *selinux_null;
2236 /* Derived from fs/exec.c:flush_old_files. */
2237 static inline void flush_unauthorized_files(const struct cred *cred,
2238 struct files_struct *files)
2240 struct common_audit_data ad;
2241 struct file *file, *devnull = NULL;
2242 struct tty_struct *tty;
2243 struct fdtable *fdt;
2247 tty = get_current_tty();
2250 if (!list_empty(&tty->tty_files)) {
2251 struct inode *inode;
2253 /* Revalidate access to controlling tty.
2254 Use inode_has_perm on the tty inode directly rather
2255 than using file_has_perm, as this particular open
2256 file may belong to another process and we are only
2257 interested in the inode-based check here. */
2258 file = list_first_entry(&tty->tty_files, struct file, f_u.fu_list);
2259 inode = file->f_path.dentry->d_inode;
2260 if (inode_has_perm(cred, inode,
2261 FILE__READ | FILE__WRITE, NULL)) {
2268 /* Reset controlling tty. */
2272 /* Revalidate access to inherited open files. */
2274 COMMON_AUDIT_DATA_INIT(&ad, FS);
2276 spin_lock(&files->file_lock);
2278 unsigned long set, i;
2283 fdt = files_fdtable(files);
2284 if (i >= fdt->max_fds)
2286 set = fdt->open_fds->fds_bits[j];
2289 spin_unlock(&files->file_lock);
2290 for ( ; set ; i++, set >>= 1) {
2295 if (file_has_perm(cred,
2297 file_to_av(file))) {
2299 fd = get_unused_fd();
2309 devnull = dentry_open(
2311 mntget(selinuxfs_mount),
2313 if (IS_ERR(devnull)) {
2320 fd_install(fd, devnull);
2325 spin_lock(&files->file_lock);
2328 spin_unlock(&files->file_lock);
2332 * Prepare a process for imminent new credential changes due to exec
2334 static void selinux_bprm_committing_creds(struct linux_binprm *bprm)
2336 struct task_security_struct *new_tsec;
2337 struct rlimit *rlim, *initrlim;
2340 new_tsec = bprm->cred->security;
2341 if (new_tsec->sid == new_tsec->osid)
2344 /* Close files for which the new task SID is not authorized. */
2345 flush_unauthorized_files(bprm->cred, current->files);
2347 /* Always clear parent death signal on SID transitions. */
2348 current->pdeath_signal = 0;
2350 /* Check whether the new SID can inherit resource limits from the old
2351 * SID. If not, reset all soft limits to the lower of the current
2352 * task's hard limit and the init task's soft limit.
2354 * Note that the setting of hard limits (even to lower them) can be
2355 * controlled by the setrlimit check. The inclusion of the init task's
2356 * soft limit into the computation is to avoid resetting soft limits
2357 * higher than the default soft limit for cases where the default is
2358 * lower than the hard limit, e.g. RLIMIT_CORE or RLIMIT_STACK.
2360 rc = avc_has_perm(new_tsec->osid, new_tsec->sid, SECCLASS_PROCESS,
2361 PROCESS__RLIMITINH, NULL);
2363 for (i = 0; i < RLIM_NLIMITS; i++) {
2364 rlim = current->signal->rlim + i;
2365 initrlim = init_task.signal->rlim + i;
2366 rlim->rlim_cur = min(rlim->rlim_max, initrlim->rlim_cur);
2368 update_rlimit_cpu(rlim->rlim_cur);
2373 * Clean up the process immediately after the installation of new credentials
2376 static void selinux_bprm_committed_creds(struct linux_binprm *bprm)
2378 const struct task_security_struct *tsec = current_security();
2379 struct itimerval itimer;
2389 /* Check whether the new SID can inherit signal state from the old SID.
2390 * If not, clear itimers to avoid subsequent signal generation and
2391 * flush and unblock signals.
2393 * This must occur _after_ the task SID has been updated so that any
2394 * kill done after the flush will be checked against the new SID.
2396 rc = avc_has_perm(osid, sid, SECCLASS_PROCESS, PROCESS__SIGINH, NULL);
2398 memset(&itimer, 0, sizeof itimer);
2399 for (i = 0; i < 3; i++)
2400 do_setitimer(i, &itimer, NULL);
2401 spin_lock_irq(¤t->sighand->siglock);
2402 if (!(current->signal->flags & SIGNAL_GROUP_EXIT)) {
2403 __flush_signals(current);
2404 flush_signal_handlers(current, 1);
2405 sigemptyset(¤t->blocked);
2407 spin_unlock_irq(¤t->sighand->siglock);
2410 /* Wake up the parent if it is waiting so that it can recheck
2411 * wait permission to the new task SID. */
2412 read_lock(&tasklist_lock);
2413 __wake_up_parent(current, current->real_parent);
2414 read_unlock(&tasklist_lock);
2417 /* superblock security operations */
2419 static int selinux_sb_alloc_security(struct super_block *sb)
2421 return superblock_alloc_security(sb);
2424 static void selinux_sb_free_security(struct super_block *sb)
2426 superblock_free_security(sb);
2429 static inline int match_prefix(char *prefix, int plen, char *option, int olen)
2434 return !memcmp(prefix, option, plen);
2437 static inline int selinux_option(char *option, int len)
2439 return (match_prefix(CONTEXT_STR, sizeof(CONTEXT_STR)-1, option, len) ||
2440 match_prefix(FSCONTEXT_STR, sizeof(FSCONTEXT_STR)-1, option, len) ||
2441 match_prefix(DEFCONTEXT_STR, sizeof(DEFCONTEXT_STR)-1, option, len) ||
2442 match_prefix(ROOTCONTEXT_STR, sizeof(ROOTCONTEXT_STR)-1, option, len) ||
2443 match_prefix(LABELSUPP_STR, sizeof(LABELSUPP_STR)-1, option, len));
2446 static inline void take_option(char **to, char *from, int *first, int len)
2453 memcpy(*to, from, len);
2457 static inline void take_selinux_option(char **to, char *from, int *first,
2460 int current_size = 0;
2468 while (current_size < len) {
2478 static int selinux_sb_copy_data(char *orig, char *copy)
2480 int fnosec, fsec, rc = 0;
2481 char *in_save, *in_curr, *in_end;
2482 char *sec_curr, *nosec_save, *nosec;
2488 nosec = (char *)get_zeroed_page(GFP_KERNEL);
2496 in_save = in_end = orig;
2500 open_quote = !open_quote;
2501 if ((*in_end == ',' && open_quote == 0) ||
2503 int len = in_end - in_curr;
2505 if (selinux_option(in_curr, len))
2506 take_selinux_option(&sec_curr, in_curr, &fsec, len);
2508 take_option(&nosec, in_curr, &fnosec, len);
2510 in_curr = in_end + 1;
2512 } while (*in_end++);
2514 strcpy(in_save, nosec_save);
2515 free_page((unsigned long)nosec_save);
2520 static int selinux_sb_kern_mount(struct super_block *sb, int flags, void *data)
2522 const struct cred *cred = current_cred();
2523 struct common_audit_data ad;
2526 rc = superblock_doinit(sb, data);
2530 /* Allow all mounts performed by the kernel */
2531 if (flags & MS_KERNMOUNT)
2534 COMMON_AUDIT_DATA_INIT(&ad, FS);
2535 ad.u.fs.path.dentry = sb->s_root;
2536 return superblock_has_perm(cred, sb, FILESYSTEM__MOUNT, &ad);
2539 static int selinux_sb_statfs(struct dentry *dentry)
2541 const struct cred *cred = current_cred();
2542 struct common_audit_data ad;
2544 COMMON_AUDIT_DATA_INIT(&ad, FS);
2545 ad.u.fs.path.dentry = dentry->d_sb->s_root;
2546 return superblock_has_perm(cred, dentry->d_sb, FILESYSTEM__GETATTR, &ad);
2549 static int selinux_mount(char *dev_name,
2552 unsigned long flags,
2555 const struct cred *cred = current_cred();
2557 if (flags & MS_REMOUNT)
2558 return superblock_has_perm(cred, path->mnt->mnt_sb,
2559 FILESYSTEM__REMOUNT, NULL);
2561 return dentry_has_perm(cred, path->mnt, path->dentry,
2565 static int selinux_umount(struct vfsmount *mnt, int flags)
2567 const struct cred *cred = current_cred();
2569 return superblock_has_perm(cred, mnt->mnt_sb,
2570 FILESYSTEM__UNMOUNT, NULL);
2573 /* inode security operations */
2575 static int selinux_inode_alloc_security(struct inode *inode)
2577 return inode_alloc_security(inode);
2580 static void selinux_inode_free_security(struct inode *inode)
2582 inode_free_security(inode);
2585 static int selinux_inode_init_security(struct inode *inode, struct inode *dir,
2586 char **name, void **value,
2589 const struct cred *cred = current_cred();
2590 const struct task_security_struct *tsec = cred->security;
2591 struct inode_security_struct *dsec;
2592 struct superblock_security_struct *sbsec;
2593 u32 sid, newsid, clen;
2595 char *namep = NULL, *context;
2597 dsec = dir->i_security;
2598 sbsec = dir->i_sb->s_security;
2601 newsid = tsec->create_sid;
2603 if (!newsid || !(sbsec->flags & SE_SBLABELSUPP)) {
2604 rc = security_transition_sid(sid, dsec->sid,
2605 inode_mode_to_security_class(inode->i_mode),
2608 printk(KERN_WARNING "%s: "
2609 "security_transition_sid failed, rc=%d (dev=%s "
2612 -rc, inode->i_sb->s_id, inode->i_ino);
2617 /* Possibly defer initialization to selinux_complete_init. */
2618 if (sbsec->flags & SE_SBINITIALIZED) {
2619 struct inode_security_struct *isec = inode->i_security;
2620 isec->sclass = inode_mode_to_security_class(inode->i_mode);
2622 isec->initialized = 1;
2625 if (!ss_initialized || !(sbsec->flags & SE_SBLABELSUPP))
2629 namep = kstrdup(XATTR_SELINUX_SUFFIX, GFP_NOFS);
2636 rc = security_sid_to_context_force(newsid, &context, &clen);
2648 static int selinux_inode_create(struct inode *dir, struct dentry *dentry, int mask)
2650 return may_create(dir, dentry, SECCLASS_FILE);
2653 static int selinux_inode_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
2655 return may_link(dir, old_dentry, MAY_LINK);
2658 static int selinux_inode_unlink(struct inode *dir, struct dentry *dentry)
2660 return may_link(dir, dentry, MAY_UNLINK);
2663 static int selinux_inode_symlink(struct inode *dir, struct dentry *dentry, const char *name)
2665 return may_create(dir, dentry, SECCLASS_LNK_FILE);
2668 static int selinux_inode_mkdir(struct inode *dir, struct dentry *dentry, int mask)
2670 return may_create(dir, dentry, SECCLASS_DIR);
2673 static int selinux_inode_rmdir(struct inode *dir, struct dentry *dentry)
2675 return may_link(dir, dentry, MAY_RMDIR);
2678 static int selinux_inode_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
2680 return may_create(dir, dentry, inode_mode_to_security_class(mode));
2683 static int selinux_inode_rename(struct inode *old_inode, struct dentry *old_dentry,
2684 struct inode *new_inode, struct dentry *new_dentry)
2686 return may_rename(old_inode, old_dentry, new_inode, new_dentry);
2689 static int selinux_inode_readlink(struct dentry *dentry)
2691 const struct cred *cred = current_cred();
2693 return dentry_has_perm(cred, NULL, dentry, FILE__READ);
2696 static int selinux_inode_follow_link(struct dentry *dentry, struct nameidata *nameidata)
2698 const struct cred *cred = current_cred();
2700 return dentry_has_perm(cred, NULL, dentry, FILE__READ);
2703 static int selinux_inode_permission(struct inode *inode, int mask)
2705 const struct cred *cred = current_cred();
2708 /* No permission to check. Existence test. */
2712 return inode_has_perm(cred, inode,
2713 file_mask_to_av(inode->i_mode, mask), NULL);
2716 static int selinux_inode_setattr(struct dentry *dentry, struct iattr *iattr)
2718 const struct cred *cred = current_cred();
2719 unsigned int ia_valid = iattr->ia_valid;
2721 /* ATTR_FORCE is just used for ATTR_KILL_S[UG]ID. */
2722 if (ia_valid & ATTR_FORCE) {
2723 ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_MODE |
2729 if (ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID |
2730 ATTR_ATIME_SET | ATTR_MTIME_SET | ATTR_TIMES_SET))
2731 return dentry_has_perm(cred, NULL, dentry, FILE__SETATTR);
2733 return dentry_has_perm(cred, NULL, dentry, FILE__WRITE);
2736 static int selinux_inode_getattr(struct vfsmount *mnt, struct dentry *dentry)
2738 const struct cred *cred = current_cred();
2740 return dentry_has_perm(cred, mnt, dentry, FILE__GETATTR);
2743 static int selinux_inode_setotherxattr(struct dentry *dentry, const char *name)
2745 const struct cred *cred = current_cred();
2747 if (!strncmp(name, XATTR_SECURITY_PREFIX,
2748 sizeof XATTR_SECURITY_PREFIX - 1)) {
2749 if (!strcmp(name, XATTR_NAME_CAPS)) {
2750 if (!capable(CAP_SETFCAP))
2752 } else if (!capable(CAP_SYS_ADMIN)) {
2753 /* A different attribute in the security namespace.
2754 Restrict to administrator. */
2759 /* Not an attribute we recognize, so just check the
2760 ordinary setattr permission. */
2761 return dentry_has_perm(cred, NULL, dentry, FILE__SETATTR);
2764 static int selinux_inode_setxattr(struct dentry *dentry, const char *name,
2765 const void *value, size_t size, int flags)
2767 struct inode *inode = dentry->d_inode;
2768 struct inode_security_struct *isec = inode->i_security;
2769 struct superblock_security_struct *sbsec;
2770 struct common_audit_data ad;
2771 u32 newsid, sid = current_sid();
2774 if (strcmp(name, XATTR_NAME_SELINUX))
2775 return selinux_inode_setotherxattr(dentry, name);
2777 sbsec = inode->i_sb->s_security;
2778 if (!(sbsec->flags & SE_SBLABELSUPP))
2781 if (!is_owner_or_cap(inode))
2784 COMMON_AUDIT_DATA_INIT(&ad, FS);
2785 ad.u.fs.path.dentry = dentry;
2787 rc = avc_has_perm(sid, isec->sid, isec->sclass,
2788 FILE__RELABELFROM, &ad);
2792 rc = security_context_to_sid(value, size, &newsid);
2793 if (rc == -EINVAL) {
2794 if (!capable(CAP_MAC_ADMIN))
2796 rc = security_context_to_sid_force(value, size, &newsid);
2801 rc = avc_has_perm(sid, newsid, isec->sclass,
2802 FILE__RELABELTO, &ad);
2806 rc = security_validate_transition(isec->sid, newsid, sid,
2811 return avc_has_perm(newsid,
2813 SECCLASS_FILESYSTEM,
2814 FILESYSTEM__ASSOCIATE,
2818 static void selinux_inode_post_setxattr(struct dentry *dentry, const char *name,
2819 const void *value, size_t size,
2822 struct inode *inode = dentry->d_inode;
2823 struct inode_security_struct *isec = inode->i_security;
2827 if (strcmp(name, XATTR_NAME_SELINUX)) {
2828 /* Not an attribute we recognize, so nothing to do. */
2832 rc = security_context_to_sid_force(value, size, &newsid);
2834 printk(KERN_ERR "SELinux: unable to map context to SID"
2835 "for (%s, %lu), rc=%d\n",
2836 inode->i_sb->s_id, inode->i_ino, -rc);
2844 static int selinux_inode_getxattr(struct dentry *dentry, const char *name)
2846 const struct cred *cred = current_cred();
2848 return dentry_has_perm(cred, NULL, dentry, FILE__GETATTR);
2851 static int selinux_inode_listxattr(struct dentry *dentry)
2853 const struct cred *cred = current_cred();
2855 return dentry_has_perm(cred, NULL, dentry, FILE__GETATTR);
2858 static int selinux_inode_removexattr(struct dentry *dentry, const char *name)
2860 if (strcmp(name, XATTR_NAME_SELINUX))
2861 return selinux_inode_setotherxattr(dentry, name);
2863 /* No one is allowed to remove a SELinux security label.
2864 You can change the label, but all data must be labeled. */
2869 * Copy the inode security context value to the user.
2871 * Permission check is handled by selinux_inode_getxattr hook.
2873 static int selinux_inode_getsecurity(const struct inode *inode, const char *name, void **buffer, bool alloc)
2877 char *context = NULL;
2878 struct inode_security_struct *isec = inode->i_security;
2880 if (strcmp(name, XATTR_SELINUX_SUFFIX))
2884 * If the caller has CAP_MAC_ADMIN, then get the raw context
2885 * value even if it is not defined by current policy; otherwise,
2886 * use the in-core value under current policy.
2887 * Use the non-auditing forms of the permission checks since
2888 * getxattr may be called by unprivileged processes commonly
2889 * and lack of permission just means that we fall back to the
2890 * in-core context value, not a denial.
2892 error = selinux_capable(current, current_cred(), CAP_MAC_ADMIN,
2893 SECURITY_CAP_NOAUDIT);
2895 error = security_sid_to_context_force(isec->sid, &context,
2898 error = security_sid_to_context(isec->sid, &context, &size);
2911 static int selinux_inode_setsecurity(struct inode *inode, const char *name,
2912 const void *value, size_t size, int flags)
2914 struct inode_security_struct *isec = inode->i_security;
2918 if (strcmp(name, XATTR_SELINUX_SUFFIX))
2921 if (!value || !size)
2924 rc = security_context_to_sid((void *)value, size, &newsid);
2929 isec->initialized = 1;
2933 static int selinux_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size)
2935 const int len = sizeof(XATTR_NAME_SELINUX);
2936 if (buffer && len <= buffer_size)
2937 memcpy(buffer, XATTR_NAME_SELINUX, len);
2941 static void selinux_inode_getsecid(const struct inode *inode, u32 *secid)
2943 struct inode_security_struct *isec = inode->i_security;
2947 /* file security operations */
2949 static int selinux_revalidate_file_permission(struct file *file, int mask)
2951 const struct cred *cred = current_cred();
2952 struct inode *inode = file->f_path.dentry->d_inode;
2954 /* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */
2955 if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE))
2958 return file_has_perm(cred, file,
2959 file_mask_to_av(inode->i_mode, mask));
2962 static int selinux_file_permission(struct file *file, int mask)
2964 struct inode *inode = file->f_path.dentry->d_inode;
2965 struct file_security_struct *fsec = file->f_security;
2966 struct inode_security_struct *isec = inode->i_security;
2967 u32 sid = current_sid();
2970 /* No permission to check. Existence test. */
2973 if (sid == fsec->sid && fsec->isid == isec->sid &&
2974 fsec->pseqno == avc_policy_seqno())
2975 /* No change since dentry_open check. */
2978 return selinux_revalidate_file_permission(file, mask);
2981 static int selinux_file_alloc_security(struct file *file)
2983 return file_alloc_security(file);
2986 static void selinux_file_free_security(struct file *file)
2988 file_free_security(file);
2991 static int selinux_file_ioctl(struct file *file, unsigned int cmd,
2994 const struct cred *cred = current_cred();
2997 if (_IOC_DIR(cmd) & _IOC_WRITE)
2999 if (_IOC_DIR(cmd) & _IOC_READ)
3004 return file_has_perm(cred, file, av);
3007 static int file_map_prot_check(struct file *file, unsigned long prot, int shared)
3009 const struct cred *cred = current_cred();
3012 #ifndef CONFIG_PPC32
3013 if ((prot & PROT_EXEC) && (!file || (!shared && (prot & PROT_WRITE)))) {
3015 * We are making executable an anonymous mapping or a
3016 * private file mapping that will also be writable.
3017 * This has an additional check.
3019 rc = cred_has_perm(cred, cred, PROCESS__EXECMEM);
3026 /* read access is always possible with a mapping */
3027 u32 av = FILE__READ;
3029 /* write access only matters if the mapping is shared */
3030 if (shared && (prot & PROT_WRITE))
3033 if (prot & PROT_EXEC)
3034 av |= FILE__EXECUTE;
3036 return file_has_perm(cred, file, av);
3043 static int selinux_file_mmap(struct file *file, unsigned long reqprot,
3044 unsigned long prot, unsigned long flags,
3045 unsigned long addr, unsigned long addr_only)
3048 u32 sid = current_sid();
3051 * notice that we are intentionally putting the SELinux check before
3052 * the secondary cap_file_mmap check. This is such a likely attempt
3053 * at bad behaviour/exploit that we always want to get the AVC, even
3054 * if DAC would have also denied the operation.
3056 if (addr < CONFIG_LSM_MMAP_MIN_ADDR) {
3057 rc = avc_has_perm(sid, sid, SECCLASS_MEMPROTECT,
3058 MEMPROTECT__MMAP_ZERO, NULL);
3063 /* do DAC check on address space usage */
3064 rc = cap_file_mmap(file, reqprot, prot, flags, addr, addr_only);
3065 if (rc || addr_only)
3068 if (selinux_checkreqprot)
3071 return file_map_prot_check(file, prot,
3072 (flags & MAP_TYPE) == MAP_SHARED);
3075 static int selinux_file_mprotect(struct vm_area_struct *vma,
3076 unsigned long reqprot,
3079 const struct cred *cred = current_cred();
3081 if (selinux_checkreqprot)
3084 #ifndef CONFIG_PPC32
3085 if ((prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) {
3087 if (vma->vm_start >= vma->vm_mm->start_brk &&
3088 vma->vm_end <= vma->vm_mm->brk) {
3089 rc = cred_has_perm(cred, cred, PROCESS__EXECHEAP);
3090 } else if (!vma->vm_file &&
3091 vma->vm_start <= vma->vm_mm->start_stack &&
3092 vma->vm_end >= vma->vm_mm->start_stack) {
3093 rc = current_has_perm(current, PROCESS__EXECSTACK);
3094 } else if (vma->vm_file && vma->anon_vma) {
3096 * We are making executable a file mapping that has
3097 * had some COW done. Since pages might have been
3098 * written, check ability to execute the possibly
3099 * modified content. This typically should only
3100 * occur for text relocations.
3102 rc = file_has_perm(cred, vma->vm_file, FILE__EXECMOD);
3109 return file_map_prot_check(vma->vm_file, prot, vma->vm_flags&VM_SHARED);
3112 static int selinux_file_lock(struct file *file, unsigned int cmd)
3114 const struct cred *cred = current_cred();
3116 return file_has_perm(cred, file, FILE__LOCK);
3119 static int selinux_file_fcntl(struct file *file, unsigned int cmd,
3122 const struct cred *cred = current_cred();
3127 if (!file->f_path.dentry || !file->f_path.dentry->d_inode) {
3132 if ((file->f_flags & O_APPEND) && !(arg & O_APPEND)) {
3133 err = file_has_perm(cred, file, FILE__WRITE);
3142 /* Just check FD__USE permission */
3143 err = file_has_perm(cred, file, 0);
3148 #if BITS_PER_LONG == 32
3153 if (!file->f_path.dentry || !file->f_path.dentry->d_inode) {
3157 err = file_has_perm(cred, file, FILE__LOCK);
3164 static int selinux_file_set_fowner(struct file *file)
3166 struct file_security_struct *fsec;
3168 fsec = file->f_security;
3169 fsec->fown_sid = current_sid();
3174 static int selinux_file_send_sigiotask(struct task_struct *tsk,
3175 struct fown_struct *fown, int signum)
3178 u32 sid = task_sid(tsk);
3180 struct file_security_struct *fsec;
3182 /* struct fown_struct is never outside the context of a struct file */
3183 file = container_of(fown, struct file, f_owner);
3185 fsec = file->f_security;
3188 perm = signal_to_av(SIGIO); /* as per send_sigio_to_task */
3190 perm = signal_to_av(signum);
3192 return avc_has_perm(fsec->fown_sid, sid,
3193 SECCLASS_PROCESS, perm, NULL);
3196 static int selinux_file_receive(struct file *file)
3198 const struct cred *cred = current_cred();
3200 return file_has_perm(cred, file, file_to_av(file));
3203 static int selinux_dentry_open(struct file *file, const struct cred *cred)
3205 struct file_security_struct *fsec;
3206 struct inode *inode;
3207 struct inode_security_struct *isec;
3209 inode = file->f_path.dentry->d_inode;
3210 fsec = file->f_security;
3211 isec = inode->i_security;
3213 * Save inode label and policy sequence number
3214 * at open-time so that selinux_file_permission
3215 * can determine whether revalidation is necessary.
3216 * Task label is already saved in the file security
3217 * struct as its SID.
3219 fsec->isid = isec->sid;
3220 fsec->pseqno = avc_policy_seqno();
3222 * Since the inode label or policy seqno may have changed
3223 * between the selinux_inode_permission check and the saving
3224 * of state above, recheck that access is still permitted.
3225 * Otherwise, access might never be revalidated against the
3226 * new inode label or new policy.
3227 * This check is not redundant - do not remove.
3229 return inode_has_perm(cred, inode, open_file_to_av(file), NULL);
3232 /* task security operations */
3234 static int selinux_task_create(unsigned long clone_flags)
3236 return current_has_perm(current, PROCESS__FORK);
3240 * allocate the SELinux part of blank credentials
3242 static int selinux_cred_alloc_blank(struct cred *cred, gfp_t gfp)
3244 struct task_security_struct *tsec;
3246 tsec = kzalloc(sizeof(struct task_security_struct), gfp);
3250 cred->security = tsec;
3255 * detach and free the LSM part of a set of credentials
3257 static void selinux_cred_free(struct cred *cred)
3259 struct task_security_struct *tsec = cred->security;
3261 BUG_ON((unsigned long) cred->security < PAGE_SIZE);
3262 cred->security = (void *) 0x7UL;
3267 * prepare a new set of credentials for modification
3269 static int selinux_cred_prepare(struct cred *new, const struct cred *old,
3272 const struct task_security_struct *old_tsec;
3273 struct task_security_struct *tsec;
3275 old_tsec = old->security;
3277 tsec = kmemdup(old_tsec, sizeof(struct task_security_struct), gfp);
3281 new->security = tsec;
3286 * transfer the SELinux data to a blank set of creds
3288 static void selinux_cred_transfer(struct cred *new, const struct cred *old)
3290 const struct task_security_struct *old_tsec = old->security;
3291 struct task_security_struct *tsec = new->security;
3297 * set the security data for a kernel service
3298 * - all the creation contexts are set to unlabelled
3300 static int selinux_kernel_act_as(struct cred *new, u32 secid)
3302 struct task_security_struct *tsec = new->security;
3303 u32 sid = current_sid();
3306 ret = avc_has_perm(sid, secid,
3307 SECCLASS_KERNEL_SERVICE,
3308 KERNEL_SERVICE__USE_AS_OVERRIDE,
3312 tsec->create_sid = 0;
3313 tsec->keycreate_sid = 0;
3314 tsec->sockcreate_sid = 0;
3320 * set the file creation context in a security record to the same as the
3321 * objective context of the specified inode
3323 static int selinux_kernel_create_files_as(struct cred *new, struct inode *inode)
3325 struct inode_security_struct *isec = inode->i_security;
3326 struct task_security_struct *tsec = new->security;
3327 u32 sid = current_sid();
3330 ret = avc_has_perm(sid, isec->sid,
3331 SECCLASS_KERNEL_SERVICE,
3332 KERNEL_SERVICE__CREATE_FILES_AS,
3336 tsec->create_sid = isec->sid;
3340 static int selinux_kernel_module_request(void)
3342 return task_has_system(current, SYSTEM__MODULE_REQUEST);
3345 static int selinux_task_setpgid(struct task_struct *p, pid_t pgid)
3347 return current_has_perm(p, PROCESS__SETPGID);
3350 static int selinux_task_getpgid(struct task_struct *p)
3352 return current_has_perm(p, PROCESS__GETPGID);
3355 static int selinux_task_getsid(struct task_struct *p)
3357 return current_has_perm(p, PROCESS__GETSESSION);
3360 static void selinux_task_getsecid(struct task_struct *p, u32 *secid)
3362 *secid = task_sid(p);
3365 static int selinux_task_setnice(struct task_struct *p, int nice)
3369 rc = cap_task_setnice(p, nice);
3373 return current_has_perm(p, PROCESS__SETSCHED);
3376 static int selinux_task_setioprio(struct task_struct *p, int ioprio)
3380 rc = cap_task_setioprio(p, ioprio);
3384 return current_has_perm(p, PROCESS__SETSCHED);
3387 static int selinux_task_getioprio(struct task_struct *p)
3389 return current_has_perm(p, PROCESS__GETSCHED);
3392 static int selinux_task_setrlimit(unsigned int resource, struct rlimit *new_rlim)
3394 struct rlimit *old_rlim = current->signal->rlim + resource;
3396 /* Control the ability to change the hard limit (whether
3397 lowering or raising it), so that the hard limit can
3398 later be used as a safe reset point for the soft limit
3399 upon context transitions. See selinux_bprm_committing_creds. */
3400 if (old_rlim->rlim_max != new_rlim->rlim_max)
3401 return current_has_perm(current, PROCESS__SETRLIMIT);
3406 static int selinux_task_setscheduler(struct task_struct *p, int policy, struct sched_param *lp)
3410 rc = cap_task_setscheduler(p, policy, lp);
3414 return current_has_perm(p, PROCESS__SETSCHED);
3417 static int selinux_task_getscheduler(struct task_struct *p)
3419 return current_has_perm(p, PROCESS__GETSCHED);
3422 static int selinux_task_movememory(struct task_struct *p)
3424 return current_has_perm(p, PROCESS__SETSCHED);
3427 static int selinux_task_kill(struct task_struct *p, struct siginfo *info,
3434 perm = PROCESS__SIGNULL; /* null signal; existence test */
3436 perm = signal_to_av(sig);
3438 rc = avc_has_perm(secid, task_sid(p),
3439 SECCLASS_PROCESS, perm, NULL);
3441 rc = current_has_perm(p, perm);
3445 static int selinux_task_wait(struct task_struct *p)
3447 return task_has_perm(p, current, PROCESS__SIGCHLD);
3450 static void selinux_task_to_inode(struct task_struct *p,
3451 struct inode *inode)
3453 struct inode_security_struct *isec = inode->i_security;
3454 u32 sid = task_sid(p);
3457 isec->initialized = 1;
3460 /* Returns error only if unable to parse addresses */
3461 static int selinux_parse_skb_ipv4(struct sk_buff *skb,
3462 struct common_audit_data *ad, u8 *proto)
3464 int offset, ihlen, ret = -EINVAL;
3465 struct iphdr _iph, *ih;
3467 offset = skb_network_offset(skb);
3468 ih = skb_header_pointer(skb, offset, sizeof(_iph), &_iph);
3472 ihlen = ih->ihl * 4;
3473 if (ihlen < sizeof(_iph))
3476 ad->u.net.v4info.saddr = ih->saddr;
3477 ad->u.net.v4info.daddr = ih->daddr;
3481 *proto = ih->protocol;
3483 switch (ih->protocol) {
3485 struct tcphdr _tcph, *th;
3487 if (ntohs(ih->frag_off) & IP_OFFSET)
3491 th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
3495 ad->u.net.sport = th->source;
3496 ad->u.net.dport = th->dest;
3501 struct udphdr _udph, *uh;
3503 if (ntohs(ih->frag_off) & IP_OFFSET)
3507 uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
3511 ad->u.net.sport = uh->source;
3512 ad->u.net.dport = uh->dest;
3516 case IPPROTO_DCCP: {
3517 struct dccp_hdr _dccph, *dh;
3519 if (ntohs(ih->frag_off) & IP_OFFSET)
3523 dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph);
3527 ad->u.net.sport = dh->dccph_sport;
3528 ad->u.net.dport = dh->dccph_dport;
3539 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
3541 /* Returns error only if unable to parse addresses */
3542 static int selinux_parse_skb_ipv6(struct sk_buff *skb,
3543 struct common_audit_data *ad, u8 *proto)
3546 int ret = -EINVAL, offset;
3547 struct ipv6hdr _ipv6h, *ip6;
3549 offset = skb_network_offset(skb);
3550 ip6 = skb_header_pointer(skb, offset, sizeof(_ipv6h), &_ipv6h);
3554 ipv6_addr_copy(&ad->u.net.v6info.saddr, &ip6->saddr);
3555 ipv6_addr_copy(&ad->u.net.v6info.daddr, &ip6->daddr);
3558 nexthdr = ip6->nexthdr;
3559 offset += sizeof(_ipv6h);
3560 offset = ipv6_skip_exthdr(skb, offset, &nexthdr);
3569 struct tcphdr _tcph, *th;
3571 th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
3575 ad->u.net.sport = th->source;
3576 ad->u.net.dport = th->dest;
3581 struct udphdr _udph, *uh;
3583 uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
3587 ad->u.net.sport = uh->source;
3588 ad->u.net.dport = uh->dest;
3592 case IPPROTO_DCCP: {
3593 struct dccp_hdr _dccph, *dh;
3595 dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph);
3599 ad->u.net.sport = dh->dccph_sport;
3600 ad->u.net.dport = dh->dccph_dport;
3604 /* includes fragments */
3614 static int selinux_parse_skb(struct sk_buff *skb, struct common_audit_data *ad,
3615 char **_addrp, int src, u8 *proto)
3620 switch (ad->u.net.family) {
3622 ret = selinux_parse_skb_ipv4(skb, ad, proto);
3625 addrp = (char *)(src ? &ad->u.net.v4info.saddr :
3626 &ad->u.net.v4info.daddr);
3629 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
3631 ret = selinux_parse_skb_ipv6(skb, ad, proto);
3634 addrp = (char *)(src ? &ad->u.net.v6info.saddr :
3635 &ad->u.net.v6info.daddr);
3645 "SELinux: failure in selinux_parse_skb(),"
3646 " unable to parse packet\n");
3656 * selinux_skb_peerlbl_sid - Determine the peer label of a packet
3658 * @family: protocol family
3659 * @sid: the packet's peer label SID
3662 * Check the various different forms of network peer labeling and determine
3663 * the peer label/SID for the packet; most of the magic actually occurs in
3664 * the security server function security_net_peersid_cmp(). The function
3665 * returns zero if the value in @sid is valid (although it may be SECSID_NULL)
3666 * or -EACCES if @sid is invalid due to inconsistencies with the different
3670 static int selinux_skb_peerlbl_sid(struct sk_buff *skb, u16 family, u32 *sid)
3677 selinux_skb_xfrm_sid(skb, &xfrm_sid);
3678 selinux_netlbl_skbuff_getsid(skb, family, &nlbl_type, &nlbl_sid);
3680 err = security_net_peersid_resolve(nlbl_sid, nlbl_type, xfrm_sid, sid);
3681 if (unlikely(err)) {
3683 "SELinux: failure in selinux_skb_peerlbl_sid(),"
3684 " unable to determine packet's peer label\n");
3691 /* socket security operations */
3692 static int socket_has_perm(struct task_struct *task, struct socket *sock,
3695 struct inode_security_struct *isec;
3696 struct common_audit_data ad;
3700 isec = SOCK_INODE(sock)->i_security;
3702 if (isec->sid == SECINITSID_KERNEL)
3704 sid = task_sid(task);
3706 COMMON_AUDIT_DATA_INIT(&ad, NET);
3707 ad.u.net.sk = sock->sk;
3708 err = avc_has_perm(sid, isec->sid, isec->sclass, perms, &ad);
3714 static int selinux_socket_create(int family, int type,
3715 int protocol, int kern)
3717 const struct cred *cred = current_cred();
3718 const struct task_security_struct *tsec = cred->security;
3727 newsid = tsec->sockcreate_sid ?: sid;
3729 secclass = socket_type_to_security_class(family, type, protocol);
3730 err = avc_has_perm(sid, newsid, secclass, SOCKET__CREATE, NULL);
3736 static int selinux_socket_post_create(struct socket *sock, int family,
3737 int type, int protocol, int kern)
3739 const struct cred *cred = current_cred();
3740 const struct task_security_struct *tsec = cred->security;
3741 struct inode_security_struct *isec;
3742 struct sk_security_struct *sksec;
3747 newsid = tsec->sockcreate_sid;
3749 isec = SOCK_INODE(sock)->i_security;
3752 isec->sid = SECINITSID_KERNEL;
3758 isec->sclass = socket_type_to_security_class(family, type, protocol);
3759 isec->initialized = 1;
3762 sksec = sock->sk->sk_security;
3763 sksec->sid = isec->sid;
3764 sksec->sclass = isec->sclass;
3765 err = selinux_netlbl_socket_post_create(sock->sk, family);
3771 /* Range of port numbers used to automatically bind.
3772 Need to determine whether we should perform a name_bind
3773 permission check between the socket and the port number. */
3775 static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
3780 err = socket_has_perm(current, sock, SOCKET__BIND);
3785 * If PF_INET or PF_INET6, check name_bind permission for the port.
3786 * Multiple address binding for SCTP is not supported yet: we just
3787 * check the first address now.
3789 family = sock->sk->sk_family;
3790 if (family == PF_INET || family == PF_INET6) {
3792 struct inode_security_struct *isec;
3793 struct common_audit_data ad;
3794 struct sockaddr_in *addr4 = NULL;
3795 struct sockaddr_in6 *addr6 = NULL;
3796 unsigned short snum;
3797 struct sock *sk = sock->sk;
3800 isec = SOCK_INODE(sock)->i_security;
3802 if (family == PF_INET) {
3803 addr4 = (struct sockaddr_in *)address;
3804 snum = ntohs(addr4->sin_port);
3805 addrp = (char *)&addr4->sin_addr.s_addr;
3807 addr6 = (struct sockaddr_in6 *)address;
3808 snum = ntohs(addr6->sin6_port);
3809 addrp = (char *)&addr6->sin6_addr.s6_addr;
3815 inet_get_local_port_range(&low, &high);
3817 if (snum < max(PROT_SOCK, low) || snum > high) {
3818 err = sel_netport_sid(sk->sk_protocol,
3822 COMMON_AUDIT_DATA_INIT(&ad, NET);
3823 ad.u.net.sport = htons(snum);
3824 ad.u.net.family = family;
3825 err = avc_has_perm(isec->sid, sid,
3827 SOCKET__NAME_BIND, &ad);
3833 switch (isec->sclass) {
3834 case SECCLASS_TCP_SOCKET:
3835 node_perm = TCP_SOCKET__NODE_BIND;
3838 case SECCLASS_UDP_SOCKET:
3839 node_perm = UDP_SOCKET__NODE_BIND;
3842 case SECCLASS_DCCP_SOCKET:
3843 node_perm = DCCP_SOCKET__NODE_BIND;
3847 node_perm = RAWIP_SOCKET__NODE_BIND;
3851 err = sel_netnode_sid(addrp, family, &sid);
3855 COMMON_AUDIT_DATA_INIT(&ad, NET);
3856 ad.u.net.sport = htons(snum);
3857 ad.u.net.family = family;
3859 if (family == PF_INET)
3860 ad.u.net.v4info.saddr = addr4->sin_addr.s_addr;
3862 ipv6_addr_copy(&ad.u.net.v6info.saddr, &addr6->sin6_addr);
3864 err = avc_has_perm(isec->sid, sid,
3865 isec->sclass, node_perm, &ad);
3873 static int selinux_socket_connect(struct socket *sock, struct sockaddr *address, int addrlen)
3875 struct sock *sk = sock->sk;
3876 struct inode_security_struct *isec;
3879 err = socket_has_perm(current, sock, SOCKET__CONNECT);
3884 * If a TCP or DCCP socket, check name_connect permission for the port.
3886 isec = SOCK_INODE(sock)->i_security;
3887 if (isec->sclass == SECCLASS_TCP_SOCKET ||
3888 isec->sclass == SECCLASS_DCCP_SOCKET) {
3889 struct common_audit_data ad;
3890 struct sockaddr_in *addr4 = NULL;
3891 struct sockaddr_in6 *addr6 = NULL;
3892 unsigned short snum;
3895 if (sk->sk_family == PF_INET) {
3896 addr4 = (struct sockaddr_in *)address;
3897 if (addrlen < sizeof(struct sockaddr_in))
3899 snum = ntohs(addr4->sin_port);
3901 addr6 = (struct sockaddr_in6 *)address;
3902 if (addrlen < SIN6_LEN_RFC2133)
3904 snum = ntohs(addr6->sin6_port);
3907 err = sel_netport_sid(sk->sk_protocol, snum, &sid);
3911 perm = (isec->sclass == SECCLASS_TCP_SOCKET) ?
3912 TCP_SOCKET__NAME_CONNECT : DCCP_SOCKET__NAME_CONNECT;
3914 COMMON_AUDIT_DATA_INIT(&ad, NET);
3915 ad.u.net.dport = htons(snum);
3916 ad.u.net.family = sk->sk_family;
3917 err = avc_has_perm(isec->sid, sid, isec->sclass, perm, &ad);
3922 err = selinux_netlbl_socket_connect(sk, address);
3928 static int selinux_socket_listen(struct socket *sock, int backlog)
3930 return socket_has_perm(current, sock, SOCKET__LISTEN);
3933 static int selinux_socket_accept(struct socket *sock, struct socket *newsock)
3936 struct inode_security_struct *isec;
3937 struct inode_security_struct *newisec;
3939 err = socket_has_perm(current, sock, SOCKET__ACCEPT);
3943 newisec = SOCK_INODE(newsock)->i_security;
3945 isec = SOCK_INODE(sock)->i_security;
3946 newisec->sclass = isec->sclass;
3947 newisec->sid = isec->sid;
3948 newisec->initialized = 1;
3953 static int selinux_socket_sendmsg(struct socket *sock, struct msghdr *msg,
3956 return socket_has_perm(current, sock, SOCKET__WRITE);
3959 static int selinux_socket_recvmsg(struct socket *sock, struct msghdr *msg,
3960 int size, int flags)
3962 return socket_has_perm(current, sock, SOCKET__READ);
3965 static int selinux_socket_getsockname(struct socket *sock)
3967 return socket_has_perm(current, sock, SOCKET__GETATTR);
3970 static int selinux_socket_getpeername(struct socket *sock)
3972 return socket_has_perm(current, sock, SOCKET__GETATTR);
3975 static int selinux_socket_setsockopt(struct socket *sock, int level, int optname)
3979 err = socket_has_perm(current, sock, SOCKET__SETOPT);
3983 return selinux_netlbl_socket_setsockopt(sock, level, optname);
3986 static int selinux_socket_getsockopt(struct socket *sock, int level,
3989 return socket_has_perm(current, sock, SOCKET__GETOPT);
3992 static int selinux_socket_shutdown(struct socket *sock, int how)
3994 return socket_has_perm(current, sock, SOCKET__SHUTDOWN);
3997 static int selinux_socket_unix_stream_connect(struct socket *sock,
3998 struct socket *other,
4001 struct sk_security_struct *ssec;
4002 struct inode_security_struct *isec;
4003 struct inode_security_struct *other_isec;
4004 struct common_audit_data ad;
4007 isec = SOCK_INODE(sock)->i_security;
4008 other_isec = SOCK_INODE(other)->i_security;
4010 COMMON_AUDIT_DATA_INIT(&ad, NET);
4011 ad.u.net.sk = other->sk;
4013 err = avc_has_perm(isec->sid, other_isec->sid,
4015 UNIX_STREAM_SOCKET__CONNECTTO, &ad);
4019 /* connecting socket */
4020 ssec = sock->sk->sk_security;
4021 ssec->peer_sid = other_isec->sid;
4023 /* server child socket */
4024 ssec = newsk->sk_security;
4025 ssec->peer_sid = isec->sid;
4026 err = security_sid_mls_copy(other_isec->sid, ssec->peer_sid, &ssec->sid);
4031 static int selinux_socket_unix_may_send(struct socket *sock,
4032 struct socket *other)
4034 struct inode_security_struct *isec;
4035 struct inode_security_struct *other_isec;
4036 struct common_audit_data ad;
4039 isec = SOCK_INODE(sock)->i_security;
4040 other_isec = SOCK_INODE(other)->i_security;
4042 COMMON_AUDIT_DATA_INIT(&ad, NET);
4043 ad.u.net.sk = other->sk;
4045 err = avc_has_perm(isec->sid, other_isec->sid,
4046 isec->sclass, SOCKET__SENDTO, &ad);
4053 static int selinux_inet_sys_rcv_skb(int ifindex, char *addrp, u16 family,
4055 struct common_audit_data *ad)
4061 err = sel_netif_sid(ifindex, &if_sid);
4064 err = avc_has_perm(peer_sid, if_sid,
4065 SECCLASS_NETIF, NETIF__INGRESS, ad);
4069 err = sel_netnode_sid(addrp, family, &node_sid);
4072 return avc_has_perm(peer_sid, node_sid,
4073 SECCLASS_NODE, NODE__RECVFROM, ad);
4076 static int selinux_sock_rcv_skb_compat(struct sock *sk, struct sk_buff *skb,
4080 struct sk_security_struct *sksec = sk->sk_security;
4082 u32 sk_sid = sksec->sid;
4083 struct common_audit_data ad;
4086 COMMON_AUDIT_DATA_INIT(&ad, NET);
4087 ad.u.net.netif = skb->iif;
4088 ad.u.net.family = family;
4089 err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
4093 if (selinux_secmark_enabled()) {
4094 err = avc_has_perm(sk_sid, skb->secmark, SECCLASS_PACKET,
4100 if (selinux_policycap_netpeer) {
4101 err = selinux_skb_peerlbl_sid(skb, family, &peer_sid);
4104 err = avc_has_perm(sk_sid, peer_sid,
4105 SECCLASS_PEER, PEER__RECV, &ad);
4107 selinux_netlbl_err(skb, err, 0);
4109 err = selinux_netlbl_sock_rcv_skb(sksec, skb, family, &ad);
4112 err = selinux_xfrm_sock_rcv_skb(sksec->sid, skb, &ad);
4118 static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
4121 struct sk_security_struct *sksec = sk->sk_security;
4122 u16 family = sk->sk_family;
4123 u32 sk_sid = sksec->sid;
4124 struct common_audit_data ad;
4129 if (family != PF_INET && family != PF_INET6)
4132 /* Handle mapped IPv4 packets arriving via IPv6 sockets */
4133 if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
4136 /* If any sort of compatibility mode is enabled then handoff processing
4137 * to the selinux_sock_rcv_skb_compat() function to deal with the
4138 * special handling. We do this in an attempt to keep this function
4139 * as fast and as clean as possible. */
4140 if (!selinux_policycap_netpeer)
4141 return selinux_sock_rcv_skb_compat(sk, skb, family);
4143 secmark_active = selinux_secmark_enabled();
4144 peerlbl_active = netlbl_enabled() || selinux_xfrm_enabled();
4145 if (!secmark_active && !peerlbl_active)
4148 COMMON_AUDIT_DATA_INIT(&ad, NET);
4149 ad.u.net.netif = skb->iif;
4150 ad.u.net.family = family;
4151 err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
4155 if (peerlbl_active) {
4158 err = selinux_skb_peerlbl_sid(skb, family, &peer_sid);
4161 err = selinux_inet_sys_rcv_skb(skb->iif, addrp, family,
4164 selinux_netlbl_err(skb, err, 0);
4167 err = avc_has_perm(sk_sid, peer_sid, SECCLASS_PEER,
4170 selinux_netlbl_err(skb, err, 0);
4173 if (secmark_active) {
4174 err = avc_has_perm(sk_sid, skb->secmark, SECCLASS_PACKET,
4183 static int selinux_socket_getpeersec_stream(struct socket *sock, char __user *optval,
4184 int __user *optlen, unsigned len)
4189 struct sk_security_struct *ssec;
4190 struct inode_security_struct *isec;
4191 u32 peer_sid = SECSID_NULL;
4193 isec = SOCK_INODE(sock)->i_security;
4195 if (isec->sclass == SECCLASS_UNIX_STREAM_SOCKET ||
4196 isec->sclass == SECCLASS_TCP_SOCKET) {
4197 ssec = sock->sk->sk_security;
4198 peer_sid = ssec->peer_sid;
4200 if (peer_sid == SECSID_NULL) {
4205 err = security_sid_to_context(peer_sid, &scontext, &scontext_len);
4210 if (scontext_len > len) {
4215 if (copy_to_user(optval, scontext, scontext_len))
4219 if (put_user(scontext_len, optlen))
4227 static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
4229 u32 peer_secid = SECSID_NULL;
4232 if (skb && skb->protocol == htons(ETH_P_IP))
4234 else if (skb && skb->protocol == htons(ETH_P_IPV6))
4237 family = sock->sk->sk_family;
4241 if (sock && family == PF_UNIX)
4242 selinux_inode_getsecid(SOCK_INODE(sock), &peer_secid);
4244 selinux_skb_peerlbl_sid(skb, family, &peer_secid);
4247 *secid = peer_secid;
4248 if (peer_secid == SECSID_NULL)
4253 static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority)
4255 return sk_alloc_security(sk, family, priority);
4258 static void selinux_sk_free_security(struct sock *sk)
4260 sk_free_security(sk);
4263 static void selinux_sk_clone_security(const struct sock *sk, struct sock *newsk)
4265 struct sk_security_struct *ssec = sk->sk_security;
4266 struct sk_security_struct *newssec = newsk->sk_security;
4268 newssec->sid = ssec->sid;
4269 newssec->peer_sid = ssec->peer_sid;
4270 newssec->sclass = ssec->sclass;
4272 selinux_netlbl_sk_security_reset(newssec);
4275 static void selinux_sk_getsecid(struct sock *sk, u32 *secid)
4278 *secid = SECINITSID_ANY_SOCKET;
4280 struct sk_security_struct *sksec = sk->sk_security;
4282 *secid = sksec->sid;
4286 static void selinux_sock_graft(struct sock *sk, struct socket *parent)
4288 struct inode_security_struct *isec = SOCK_INODE(parent)->i_security;
4289 struct sk_security_struct *sksec = sk->sk_security;
4291 if (sk->sk_family == PF_INET || sk->sk_family == PF_INET6 ||
4292 sk->sk_family == PF_UNIX)
4293 isec->sid = sksec->sid;
4294 sksec->sclass = isec->sclass;
4297 static int selinux_inet_conn_request(struct sock *sk, struct sk_buff *skb,
4298 struct request_sock *req)
4300 struct sk_security_struct *sksec = sk->sk_security;
4302 u16 family = sk->sk_family;
4306 /* handle mapped IPv4 packets arriving via IPv6 sockets */
4307 if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
4310 err = selinux_skb_peerlbl_sid(skb, family, &peersid);
4313 if (peersid == SECSID_NULL) {
4314 req->secid = sksec->sid;
4315 req->peer_secid = SECSID_NULL;
4317 err = security_sid_mls_copy(sksec->sid, peersid, &newsid);
4320 req->secid = newsid;
4321 req->peer_secid = peersid;
4324 return selinux_netlbl_inet_conn_request(req, family);
4327 static void selinux_inet_csk_clone(struct sock *newsk,
4328 const struct request_sock *req)
4330 struct sk_security_struct *newsksec = newsk->sk_security;
4332 newsksec->sid = req->secid;
4333 newsksec->peer_sid = req->peer_secid;
4334 /* NOTE: Ideally, we should also get the isec->sid for the
4335 new socket in sync, but we don't have the isec available yet.
4336 So we will wait until sock_graft to do it, by which
4337 time it will have been created and available. */
4339 /* We don't need to take any sort of lock here as we are the only
4340 * thread with access to newsksec */
4341 selinux_netlbl_inet_csk_clone(newsk, req->rsk_ops->family);
4344 static void selinux_inet_conn_established(struct sock *sk, struct sk_buff *skb)
4346 u16 family = sk->sk_family;
4347 struct sk_security_struct *sksec = sk->sk_security;
4349 /* handle mapped IPv4 packets arriving via IPv6 sockets */
4350 if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
4353 selinux_skb_peerlbl_sid(skb, family, &sksec->peer_sid);
4356 static void selinux_req_classify_flow(const struct request_sock *req,
4359 fl->secid = req->secid;
4362 static int selinux_tun_dev_create(void)
4364 u32 sid = current_sid();
4366 /* we aren't taking into account the "sockcreate" SID since the socket
4367 * that is being created here is not a socket in the traditional sense,
4368 * instead it is a private sock, accessible only to the kernel, and
4369 * representing a wide range of network traffic spanning multiple
4370 * connections unlike traditional sockets - check the TUN driver to
4371 * get a better understanding of why this socket is special */
4373 return avc_has_perm(sid, sid, SECCLASS_TUN_SOCKET, TUN_SOCKET__CREATE,
4377 static void selinux_tun_dev_post_create(struct sock *sk)
4379 struct sk_security_struct *sksec = sk->sk_security;
4381 /* we don't currently perform any NetLabel based labeling here and it
4382 * isn't clear that we would want to do so anyway; while we could apply
4383 * labeling without the support of the TUN user the resulting labeled
4384 * traffic from the other end of the connection would almost certainly
4385 * cause confusion to the TUN user that had no idea network labeling
4386 * protocols were being used */
4388 /* see the comments in selinux_tun_dev_create() about why we don't use
4389 * the sockcreate SID here */
4391 sksec->sid = current_sid();
4392 sksec->sclass = SECCLASS_TUN_SOCKET;
4395 static int selinux_tun_dev_attach(struct sock *sk)
4397 struct sk_security_struct *sksec = sk->sk_security;
4398 u32 sid = current_sid();
4401 err = avc_has_perm(sid, sksec->sid, SECCLASS_TUN_SOCKET,
4402 TUN_SOCKET__RELABELFROM, NULL);
4405 err = avc_has_perm(sid, sid, SECCLASS_TUN_SOCKET,
4406 TUN_SOCKET__RELABELTO, NULL);
4415 static int selinux_nlmsg_perm(struct sock *sk, struct sk_buff *skb)
4419 struct nlmsghdr *nlh;
4420 struct socket *sock = sk->sk_socket;
4421 struct inode_security_struct *isec = SOCK_INODE(sock)->i_security;
4423 if (skb->len < NLMSG_SPACE(0)) {
4427 nlh = nlmsg_hdr(skb);
4429 err = selinux_nlmsg_lookup(isec->sclass, nlh->nlmsg_type, &perm);
4431 if (err == -EINVAL) {
4432 audit_log(current->audit_context, GFP_KERNEL, AUDIT_SELINUX_ERR,
4433 "SELinux: unrecognized netlink message"
4434 " type=%hu for sclass=%hu\n",
4435 nlh->nlmsg_type, isec->sclass);
4436 if (!selinux_enforcing || security_get_allow_unknown())
4446 err = socket_has_perm(current, sock, perm);
4451 #ifdef CONFIG_NETFILTER
4453 static unsigned int selinux_ip_forward(struct sk_buff *skb, int ifindex,
4459 struct common_audit_data ad;
4464 if (!selinux_policycap_netpeer)
4467 secmark_active = selinux_secmark_enabled();
4468 netlbl_active = netlbl_enabled();
4469 peerlbl_active = netlbl_active || selinux_xfrm_enabled();
4470 if (!secmark_active && !peerlbl_active)
4473 if (selinux_skb_peerlbl_sid(skb, family, &peer_sid) != 0)
4476 COMMON_AUDIT_DATA_INIT(&ad, NET);
4477 ad.u.net.netif = ifindex;
4478 ad.u.net.family = family;
4479 if (selinux_parse_skb(skb, &ad, &addrp, 1, NULL) != 0)
4482 if (peerlbl_active) {
4483 err = selinux_inet_sys_rcv_skb(ifindex, addrp, family,
4486 selinux_netlbl_err(skb, err, 1);
4492 if (avc_has_perm(peer_sid, skb->secmark,
4493 SECCLASS_PACKET, PACKET__FORWARD_IN, &ad))
4497 /* we do this in the FORWARD path and not the POST_ROUTING
4498 * path because we want to make sure we apply the necessary
4499 * labeling before IPsec is applied so we can leverage AH
4501 if (selinux_netlbl_skbuff_setsid(skb, family, peer_sid) != 0)
4507 static unsigned int selinux_ipv4_forward(unsigned int hooknum,
4508 struct sk_buff *skb,
4509 const struct net_device *in,
4510 const struct net_device *out,
4511 int (*okfn)(struct sk_buff *))
4513 return selinux_ip_forward(skb, in->ifindex, PF_INET);
4516 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
4517 static unsigned int selinux_ipv6_forward(unsigned int hooknum,
4518 struct sk_buff *skb,
4519 const struct net_device *in,
4520 const struct net_device *out,
4521 int (*okfn)(struct sk_buff *))
4523 return selinux_ip_forward(skb, in->ifindex, PF_INET6);
4527 static unsigned int selinux_ip_output(struct sk_buff *skb,
4532 if (!netlbl_enabled())
4535 /* we do this in the LOCAL_OUT path and not the POST_ROUTING path
4536 * because we want to make sure we apply the necessary labeling
4537 * before IPsec is applied so we can leverage AH protection */
4539 struct sk_security_struct *sksec = skb->sk->sk_security;
4542 sid = SECINITSID_KERNEL;
4543 if (selinux_netlbl_skbuff_setsid(skb, family, sid) != 0)
4549 static unsigned int selinux_ipv4_output(unsigned int hooknum,
4550 struct sk_buff *skb,
4551 const struct net_device *in,
4552 const struct net_device *out,
4553 int (*okfn)(struct sk_buff *))
4555 return selinux_ip_output(skb, PF_INET);
4558 static unsigned int selinux_ip_postroute_compat(struct sk_buff *skb,
4562 struct sock *sk = skb->sk;
4563 struct sk_security_struct *sksec;
4564 struct common_audit_data ad;
4570 sksec = sk->sk_security;
4572 COMMON_AUDIT_DATA_INIT(&ad, NET);
4573 ad.u.net.netif = ifindex;
4574 ad.u.net.family = family;
4575 if (selinux_parse_skb(skb, &ad, &addrp, 0, &proto))
4578 if (selinux_secmark_enabled())
4579 if (avc_has_perm(sksec->sid, skb->secmark,
4580 SECCLASS_PACKET, PACKET__SEND, &ad))
4583 if (selinux_policycap_netpeer)
4584 if (selinux_xfrm_postroute_last(sksec->sid, skb, &ad, proto))
4590 static unsigned int selinux_ip_postroute(struct sk_buff *skb, int ifindex,
4596 struct common_audit_data ad;
4601 /* If any sort of compatibility mode is enabled then handoff processing
4602 * to the selinux_ip_postroute_compat() function to deal with the
4603 * special handling. We do this in an attempt to keep this function
4604 * as fast and as clean as possible. */
4605 if (!selinux_policycap_netpeer)
4606 return selinux_ip_postroute_compat(skb, ifindex, family);
4608 /* If skb->dst->xfrm is non-NULL then the packet is undergoing an IPsec
4609 * packet transformation so allow the packet to pass without any checks
4610 * since we'll have another chance to perform access control checks
4611 * when the packet is on it's final way out.
4612 * NOTE: there appear to be some IPv6 multicast cases where skb->dst
4613 * is NULL, in this case go ahead and apply access control. */
4614 if (skb_dst(skb) != NULL && skb_dst(skb)->xfrm != NULL)
4617 secmark_active = selinux_secmark_enabled();
4618 peerlbl_active = netlbl_enabled() || selinux_xfrm_enabled();
4619 if (!secmark_active && !peerlbl_active)
4622 /* if the packet is being forwarded then get the peer label from the
4623 * packet itself; otherwise check to see if it is from a local
4624 * application or the kernel, if from an application get the peer label
4625 * from the sending socket, otherwise use the kernel's sid */
4630 if (IPCB(skb)->flags & IPSKB_FORWARDED)
4631 secmark_perm = PACKET__FORWARD_OUT;
4633 secmark_perm = PACKET__SEND;
4636 if (IP6CB(skb)->flags & IP6SKB_FORWARDED)
4637 secmark_perm = PACKET__FORWARD_OUT;
4639 secmark_perm = PACKET__SEND;
4644 if (secmark_perm == PACKET__FORWARD_OUT) {
4645 if (selinux_skb_peerlbl_sid(skb, family, &peer_sid))
4648 peer_sid = SECINITSID_KERNEL;
4650 struct sk_security_struct *sksec = sk->sk_security;
4651 peer_sid = sksec->sid;
4652 secmark_perm = PACKET__SEND;
4655 COMMON_AUDIT_DATA_INIT(&ad, NET);
4656 ad.u.net.netif = ifindex;
4657 ad.u.net.family = family;
4658 if (selinux_parse_skb(skb, &ad, &addrp, 0, NULL))
4662 if (avc_has_perm(peer_sid, skb->secmark,
4663 SECCLASS_PACKET, secmark_perm, &ad))
4666 if (peerlbl_active) {
4670 if (sel_netif_sid(ifindex, &if_sid))
4672 if (avc_has_perm(peer_sid, if_sid,
4673 SECCLASS_NETIF, NETIF__EGRESS, &ad))
4676 if (sel_netnode_sid(addrp, family, &node_sid))
4678 if (avc_has_perm(peer_sid, node_sid,
4679 SECCLASS_NODE, NODE__SENDTO, &ad))
4686 static unsigned int selinux_ipv4_postroute(unsigned int hooknum,
4687 struct sk_buff *skb,
4688 const struct net_device *in,
4689 const struct net_device *out,
4690 int (*okfn)(struct sk_buff *))
4692 return selinux_ip_postroute(skb, out->ifindex, PF_INET);
4695 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
4696 static unsigned int selinux_ipv6_postroute(unsigned int hooknum,
4697 struct sk_buff *skb,
4698 const struct net_device *in,
4699 const struct net_device *out,
4700 int (*okfn)(struct sk_buff *))
4702 return selinux_ip_postroute(skb, out->ifindex, PF_INET6);
4706 #endif /* CONFIG_NETFILTER */
4708 static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb)
4712 err = cap_netlink_send(sk, skb);
4716 return selinux_nlmsg_perm(sk, skb);
4719 static int selinux_netlink_recv(struct sk_buff *skb, int capability)
4722 struct common_audit_data ad;
4724 err = cap_netlink_recv(skb, capability);
4728 COMMON_AUDIT_DATA_INIT(&ad, CAP);
4729 ad.u.cap = capability;
4731 return avc_has_perm(NETLINK_CB(skb).sid, NETLINK_CB(skb).sid,
4732 SECCLASS_CAPABILITY, CAP_TO_MASK(capability), &ad);
4735 static int ipc_alloc_security(struct task_struct *task,
4736 struct kern_ipc_perm *perm,
4739 struct ipc_security_struct *isec;
4742 isec = kzalloc(sizeof(struct ipc_security_struct), GFP_KERNEL);
4746 sid = task_sid(task);
4747 isec->sclass = sclass;
4749 perm->security = isec;
4754 static void ipc_free_security(struct kern_ipc_perm *perm)
4756 struct ipc_security_struct *isec = perm->security;
4757 perm->security = NULL;
4761 static int msg_msg_alloc_security(struct msg_msg *msg)
4763 struct msg_security_struct *msec;
4765 msec = kzalloc(sizeof(struct msg_security_struct), GFP_KERNEL);
4769 msec->sid = SECINITSID_UNLABELED;
4770 msg->security = msec;
4775 static void msg_msg_free_security(struct msg_msg *msg)
4777 struct msg_security_struct *msec = msg->security;
4779 msg->security = NULL;
4783 static int ipc_has_perm(struct kern_ipc_perm *ipc_perms,
4786 struct ipc_security_struct *isec;
4787 struct common_audit_data ad;
4788 u32 sid = current_sid();
4790 isec = ipc_perms->security;
4792 COMMON_AUDIT_DATA_INIT(&ad, IPC);
4793 ad.u.ipc_id = ipc_perms->key;
4795 return avc_has_perm(sid, isec->sid, isec->sclass, perms, &ad);
4798 static int selinux_msg_msg_alloc_security(struct msg_msg *msg)
4800 return msg_msg_alloc_security(msg);
4803 static void selinux_msg_msg_free_security(struct msg_msg *msg)
4805 msg_msg_free_security(msg);
4808 /* message queue security operations */
4809 static int selinux_msg_queue_alloc_security(struct msg_queue *msq)
4811 struct ipc_security_struct *isec;
4812 struct common_audit_data ad;
4813 u32 sid = current_sid();
4816 rc = ipc_alloc_security(current, &msq->q_perm, SECCLASS_MSGQ);
4820 isec = msq->q_perm.security;
4822 COMMON_AUDIT_DATA_INIT(&ad, IPC);
4823 ad.u.ipc_id = msq->q_perm.key;
4825 rc = avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
4828 ipc_free_security(&msq->q_perm);
4834 static void selinux_msg_queue_free_security(struct msg_queue *msq)
4836 ipc_free_security(&msq->q_perm);
4839 static int selinux_msg_queue_associate(struct msg_queue *msq, int msqflg)
4841 struct ipc_security_struct *isec;
4842 struct common_audit_data ad;
4843 u32 sid = current_sid();
4845 isec = msq->q_perm.security;
4847 COMMON_AUDIT_DATA_INIT(&ad, IPC);
4848 ad.u.ipc_id = msq->q_perm.key;
4850 return avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
4851 MSGQ__ASSOCIATE, &ad);
4854 static int selinux_msg_queue_msgctl(struct msg_queue *msq, int cmd)
4862 /* No specific object, just general system-wide information. */
4863 return task_has_system(current, SYSTEM__IPC_INFO);
4866 perms = MSGQ__GETATTR | MSGQ__ASSOCIATE;
4869 perms = MSGQ__SETATTR;
4872 perms = MSGQ__DESTROY;
4878 err = ipc_has_perm(&msq->q_perm, perms);
4882 static int selinux_msg_queue_msgsnd(struct msg_queue *msq, struct msg_msg *msg, int msqflg)
4884 struct ipc_security_struct *isec;
4885 struct msg_security_struct *msec;
4886 struct common_audit_data ad;
4887 u32 sid = current_sid();
4890 isec = msq->q_perm.security;
4891 msec = msg->security;
4894 * First time through, need to assign label to the message
4896 if (msec->sid == SECINITSID_UNLABELED) {
4898 * Compute new sid based on current process and
4899 * message queue this message will be stored in
4901 rc = security_transition_sid(sid, isec->sid, SECCLASS_MSG,
4907 COMMON_AUDIT_DATA_INIT(&ad, IPC);
4908 ad.u.ipc_id = msq->q_perm.key;
4910 /* Can this process write to the queue? */
4911 rc = avc_has_perm(sid, isec->sid, SECCLASS_MSGQ,
4914 /* Can this process send the message */
4915 rc = avc_has_perm(sid, msec->sid, SECCLASS_MSG,
4918 /* Can the message be put in the queue? */
4919 rc = avc_has_perm(msec->sid, isec->sid, SECCLASS_MSGQ,
4920 MSGQ__ENQUEUE, &ad);
4925 static int selinux_msg_queue_msgrcv(struct msg_queue *msq, struct msg_msg *msg,
4926 struct task_struct *target,
4927 long type, int mode)
4929 struct ipc_security_struct *isec;
4930 struct msg_security_struct *msec;
4931 struct common_audit_data ad;
4932 u32 sid = task_sid(target);
4935 isec = msq->q_perm.security;
4936 msec = msg->security;
4938 COMMON_AUDIT_DATA_INIT(&ad, IPC);
4939 ad.u.ipc_id = msq->q_perm.key;
4941 rc = avc_has_perm(sid, isec->sid,
4942 SECCLASS_MSGQ, MSGQ__READ, &ad);
4944 rc = avc_has_perm(sid, msec->sid,
4945 SECCLASS_MSG, MSG__RECEIVE, &ad);
4949 /* Shared Memory security operations */
4950 static int selinux_shm_alloc_security(struct shmid_kernel *shp)
4952 struct ipc_security_struct *isec;
4953 struct common_audit_data ad;
4954 u32 sid = current_sid();
4957 rc = ipc_alloc_security(current, &shp->shm_perm, SECCLASS_SHM);
4961 isec = shp->shm_perm.security;
4963 COMMON_AUDIT_DATA_INIT(&ad, IPC);
4964 ad.u.ipc_id = shp->shm_perm.key;
4966 rc = avc_has_perm(sid, isec->sid, SECCLASS_SHM,
4969 ipc_free_security(&shp->shm_perm);
4975 static void selinux_shm_free_security(struct shmid_kernel *shp)
4977 ipc_free_security(&shp->shm_perm);
4980 static int selinux_shm_associate(struct shmid_kernel *shp, int shmflg)
4982 struct ipc_security_struct *isec;
4983 struct common_audit_data ad;
4984 u32 sid = current_sid();
4986 isec = shp->shm_perm.security;
4988 COMMON_AUDIT_DATA_INIT(&ad, IPC);
4989 ad.u.ipc_id = shp->shm_perm.key;
4991 return avc_has_perm(sid, isec->sid, SECCLASS_SHM,
4992 SHM__ASSOCIATE, &ad);
4995 /* Note, at this point, shp is locked down */
4996 static int selinux_shm_shmctl(struct shmid_kernel *shp, int cmd)
5004 /* No specific object, just general system-wide information. */
5005 return task_has_system(current, SYSTEM__IPC_INFO);
5008 perms = SHM__GETATTR | SHM__ASSOCIATE;
5011 perms = SHM__SETATTR;
5018 perms = SHM__DESTROY;
5024 err = ipc_has_perm(&shp->shm_perm, perms);
5028 static int selinux_shm_shmat(struct shmid_kernel *shp,
5029 char __user *shmaddr, int shmflg)
5033 if (shmflg & SHM_RDONLY)
5036 perms = SHM__READ | SHM__WRITE;
5038 return ipc_has_perm(&shp->shm_perm, perms);
5041 /* Semaphore security operations */
5042 static int selinux_sem_alloc_security(struct sem_array *sma)
5044 struct ipc_security_struct *isec;
5045 struct common_audit_data ad;
5046 u32 sid = current_sid();
5049 rc = ipc_alloc_security(current, &sma->sem_perm, SECCLASS_SEM);
5053 isec = sma->sem_perm.security;
5055 COMMON_AUDIT_DATA_INIT(&ad, IPC);
5056 ad.u.ipc_id = sma->sem_perm.key;
5058 rc = avc_has_perm(sid, isec->sid, SECCLASS_SEM,
5061 ipc_free_security(&sma->sem_perm);
5067 static void selinux_sem_free_security(struct sem_array *sma)
5069 ipc_free_security(&sma->sem_perm);
5072 static int selinux_sem_associate(struct sem_array *sma, int semflg)
5074 struct ipc_security_struct *isec;
5075 struct common_audit_data ad;
5076 u32 sid = current_sid();
5078 isec = sma->sem_perm.security;
5080 COMMON_AUDIT_DATA_INIT(&ad, IPC);
5081 ad.u.ipc_id = sma->sem_perm.key;
5083 return avc_has_perm(sid, isec->sid, SECCLASS_SEM,
5084 SEM__ASSOCIATE, &ad);
5087 /* Note, at this point, sma is locked down */
5088 static int selinux_sem_semctl(struct sem_array *sma, int cmd)
5096 /* No specific object, just general system-wide information. */
5097 return task_has_system(current, SYSTEM__IPC_INFO);
5101 perms = SEM__GETATTR;
5112 perms = SEM__DESTROY;
5115 perms = SEM__SETATTR;
5119 perms = SEM__GETATTR | SEM__ASSOCIATE;
5125 err = ipc_has_perm(&sma->sem_perm, perms);
5129 static int selinux_sem_semop(struct sem_array *sma,
5130 struct sembuf *sops, unsigned nsops, int alter)
5135 perms = SEM__READ | SEM__WRITE;
5139 return ipc_has_perm(&sma->sem_perm, perms);
5142 static int selinux_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
5148 av |= IPC__UNIX_READ;
5150 av |= IPC__UNIX_WRITE;
5155 return ipc_has_perm(ipcp, av);
5158 static void selinux_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
5160 struct ipc_security_struct *isec = ipcp->security;
5164 static void selinux_d_instantiate(struct dentry *dentry, struct inode *inode)
5167 inode_doinit_with_dentry(inode, dentry);
5170 static int selinux_getprocattr(struct task_struct *p,
5171 char *name, char **value)
5173 const struct task_security_struct *__tsec;
5179 error = current_has_perm(p, PROCESS__GETATTR);
5185 __tsec = __task_cred(p)->security;
5187 if (!strcmp(name, "current"))
5189 else if (!strcmp(name, "prev"))
5191 else if (!strcmp(name, "exec"))
5192 sid = __tsec->exec_sid;
5193 else if (!strcmp(name, "fscreate"))
5194 sid = __tsec->create_sid;
5195 else if (!strcmp(name, "keycreate"))
5196 sid = __tsec->keycreate_sid;
5197 else if (!strcmp(name, "sockcreate"))
5198 sid = __tsec->sockcreate_sid;
5206 error = security_sid_to_context(sid, value, &len);
5216 static int selinux_setprocattr(struct task_struct *p,
5217 char *name, void *value, size_t size)
5219 struct task_security_struct *tsec;
5220 struct task_struct *tracer;
5227 /* SELinux only allows a process to change its own
5228 security attributes. */
5233 * Basic control over ability to set these attributes at all.
5234 * current == p, but we'll pass them separately in case the
5235 * above restriction is ever removed.
5237 if (!strcmp(name, "exec"))
5238 error = current_has_perm(p, PROCESS__SETEXEC);
5239 else if (!strcmp(name, "fscreate"))
5240 error = current_has_perm(p, PROCESS__SETFSCREATE);
5241 else if (!strcmp(name, "keycreate"))
5242 error = current_has_perm(p, PROCESS__SETKEYCREATE);
5243 else if (!strcmp(name, "sockcreate"))
5244 error = current_has_perm(p, PROCESS__SETSOCKCREATE);
5245 else if (!strcmp(name, "current"))
5246 error = current_has_perm(p, PROCESS__SETCURRENT);
5252 /* Obtain a SID for the context, if one was specified. */
5253 if (size && str[1] && str[1] != '\n') {
5254 if (str[size-1] == '\n') {
5258 error = security_context_to_sid(value, size, &sid);
5259 if (error == -EINVAL && !strcmp(name, "fscreate")) {
5260 if (!capable(CAP_MAC_ADMIN))
5262 error = security_context_to_sid_force(value, size,
5269 new = prepare_creds();
5273 /* Permission checking based on the specified context is
5274 performed during the actual operation (execve,
5275 open/mkdir/...), when we know the full context of the
5276 operation. See selinux_bprm_set_creds for the execve
5277 checks and may_create for the file creation checks. The
5278 operation will then fail if the context is not permitted. */
5279 tsec = new->security;
5280 if (!strcmp(name, "exec")) {
5281 tsec->exec_sid = sid;
5282 } else if (!strcmp(name, "fscreate")) {
5283 tsec->create_sid = sid;
5284 } else if (!strcmp(name, "keycreate")) {
5285 error = may_create_key(sid, p);
5288 tsec->keycreate_sid = sid;
5289 } else if (!strcmp(name, "sockcreate")) {
5290 tsec->sockcreate_sid = sid;
5291 } else if (!strcmp(name, "current")) {
5296 /* Only allow single threaded processes to change context */
5298 if (!current_is_single_threaded()) {
5299 error = security_bounded_transition(tsec->sid, sid);
5304 /* Check permissions for the transition. */
5305 error = avc_has_perm(tsec->sid, sid, SECCLASS_PROCESS,
5306 PROCESS__DYNTRANSITION, NULL);
5310 /* Check for ptracing, and update the task SID if ok.
5311 Otherwise, leave SID unchanged and fail. */
5314 tracer = tracehook_tracer_task(p);
5316 ptsid = task_sid(tracer);
5320 error = avc_has_perm(ptsid, sid, SECCLASS_PROCESS,
5321 PROCESS__PTRACE, NULL);
5340 static int selinux_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
5342 return security_sid_to_context(secid, secdata, seclen);
5345 static int selinux_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid)
5347 return security_context_to_sid(secdata, seclen, secid);
5350 static void selinux_release_secctx(char *secdata, u32 seclen)
5356 * called with inode->i_mutex locked
5358 static int selinux_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen)
5360 return selinux_inode_setsecurity(inode, XATTR_SELINUX_SUFFIX, ctx, ctxlen, 0);
5364 * called with inode->i_mutex locked
5366 static int selinux_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen)
5368 return __vfs_setxattr_noperm(dentry, XATTR_NAME_SELINUX, ctx, ctxlen, 0);
5371 static int selinux_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen)
5374 len = selinux_inode_getsecurity(inode, XATTR_SELINUX_SUFFIX,
5383 static int selinux_key_alloc(struct key *k, const struct cred *cred,
5384 unsigned long flags)
5386 const struct task_security_struct *tsec;
5387 struct key_security_struct *ksec;
5389 ksec = kzalloc(sizeof(struct key_security_struct), GFP_KERNEL);
5393 tsec = cred->security;
5394 if (tsec->keycreate_sid)
5395 ksec->sid = tsec->keycreate_sid;
5397 ksec->sid = tsec->sid;
5403 static void selinux_key_free(struct key *k)
5405 struct key_security_struct *ksec = k->security;
5411 static int selinux_key_permission(key_ref_t key_ref,
5412 const struct cred *cred,
5416 struct key_security_struct *ksec;
5419 /* if no specific permissions are requested, we skip the
5420 permission check. No serious, additional covert channels
5421 appear to be created. */
5425 sid = cred_sid(cred);
5427 key = key_ref_to_ptr(key_ref);
5428 ksec = key->security;
5430 return avc_has_perm(sid, ksec->sid, SECCLASS_KEY, perm, NULL);
5433 static int selinux_key_getsecurity(struct key *key, char **_buffer)
5435 struct key_security_struct *ksec = key->security;
5436 char *context = NULL;
5440 rc = security_sid_to_context(ksec->sid, &context, &len);
5449 static struct security_operations selinux_ops = {
5452 .ptrace_access_check = selinux_ptrace_access_check,
5453 .ptrace_traceme = selinux_ptrace_traceme,
5454 .capget = selinux_capget,
5455 .capset = selinux_capset,
5456 .sysctl = selinux_sysctl,
5457 .capable = selinux_capable,
5458 .quotactl = selinux_quotactl,
5459 .quota_on = selinux_quota_on,
5460 .syslog = selinux_syslog,
5461 .vm_enough_memory = selinux_vm_enough_memory,
5463 .netlink_send = selinux_netlink_send,
5464 .netlink_recv = selinux_netlink_recv,
5466 .bprm_set_creds = selinux_bprm_set_creds,
5467 .bprm_committing_creds = selinux_bprm_committing_creds,
5468 .bprm_committed_creds = selinux_bprm_committed_creds,
5469 .bprm_secureexec = selinux_bprm_secureexec,
5471 .sb_alloc_security = selinux_sb_alloc_security,
5472 .sb_free_security = selinux_sb_free_security,
5473 .sb_copy_data = selinux_sb_copy_data,
5474 .sb_kern_mount = selinux_sb_kern_mount,
5475 .sb_show_options = selinux_sb_show_options,
5476 .sb_statfs = selinux_sb_statfs,
5477 .sb_mount = selinux_mount,
5478 .sb_umount = selinux_umount,
5479 .sb_set_mnt_opts = selinux_set_mnt_opts,
5480 .sb_clone_mnt_opts = selinux_sb_clone_mnt_opts,
5481 .sb_parse_opts_str = selinux_parse_opts_str,
5484 .inode_alloc_security = selinux_inode_alloc_security,
5485 .inode_free_security = selinux_inode_free_security,
5486 .inode_init_security = selinux_inode_init_security,
5487 .inode_create = selinux_inode_create,
5488 .inode_link = selinux_inode_link,
5489 .inode_unlink = selinux_inode_unlink,
5490 .inode_symlink = selinux_inode_symlink,
5491 .inode_mkdir = selinux_inode_mkdir,
5492 .inode_rmdir = selinux_inode_rmdir,
5493 .inode_mknod = selinux_inode_mknod,
5494 .inode_rename = selinux_inode_rename,
5495 .inode_readlink = selinux_inode_readlink,
5496 .inode_follow_link = selinux_inode_follow_link,
5497 .inode_permission = selinux_inode_permission,
5498 .inode_setattr = selinux_inode_setattr,
5499 .inode_getattr = selinux_inode_getattr,
5500 .inode_setxattr = selinux_inode_setxattr,
5501 .inode_post_setxattr = selinux_inode_post_setxattr,
5502 .inode_getxattr = selinux_inode_getxattr,
5503 .inode_listxattr = selinux_inode_listxattr,
5504 .inode_removexattr = selinux_inode_removexattr,
5505 .inode_getsecurity = selinux_inode_getsecurity,
5506 .inode_setsecurity = selinux_inode_setsecurity,
5507 .inode_listsecurity = selinux_inode_listsecurity,
5508 .inode_getsecid = selinux_inode_getsecid,
5510 .file_permission = selinux_file_permission,
5511 .file_alloc_security = selinux_file_alloc_security,
5512 .file_free_security = selinux_file_free_security,
5513 .file_ioctl = selinux_file_ioctl,
5514 .file_mmap = selinux_file_mmap,
5515 .file_mprotect = selinux_file_mprotect,
5516 .file_lock = selinux_file_lock,
5517 .file_fcntl = selinux_file_fcntl,
5518 .file_set_fowner = selinux_file_set_fowner,
5519 .file_send_sigiotask = selinux_file_send_sigiotask,
5520 .file_receive = selinux_file_receive,
5522 .dentry_open = selinux_dentry_open,
5524 .task_create = selinux_task_create,
5525 .cred_alloc_blank = selinux_cred_alloc_blank,
5526 .cred_free = selinux_cred_free,
5527 .cred_prepare = selinux_cred_prepare,
5528 .cred_transfer = selinux_cred_transfer,
5529 .kernel_act_as = selinux_kernel_act_as,
5530 .kernel_create_files_as = selinux_kernel_create_files_as,
5531 .kernel_module_request = selinux_kernel_module_request,
5532 .task_setpgid = selinux_task_setpgid,
5533 .task_getpgid = selinux_task_getpgid,
5534 .task_getsid = selinux_task_getsid,
5535 .task_getsecid = selinux_task_getsecid,
5536 .task_setnice = selinux_task_setnice,
5537 .task_setioprio = selinux_task_setioprio,
5538 .task_getioprio = selinux_task_getioprio,
5539 .task_setrlimit = selinux_task_setrlimit,
5540 .task_setscheduler = selinux_task_setscheduler,
5541 .task_getscheduler = selinux_task_getscheduler,
5542 .task_movememory = selinux_task_movememory,
5543 .task_kill = selinux_task_kill,
5544 .task_wait = selinux_task_wait,
5545 .task_to_inode = selinux_task_to_inode,
5547 .ipc_permission = selinux_ipc_permission,
5548 .ipc_getsecid = selinux_ipc_getsecid,
5550 .msg_msg_alloc_security = selinux_msg_msg_alloc_security,
5551 .msg_msg_free_security = selinux_msg_msg_free_security,
5553 .msg_queue_alloc_security = selinux_msg_queue_alloc_security,
5554 .msg_queue_free_security = selinux_msg_queue_free_security,
5555 .msg_queue_associate = selinux_msg_queue_associate,
5556 .msg_queue_msgctl = selinux_msg_queue_msgctl,
5557 .msg_queue_msgsnd = selinux_msg_queue_msgsnd,
5558 .msg_queue_msgrcv = selinux_msg_queue_msgrcv,
5560 .shm_alloc_security = selinux_shm_alloc_security,
5561 .shm_free_security = selinux_shm_free_security,
5562 .shm_associate = selinux_shm_associate,
5563 .shm_shmctl = selinux_shm_shmctl,
5564 .shm_shmat = selinux_shm_shmat,
5566 .sem_alloc_security = selinux_sem_alloc_security,
5567 .sem_free_security = selinux_sem_free_security,
5568 .sem_associate = selinux_sem_associate,
5569 .sem_semctl = selinux_sem_semctl,
5570 .sem_semop = selinux_sem_semop,
5572 .d_instantiate = selinux_d_instantiate,
5574 .getprocattr = selinux_getprocattr,
5575 .setprocattr = selinux_setprocattr,
5577 .secid_to_secctx = selinux_secid_to_secctx,
5578 .secctx_to_secid = selinux_secctx_to_secid,
5579 .release_secctx = selinux_release_secctx,
5580 .inode_notifysecctx = selinux_inode_notifysecctx,
5581 .inode_setsecctx = selinux_inode_setsecctx,
5582 .inode_getsecctx = selinux_inode_getsecctx,
5584 .unix_stream_connect = selinux_socket_unix_stream_connect,
5585 .unix_may_send = selinux_socket_unix_may_send,
5587 .socket_create = selinux_socket_create,
5588 .socket_post_create = selinux_socket_post_create,
5589 .socket_bind = selinux_socket_bind,
5590 .socket_connect = selinux_socket_connect,
5591 .socket_listen = selinux_socket_listen,
5592 .socket_accept = selinux_socket_accept,
5593 .socket_sendmsg = selinux_socket_sendmsg,
5594 .socket_recvmsg = selinux_socket_recvmsg,
5595 .socket_getsockname = selinux_socket_getsockname,
5596 .socket_getpeername = selinux_socket_getpeername,
5597 .socket_getsockopt = selinux_socket_getsockopt,
5598 .socket_setsockopt = selinux_socket_setsockopt,
5599 .socket_shutdown = selinux_socket_shutdown,
5600 .socket_sock_rcv_skb = selinux_socket_sock_rcv_skb,
5601 .socket_getpeersec_stream = selinux_socket_getpeersec_stream,
5602 .socket_getpeersec_dgram = selinux_socket_getpeersec_dgram,
5603 .sk_alloc_security = selinux_sk_alloc_security,
5604 .sk_free_security = selinux_sk_free_security,
5605 .sk_clone_security = selinux_sk_clone_security,
5606 .sk_getsecid = selinux_sk_getsecid,
5607 .sock_graft = selinux_sock_graft,
5608 .inet_conn_request = selinux_inet_conn_request,
5609 .inet_csk_clone = selinux_inet_csk_clone,
5610 .inet_conn_established = selinux_inet_conn_established,
5611 .req_classify_flow = selinux_req_classify_flow,
5612 .tun_dev_create = selinux_tun_dev_create,
5613 .tun_dev_post_create = selinux_tun_dev_post_create,
5614 .tun_dev_attach = selinux_tun_dev_attach,
5616 #ifdef CONFIG_SECURITY_NETWORK_XFRM
5617 .xfrm_policy_alloc_security = selinux_xfrm_policy_alloc,
5618 .xfrm_policy_clone_security = selinux_xfrm_policy_clone,
5619 .xfrm_policy_free_security = selinux_xfrm_policy_free,
5620 .xfrm_policy_delete_security = selinux_xfrm_policy_delete,
5621 .xfrm_state_alloc_security = selinux_xfrm_state_alloc,
5622 .xfrm_state_free_security = selinux_xfrm_state_free,
5623 .xfrm_state_delete_security = selinux_xfrm_state_delete,
5624 .xfrm_policy_lookup = selinux_xfrm_policy_lookup,
5625 .xfrm_state_pol_flow_match = selinux_xfrm_state_pol_flow_match,
5626 .xfrm_decode_session = selinux_xfrm_decode_session,
5630 .key_alloc = selinux_key_alloc,
5631 .key_free = selinux_key_free,
5632 .key_permission = selinux_key_permission,
5633 .key_getsecurity = selinux_key_getsecurity,
5637 .audit_rule_init = selinux_audit_rule_init,
5638 .audit_rule_known = selinux_audit_rule_known,
5639 .audit_rule_match = selinux_audit_rule_match,
5640 .audit_rule_free = selinux_audit_rule_free,
5644 static __init int selinux_init(void)
5646 if (!security_module_enable(&selinux_ops)) {
5647 selinux_enabled = 0;
5651 if (!selinux_enabled) {
5652 printk(KERN_INFO "SELinux: Disabled at boot.\n");
5656 printk(KERN_INFO "SELinux: Initializing.\n");
5658 /* Set the security state for the initial task. */
5659 cred_init_security();
5661 sel_inode_cache = kmem_cache_create("selinux_inode_security",
5662 sizeof(struct inode_security_struct),
5663 0, SLAB_PANIC, NULL);
5666 secondary_ops = security_ops;
5668 panic("SELinux: No initial security operations\n");
5669 if (register_security(&selinux_ops))
5670 panic("SELinux: Unable to register with kernel.\n");
5672 if (selinux_enforcing)
5673 printk(KERN_DEBUG "SELinux: Starting in enforcing mode\n");
5675 printk(KERN_DEBUG "SELinux: Starting in permissive mode\n");
5680 void selinux_complete_init(void)
5682 printk(KERN_DEBUG "SELinux: Completing initialization.\n");
5684 /* Set up any superblocks initialized prior to the policy load. */
5685 printk(KERN_DEBUG "SELinux: Setting up existing superblocks.\n");
5686 spin_lock(&sb_lock);
5687 spin_lock(&sb_security_lock);
5689 if (!list_empty(&superblock_security_head)) {
5690 struct superblock_security_struct *sbsec =
5691 list_entry(superblock_security_head.next,
5692 struct superblock_security_struct,
5694 struct super_block *sb = sbsec->sb;
5696 spin_unlock(&sb_security_lock);
5697 spin_unlock(&sb_lock);
5698 down_read(&sb->s_umount);
5700 superblock_doinit(sb, NULL);
5702 spin_lock(&sb_lock);
5703 spin_lock(&sb_security_lock);
5704 list_del_init(&sbsec->list);
5707 spin_unlock(&sb_security_lock);
5708 spin_unlock(&sb_lock);
5711 /* SELinux requires early initialization in order to label
5712 all processes and objects when they are created. */
5713 security_initcall(selinux_init);
5715 #if defined(CONFIG_NETFILTER)
5717 static struct nf_hook_ops selinux_ipv4_ops[] = {
5719 .hook = selinux_ipv4_postroute,
5720 .owner = THIS_MODULE,
5722 .hooknum = NF_INET_POST_ROUTING,
5723 .priority = NF_IP_PRI_SELINUX_LAST,
5726 .hook = selinux_ipv4_forward,
5727 .owner = THIS_MODULE,
5729 .hooknum = NF_INET_FORWARD,
5730 .priority = NF_IP_PRI_SELINUX_FIRST,
5733 .hook = selinux_ipv4_output,
5734 .owner = THIS_MODULE,
5736 .hooknum = NF_INET_LOCAL_OUT,
5737 .priority = NF_IP_PRI_SELINUX_FIRST,
5741 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
5743 static struct nf_hook_ops selinux_ipv6_ops[] = {
5745 .hook = selinux_ipv6_postroute,
5746 .owner = THIS_MODULE,
5748 .hooknum = NF_INET_POST_ROUTING,
5749 .priority = NF_IP6_PRI_SELINUX_LAST,
5752 .hook = selinux_ipv6_forward,
5753 .owner = THIS_MODULE,
5755 .hooknum = NF_INET_FORWARD,
5756 .priority = NF_IP6_PRI_SELINUX_FIRST,
5762 static int __init selinux_nf_ip_init(void)
5766 if (!selinux_enabled)
5769 printk(KERN_DEBUG "SELinux: Registering netfilter hooks\n");
5771 err = nf_register_hooks(selinux_ipv4_ops, ARRAY_SIZE(selinux_ipv4_ops));
5773 panic("SELinux: nf_register_hooks for IPv4: error %d\n", err);
5775 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
5776 err = nf_register_hooks(selinux_ipv6_ops, ARRAY_SIZE(selinux_ipv6_ops));
5778 panic("SELinux: nf_register_hooks for IPv6: error %d\n", err);
5785 __initcall(selinux_nf_ip_init);
5787 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
5788 static void selinux_nf_ip_exit(void)
5790 printk(KERN_DEBUG "SELinux: Unregistering netfilter hooks\n");
5792 nf_unregister_hooks(selinux_ipv4_ops, ARRAY_SIZE(selinux_ipv4_ops));
5793 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
5794 nf_unregister_hooks(selinux_ipv6_ops, ARRAY_SIZE(selinux_ipv6_ops));
5799 #else /* CONFIG_NETFILTER */
5801 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
5802 #define selinux_nf_ip_exit()
5805 #endif /* CONFIG_NETFILTER */
5807 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
5808 static int selinux_disabled;
5810 int selinux_disable(void)
5812 extern void exit_sel_fs(void);
5814 if (ss_initialized) {
5815 /* Not permitted after initial policy load. */
5819 if (selinux_disabled) {
5820 /* Only do this once. */
5824 printk(KERN_INFO "SELinux: Disabled at runtime.\n");
5826 selinux_disabled = 1;
5827 selinux_enabled = 0;
5829 /* Reset security_ops to the secondary module, dummy or capability. */
5830 security_ops = secondary_ops;
5832 /* Try to destroy the avc node cache */
5835 /* Unregister netfilter hooks. */
5836 selinux_nf_ip_exit();
5838 /* Unregister selinuxfs. */