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 Red Hat, Inc., James Morris <jmorris@redhat.com>
13 * Copyright (C) 2004-2005 Trusted Computer Solutions, Inc.
14 * <dgoeddel@trustedcs.com>
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License version 2,
18 * as published by the Free Software Foundation.
21 #include <linux/config.h>
22 #include <linux/module.h>
23 #include <linux/init.h>
24 #include <linux/kernel.h>
25 #include <linux/ptrace.h>
26 #include <linux/errno.h>
27 #include <linux/sched.h>
28 #include <linux/security.h>
29 #include <linux/xattr.h>
30 #include <linux/capability.h>
31 #include <linux/unistd.h>
33 #include <linux/mman.h>
34 #include <linux/slab.h>
35 #include <linux/pagemap.h>
36 #include <linux/swap.h>
37 #include <linux/smp_lock.h>
38 #include <linux/spinlock.h>
39 #include <linux/syscalls.h>
40 #include <linux/file.h>
41 #include <linux/namei.h>
42 #include <linux/mount.h>
43 #include <linux/ext2_fs.h>
44 #include <linux/proc_fs.h>
46 #include <linux/netfilter_ipv4.h>
47 #include <linux/netfilter_ipv6.h>
48 #include <linux/tty.h>
50 #include <net/ip.h> /* for sysctl_local_port_range[] */
51 #include <net/tcp.h> /* struct or_callable used in sock_rcv_skb */
52 #include <asm/uaccess.h>
53 #include <asm/semaphore.h>
54 #include <asm/ioctls.h>
55 #include <linux/bitops.h>
56 #include <linux/interrupt.h>
57 #include <linux/netdevice.h> /* for network interface checks */
58 #include <linux/netlink.h>
59 #include <linux/tcp.h>
60 #include <linux/udp.h>
61 #include <linux/quota.h>
62 #include <linux/un.h> /* for Unix socket types */
63 #include <net/af_unix.h> /* for Unix socket types */
64 #include <linux/parser.h>
65 #include <linux/nfs_mount.h>
67 #include <linux/hugetlb.h>
68 #include <linux/personality.h>
69 #include <linux/sysctl.h>
70 #include <linux/audit.h>
71 #include <linux/string.h>
77 #define XATTR_SELINUX_SUFFIX "selinux"
78 #define XATTR_NAME_SELINUX XATTR_SECURITY_PREFIX XATTR_SELINUX_SUFFIX
80 extern unsigned int policydb_loaded_version;
81 extern int selinux_nlmsg_lookup(u16 sclass, u16 nlmsg_type, u32 *perm);
83 #ifdef CONFIG_SECURITY_SELINUX_DEVELOP
84 int selinux_enforcing = 0;
86 static int __init enforcing_setup(char *str)
88 selinux_enforcing = simple_strtol(str,NULL,0);
91 __setup("enforcing=", enforcing_setup);
94 #ifdef CONFIG_SECURITY_SELINUX_BOOTPARAM
95 int selinux_enabled = CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE;
97 static int __init selinux_enabled_setup(char *str)
99 selinux_enabled = simple_strtol(str, NULL, 0);
102 __setup("selinux=", selinux_enabled_setup);
105 /* Original (dummy) security module. */
106 static struct security_operations *original_ops = NULL;
108 /* Minimal support for a secondary security module,
109 just to allow the use of the dummy or capability modules.
110 The owlsm module can alternatively be used as a secondary
111 module as long as CONFIG_OWLSM_FD is not enabled. */
112 static struct security_operations *secondary_ops = NULL;
114 /* Lists of inode and superblock security structures initialized
115 before the policy was loaded. */
116 static LIST_HEAD(superblock_security_head);
117 static DEFINE_SPINLOCK(sb_security_lock);
119 /* Allocate and free functions for each kind of security blob. */
121 static int task_alloc_security(struct task_struct *task)
123 struct task_security_struct *tsec;
125 tsec = kmalloc(sizeof(struct task_security_struct), GFP_KERNEL);
129 memset(tsec, 0, sizeof(struct task_security_struct));
130 tsec->magic = SELINUX_MAGIC;
132 tsec->osid = tsec->sid = tsec->ptrace_sid = SECINITSID_UNLABELED;
133 task->security = tsec;
138 static void task_free_security(struct task_struct *task)
140 struct task_security_struct *tsec = task->security;
142 if (!tsec || tsec->magic != SELINUX_MAGIC)
145 task->security = NULL;
149 static int inode_alloc_security(struct inode *inode)
151 struct task_security_struct *tsec = current->security;
152 struct inode_security_struct *isec;
154 isec = kmalloc(sizeof(struct inode_security_struct), GFP_KERNEL);
158 memset(isec, 0, sizeof(struct inode_security_struct));
159 init_MUTEX(&isec->sem);
160 INIT_LIST_HEAD(&isec->list);
161 isec->magic = SELINUX_MAGIC;
163 isec->sid = SECINITSID_UNLABELED;
164 isec->sclass = SECCLASS_FILE;
165 if (tsec && tsec->magic == SELINUX_MAGIC)
166 isec->task_sid = tsec->sid;
168 isec->task_sid = SECINITSID_UNLABELED;
169 inode->i_security = isec;
174 static void inode_free_security(struct inode *inode)
176 struct inode_security_struct *isec = inode->i_security;
177 struct superblock_security_struct *sbsec = inode->i_sb->s_security;
179 if (!isec || isec->magic != SELINUX_MAGIC)
182 spin_lock(&sbsec->isec_lock);
183 if (!list_empty(&isec->list))
184 list_del_init(&isec->list);
185 spin_unlock(&sbsec->isec_lock);
187 inode->i_security = NULL;
191 static int file_alloc_security(struct file *file)
193 struct task_security_struct *tsec = current->security;
194 struct file_security_struct *fsec;
196 fsec = kmalloc(sizeof(struct file_security_struct), GFP_ATOMIC);
200 memset(fsec, 0, sizeof(struct file_security_struct));
201 fsec->magic = SELINUX_MAGIC;
203 if (tsec && tsec->magic == SELINUX_MAGIC) {
204 fsec->sid = tsec->sid;
205 fsec->fown_sid = tsec->sid;
207 fsec->sid = SECINITSID_UNLABELED;
208 fsec->fown_sid = SECINITSID_UNLABELED;
210 file->f_security = fsec;
215 static void file_free_security(struct file *file)
217 struct file_security_struct *fsec = file->f_security;
219 if (!fsec || fsec->magic != SELINUX_MAGIC)
222 file->f_security = NULL;
226 static int superblock_alloc_security(struct super_block *sb)
228 struct superblock_security_struct *sbsec;
230 sbsec = kmalloc(sizeof(struct superblock_security_struct), GFP_KERNEL);
234 memset(sbsec, 0, sizeof(struct superblock_security_struct));
235 init_MUTEX(&sbsec->sem);
236 INIT_LIST_HEAD(&sbsec->list);
237 INIT_LIST_HEAD(&sbsec->isec_head);
238 spin_lock_init(&sbsec->isec_lock);
239 sbsec->magic = SELINUX_MAGIC;
241 sbsec->sid = SECINITSID_UNLABELED;
242 sbsec->def_sid = SECINITSID_FILE;
243 sb->s_security = sbsec;
248 static void superblock_free_security(struct super_block *sb)
250 struct superblock_security_struct *sbsec = sb->s_security;
252 if (!sbsec || sbsec->magic != SELINUX_MAGIC)
255 spin_lock(&sb_security_lock);
256 if (!list_empty(&sbsec->list))
257 list_del_init(&sbsec->list);
258 spin_unlock(&sb_security_lock);
260 sb->s_security = NULL;
264 #ifdef CONFIG_SECURITY_NETWORK
265 static int sk_alloc_security(struct sock *sk, int family, int priority)
267 struct sk_security_struct *ssec;
269 if (family != PF_UNIX)
272 ssec = kmalloc(sizeof(*ssec), priority);
276 memset(ssec, 0, sizeof(*ssec));
277 ssec->magic = SELINUX_MAGIC;
279 ssec->peer_sid = SECINITSID_UNLABELED;
280 sk->sk_security = ssec;
285 static void sk_free_security(struct sock *sk)
287 struct sk_security_struct *ssec = sk->sk_security;
289 if (sk->sk_family != PF_UNIX || ssec->magic != SELINUX_MAGIC)
292 sk->sk_security = NULL;
295 #endif /* CONFIG_SECURITY_NETWORK */
297 /* The security server must be initialized before
298 any labeling or access decisions can be provided. */
299 extern int ss_initialized;
301 /* The file system's label must be initialized prior to use. */
303 static char *labeling_behaviors[6] = {
305 "uses transition SIDs",
307 "uses genfs_contexts",
308 "not configured for labeling",
309 "uses mountpoint labeling",
312 static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry);
314 static inline int inode_doinit(struct inode *inode)
316 return inode_doinit_with_dentry(inode, NULL);
325 static match_table_t tokens = {
326 {Opt_context, "context=%s"},
327 {Opt_fscontext, "fscontext=%s"},
328 {Opt_defcontext, "defcontext=%s"},
331 #define SEL_MOUNT_FAIL_MSG "SELinux: duplicate or incompatible mount options\n"
333 static int try_context_mount(struct super_block *sb, void *data)
335 char *context = NULL, *defcontext = NULL;
338 int alloc = 0, rc = 0, seen = 0;
339 struct task_security_struct *tsec = current->security;
340 struct superblock_security_struct *sbsec = sb->s_security;
345 name = sb->s_type->name;
347 if (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA) {
349 /* NFS we understand. */
350 if (!strcmp(name, "nfs")) {
351 struct nfs_mount_data *d = data;
353 if (d->version < NFS_MOUNT_VERSION)
357 context = d->context;
364 /* Standard string-based options. */
365 char *p, *options = data;
367 while ((p = strsep(&options, ",")) != NULL) {
369 substring_t args[MAX_OPT_ARGS];
374 token = match_token(p, tokens, args);
380 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
383 context = match_strdup(&args[0]);
394 if (seen & (Opt_context|Opt_fscontext)) {
396 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
399 context = match_strdup(&args[0]);
406 seen |= Opt_fscontext;
410 if (sbsec->behavior != SECURITY_FS_USE_XATTR) {
412 printk(KERN_WARNING "SELinux: "
413 "defcontext option is invalid "
414 "for this filesystem type\n");
417 if (seen & (Opt_context|Opt_defcontext)) {
419 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
422 defcontext = match_strdup(&args[0]);
429 seen |= Opt_defcontext;
434 printk(KERN_WARNING "SELinux: unknown mount "
446 rc = security_context_to_sid(context, strlen(context), &sid);
448 printk(KERN_WARNING "SELinux: security_context_to_sid"
449 "(%s) failed for (dev %s, type %s) errno=%d\n",
450 context, sb->s_id, name, rc);
454 rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
455 FILESYSTEM__RELABELFROM, NULL);
459 rc = avc_has_perm(tsec->sid, sid, SECCLASS_FILESYSTEM,
460 FILESYSTEM__RELABELTO, NULL);
466 if (seen & Opt_context)
467 sbsec->behavior = SECURITY_FS_USE_MNTPOINT;
471 rc = security_context_to_sid(defcontext, strlen(defcontext), &sid);
473 printk(KERN_WARNING "SELinux: security_context_to_sid"
474 "(%s) failed for (dev %s, type %s) errno=%d\n",
475 defcontext, sb->s_id, name, rc);
479 if (sid == sbsec->def_sid)
482 rc = avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
483 FILESYSTEM__RELABELFROM, NULL);
487 rc = avc_has_perm(sid, sbsec->sid, SECCLASS_FILESYSTEM,
488 FILESYSTEM__ASSOCIATE, NULL);
492 sbsec->def_sid = sid;
504 static int superblock_doinit(struct super_block *sb, void *data)
506 struct superblock_security_struct *sbsec = sb->s_security;
507 struct dentry *root = sb->s_root;
508 struct inode *inode = root->d_inode;
512 if (sbsec->initialized)
515 if (!ss_initialized) {
516 /* Defer initialization until selinux_complete_init,
517 after the initial policy is loaded and the security
518 server is ready to handle calls. */
519 spin_lock(&sb_security_lock);
520 if (list_empty(&sbsec->list))
521 list_add(&sbsec->list, &superblock_security_head);
522 spin_unlock(&sb_security_lock);
526 /* Determine the labeling behavior to use for this filesystem type. */
527 rc = security_fs_use(sb->s_type->name, &sbsec->behavior, &sbsec->sid);
529 printk(KERN_WARNING "%s: security_fs_use(%s) returned %d\n",
530 __FUNCTION__, sb->s_type->name, rc);
534 rc = try_context_mount(sb, data);
538 if (sbsec->behavior == SECURITY_FS_USE_XATTR) {
539 /* Make sure that the xattr handler exists and that no
540 error other than -ENODATA is returned by getxattr on
541 the root directory. -ENODATA is ok, as this may be
542 the first boot of the SELinux kernel before we have
543 assigned xattr values to the filesystem. */
544 if (!inode->i_op->getxattr) {
545 printk(KERN_WARNING "SELinux: (dev %s, type %s) has no "
546 "xattr support\n", sb->s_id, sb->s_type->name);
550 rc = inode->i_op->getxattr(root, XATTR_NAME_SELINUX, NULL, 0);
551 if (rc < 0 && rc != -ENODATA) {
552 if (rc == -EOPNOTSUPP)
553 printk(KERN_WARNING "SELinux: (dev %s, type "
554 "%s) has no security xattr handler\n",
555 sb->s_id, sb->s_type->name);
557 printk(KERN_WARNING "SELinux: (dev %s, type "
558 "%s) getxattr errno %d\n", sb->s_id,
559 sb->s_type->name, -rc);
564 if (strcmp(sb->s_type->name, "proc") == 0)
567 sbsec->initialized = 1;
569 if (sbsec->behavior > ARRAY_SIZE(labeling_behaviors)) {
570 printk(KERN_INFO "SELinux: initialized (dev %s, type %s), unknown behavior\n",
571 sb->s_id, sb->s_type->name);
574 printk(KERN_INFO "SELinux: initialized (dev %s, type %s), %s\n",
575 sb->s_id, sb->s_type->name,
576 labeling_behaviors[sbsec->behavior-1]);
579 /* Initialize the root inode. */
580 rc = inode_doinit_with_dentry(sb->s_root->d_inode, sb->s_root);
582 /* Initialize any other inodes associated with the superblock, e.g.
583 inodes created prior to initial policy load or inodes created
584 during get_sb by a pseudo filesystem that directly
586 spin_lock(&sbsec->isec_lock);
588 if (!list_empty(&sbsec->isec_head)) {
589 struct inode_security_struct *isec =
590 list_entry(sbsec->isec_head.next,
591 struct inode_security_struct, list);
592 struct inode *inode = isec->inode;
593 spin_unlock(&sbsec->isec_lock);
594 inode = igrab(inode);
596 if (!IS_PRIVATE (inode))
600 spin_lock(&sbsec->isec_lock);
601 list_del_init(&isec->list);
604 spin_unlock(&sbsec->isec_lock);
610 static inline u16 inode_mode_to_security_class(umode_t mode)
612 switch (mode & S_IFMT) {
614 return SECCLASS_SOCK_FILE;
616 return SECCLASS_LNK_FILE;
618 return SECCLASS_FILE;
620 return SECCLASS_BLK_FILE;
624 return SECCLASS_CHR_FILE;
626 return SECCLASS_FIFO_FILE;
630 return SECCLASS_FILE;
633 static inline u16 socket_type_to_security_class(int family, int type, int protocol)
640 return SECCLASS_UNIX_STREAM_SOCKET;
642 return SECCLASS_UNIX_DGRAM_SOCKET;
649 return SECCLASS_TCP_SOCKET;
651 return SECCLASS_UDP_SOCKET;
653 return SECCLASS_RAWIP_SOCKET;
659 return SECCLASS_NETLINK_ROUTE_SOCKET;
660 case NETLINK_FIREWALL:
661 return SECCLASS_NETLINK_FIREWALL_SOCKET;
662 case NETLINK_TCPDIAG:
663 return SECCLASS_NETLINK_TCPDIAG_SOCKET;
665 return SECCLASS_NETLINK_NFLOG_SOCKET;
667 return SECCLASS_NETLINK_XFRM_SOCKET;
668 case NETLINK_SELINUX:
669 return SECCLASS_NETLINK_SELINUX_SOCKET;
671 return SECCLASS_NETLINK_AUDIT_SOCKET;
673 return SECCLASS_NETLINK_IP6FW_SOCKET;
674 case NETLINK_DNRTMSG:
675 return SECCLASS_NETLINK_DNRT_SOCKET;
676 case NETLINK_KOBJECT_UEVENT:
677 return SECCLASS_NETLINK_KOBJECT_UEVENT_SOCKET;
679 return SECCLASS_NETLINK_SOCKET;
682 return SECCLASS_PACKET_SOCKET;
684 return SECCLASS_KEY_SOCKET;
687 return SECCLASS_SOCKET;
690 #ifdef CONFIG_PROC_FS
691 static int selinux_proc_get_sid(struct proc_dir_entry *de,
696 char *buffer, *path, *end;
698 buffer = (char*)__get_free_page(GFP_KERNEL);
708 while (de && de != de->parent) {
709 buflen -= de->namelen + 1;
713 memcpy(end, de->name, de->namelen);
718 rc = security_genfs_sid("proc", path, tclass, sid);
719 free_page((unsigned long)buffer);
723 static int selinux_proc_get_sid(struct proc_dir_entry *de,
731 /* The inode's security attributes must be initialized before first use. */
732 static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry)
734 struct superblock_security_struct *sbsec = NULL;
735 struct inode_security_struct *isec = inode->i_security;
737 struct dentry *dentry;
738 #define INITCONTEXTLEN 255
739 char *context = NULL;
744 if (isec->initialized)
749 if (isec->initialized)
752 sbsec = inode->i_sb->s_security;
753 if (!sbsec->initialized) {
754 /* Defer initialization until selinux_complete_init,
755 after the initial policy is loaded and the security
756 server is ready to handle calls. */
757 spin_lock(&sbsec->isec_lock);
758 if (list_empty(&isec->list))
759 list_add(&isec->list, &sbsec->isec_head);
760 spin_unlock(&sbsec->isec_lock);
764 switch (sbsec->behavior) {
765 case SECURITY_FS_USE_XATTR:
766 if (!inode->i_op->getxattr) {
767 isec->sid = sbsec->def_sid;
771 /* Need a dentry, since the xattr API requires one.
772 Life would be simpler if we could just pass the inode. */
774 /* Called from d_instantiate or d_splice_alias. */
775 dentry = dget(opt_dentry);
777 /* Called from selinux_complete_init, try to find a dentry. */
778 dentry = d_find_alias(inode);
781 printk(KERN_WARNING "%s: no dentry for dev=%s "
782 "ino=%ld\n", __FUNCTION__, inode->i_sb->s_id,
787 len = INITCONTEXTLEN;
788 context = kmalloc(len, GFP_KERNEL);
794 rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX,
797 /* Need a larger buffer. Query for the right size. */
798 rc = inode->i_op->getxattr(dentry, XATTR_NAME_SELINUX,
806 context = kmalloc(len, GFP_KERNEL);
812 rc = inode->i_op->getxattr(dentry,
818 if (rc != -ENODATA) {
819 printk(KERN_WARNING "%s: getxattr returned "
820 "%d for dev=%s ino=%ld\n", __FUNCTION__,
821 -rc, inode->i_sb->s_id, inode->i_ino);
825 /* Map ENODATA to the default file SID */
826 sid = sbsec->def_sid;
829 rc = security_context_to_sid_default(context, rc, &sid,
832 printk(KERN_WARNING "%s: context_to_sid(%s) "
833 "returned %d for dev=%s ino=%ld\n",
834 __FUNCTION__, context, -rc,
835 inode->i_sb->s_id, inode->i_ino);
837 /* Leave with the unlabeled SID */
845 case SECURITY_FS_USE_TASK:
846 isec->sid = isec->task_sid;
848 case SECURITY_FS_USE_TRANS:
849 /* Default to the fs SID. */
850 isec->sid = sbsec->sid;
852 /* Try to obtain a transition SID. */
853 isec->sclass = inode_mode_to_security_class(inode->i_mode);
854 rc = security_transition_sid(isec->task_sid,
863 /* Default to the fs SID. */
864 isec->sid = sbsec->sid;
867 struct proc_inode *proci = PROC_I(inode);
869 isec->sclass = inode_mode_to_security_class(inode->i_mode);
870 rc = selinux_proc_get_sid(proci->pde,
881 isec->initialized = 1;
884 if (isec->sclass == SECCLASS_FILE)
885 isec->sclass = inode_mode_to_security_class(inode->i_mode);
892 /* Convert a Linux signal to an access vector. */
893 static inline u32 signal_to_av(int sig)
899 /* Commonly granted from child to parent. */
900 perm = PROCESS__SIGCHLD;
903 /* Cannot be caught or ignored */
904 perm = PROCESS__SIGKILL;
907 /* Cannot be caught or ignored */
908 perm = PROCESS__SIGSTOP;
911 /* All other signals. */
912 perm = PROCESS__SIGNAL;
919 /* Check permission betweeen a pair of tasks, e.g. signal checks,
920 fork check, ptrace check, etc. */
921 static int task_has_perm(struct task_struct *tsk1,
922 struct task_struct *tsk2,
925 struct task_security_struct *tsec1, *tsec2;
927 tsec1 = tsk1->security;
928 tsec2 = tsk2->security;
929 return avc_has_perm(tsec1->sid, tsec2->sid,
930 SECCLASS_PROCESS, perms, NULL);
933 /* Check whether a task is allowed to use a capability. */
934 static int task_has_capability(struct task_struct *tsk,
937 struct task_security_struct *tsec;
938 struct avc_audit_data ad;
940 tsec = tsk->security;
942 AVC_AUDIT_DATA_INIT(&ad,CAP);
946 return avc_has_perm(tsec->sid, tsec->sid,
947 SECCLASS_CAPABILITY, CAP_TO_MASK(cap), &ad);
950 /* Check whether a task is allowed to use a system operation. */
951 static int task_has_system(struct task_struct *tsk,
954 struct task_security_struct *tsec;
956 tsec = tsk->security;
958 return avc_has_perm(tsec->sid, SECINITSID_KERNEL,
959 SECCLASS_SYSTEM, perms, NULL);
962 /* Check whether a task has a particular permission to an inode.
963 The 'adp' parameter is optional and allows other audit
964 data to be passed (e.g. the dentry). */
965 static int inode_has_perm(struct task_struct *tsk,
968 struct avc_audit_data *adp)
970 struct task_security_struct *tsec;
971 struct inode_security_struct *isec;
972 struct avc_audit_data ad;
974 tsec = tsk->security;
975 isec = inode->i_security;
979 AVC_AUDIT_DATA_INIT(&ad, FS);
980 ad.u.fs.inode = inode;
983 return avc_has_perm(tsec->sid, isec->sid, isec->sclass, perms, adp);
986 /* Same as inode_has_perm, but pass explicit audit data containing
987 the dentry to help the auditing code to more easily generate the
988 pathname if needed. */
989 static inline int dentry_has_perm(struct task_struct *tsk,
990 struct vfsmount *mnt,
991 struct dentry *dentry,
994 struct inode *inode = dentry->d_inode;
995 struct avc_audit_data ad;
996 AVC_AUDIT_DATA_INIT(&ad,FS);
998 ad.u.fs.dentry = dentry;
999 return inode_has_perm(tsk, inode, av, &ad);
1002 /* Check whether a task can use an open file descriptor to
1003 access an inode in a given way. Check access to the
1004 descriptor itself, and then use dentry_has_perm to
1005 check a particular permission to the file.
1006 Access to the descriptor is implicitly granted if it
1007 has the same SID as the process. If av is zero, then
1008 access to the file is not checked, e.g. for cases
1009 where only the descriptor is affected like seek. */
1010 static inline int file_has_perm(struct task_struct *tsk,
1014 struct task_security_struct *tsec = tsk->security;
1015 struct file_security_struct *fsec = file->f_security;
1016 struct vfsmount *mnt = file->f_vfsmnt;
1017 struct dentry *dentry = file->f_dentry;
1018 struct inode *inode = dentry->d_inode;
1019 struct avc_audit_data ad;
1022 AVC_AUDIT_DATA_INIT(&ad, FS);
1024 ad.u.fs.dentry = dentry;
1026 if (tsec->sid != fsec->sid) {
1027 rc = avc_has_perm(tsec->sid, fsec->sid,
1035 /* av is zero if only checking access to the descriptor. */
1037 return inode_has_perm(tsk, inode, av, &ad);
1042 /* Check whether a task can create a file. */
1043 static int may_create(struct inode *dir,
1044 struct dentry *dentry,
1047 struct task_security_struct *tsec;
1048 struct inode_security_struct *dsec;
1049 struct superblock_security_struct *sbsec;
1051 struct avc_audit_data ad;
1054 tsec = current->security;
1055 dsec = dir->i_security;
1056 sbsec = dir->i_sb->s_security;
1058 AVC_AUDIT_DATA_INIT(&ad, FS);
1059 ad.u.fs.dentry = dentry;
1061 rc = avc_has_perm(tsec->sid, dsec->sid, SECCLASS_DIR,
1062 DIR__ADD_NAME | DIR__SEARCH,
1067 if (tsec->create_sid && sbsec->behavior != SECURITY_FS_USE_MNTPOINT) {
1068 newsid = tsec->create_sid;
1070 rc = security_transition_sid(tsec->sid, dsec->sid, tclass,
1076 rc = avc_has_perm(tsec->sid, newsid, tclass, FILE__CREATE, &ad);
1080 return avc_has_perm(newsid, sbsec->sid,
1081 SECCLASS_FILESYSTEM,
1082 FILESYSTEM__ASSOCIATE, &ad);
1086 #define MAY_UNLINK 1
1089 /* Check whether a task can link, unlink, or rmdir a file/directory. */
1090 static int may_link(struct inode *dir,
1091 struct dentry *dentry,
1095 struct task_security_struct *tsec;
1096 struct inode_security_struct *dsec, *isec;
1097 struct avc_audit_data ad;
1101 tsec = current->security;
1102 dsec = dir->i_security;
1103 isec = dentry->d_inode->i_security;
1105 AVC_AUDIT_DATA_INIT(&ad, FS);
1106 ad.u.fs.dentry = dentry;
1109 av |= (kind ? DIR__REMOVE_NAME : DIR__ADD_NAME);
1110 rc = avc_has_perm(tsec->sid, dsec->sid, SECCLASS_DIR, av, &ad);
1125 printk(KERN_WARNING "may_link: unrecognized kind %d\n", kind);
1129 rc = avc_has_perm(tsec->sid, isec->sid, isec->sclass, av, &ad);
1133 static inline int may_rename(struct inode *old_dir,
1134 struct dentry *old_dentry,
1135 struct inode *new_dir,
1136 struct dentry *new_dentry)
1138 struct task_security_struct *tsec;
1139 struct inode_security_struct *old_dsec, *new_dsec, *old_isec, *new_isec;
1140 struct avc_audit_data ad;
1142 int old_is_dir, new_is_dir;
1145 tsec = current->security;
1146 old_dsec = old_dir->i_security;
1147 old_isec = old_dentry->d_inode->i_security;
1148 old_is_dir = S_ISDIR(old_dentry->d_inode->i_mode);
1149 new_dsec = new_dir->i_security;
1151 AVC_AUDIT_DATA_INIT(&ad, FS);
1153 ad.u.fs.dentry = old_dentry;
1154 rc = avc_has_perm(tsec->sid, old_dsec->sid, SECCLASS_DIR,
1155 DIR__REMOVE_NAME | DIR__SEARCH, &ad);
1158 rc = avc_has_perm(tsec->sid, old_isec->sid,
1159 old_isec->sclass, FILE__RENAME, &ad);
1162 if (old_is_dir && new_dir != old_dir) {
1163 rc = avc_has_perm(tsec->sid, old_isec->sid,
1164 old_isec->sclass, DIR__REPARENT, &ad);
1169 ad.u.fs.dentry = new_dentry;
1170 av = DIR__ADD_NAME | DIR__SEARCH;
1171 if (new_dentry->d_inode)
1172 av |= DIR__REMOVE_NAME;
1173 rc = avc_has_perm(tsec->sid, new_dsec->sid, SECCLASS_DIR, av, &ad);
1176 if (new_dentry->d_inode) {
1177 new_isec = new_dentry->d_inode->i_security;
1178 new_is_dir = S_ISDIR(new_dentry->d_inode->i_mode);
1179 rc = avc_has_perm(tsec->sid, new_isec->sid,
1181 (new_is_dir ? DIR__RMDIR : FILE__UNLINK), &ad);
1189 /* Check whether a task can perform a filesystem operation. */
1190 static int superblock_has_perm(struct task_struct *tsk,
1191 struct super_block *sb,
1193 struct avc_audit_data *ad)
1195 struct task_security_struct *tsec;
1196 struct superblock_security_struct *sbsec;
1198 tsec = tsk->security;
1199 sbsec = sb->s_security;
1200 return avc_has_perm(tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
1204 /* Convert a Linux mode and permission mask to an access vector. */
1205 static inline u32 file_mask_to_av(int mode, int mask)
1209 if ((mode & S_IFMT) != S_IFDIR) {
1210 if (mask & MAY_EXEC)
1211 av |= FILE__EXECUTE;
1212 if (mask & MAY_READ)
1215 if (mask & MAY_APPEND)
1217 else if (mask & MAY_WRITE)
1221 if (mask & MAY_EXEC)
1223 if (mask & MAY_WRITE)
1225 if (mask & MAY_READ)
1232 /* Convert a Linux file to an access vector. */
1233 static inline u32 file_to_av(struct file *file)
1237 if (file->f_mode & FMODE_READ)
1239 if (file->f_mode & FMODE_WRITE) {
1240 if (file->f_flags & O_APPEND)
1249 /* Set an inode's SID to a specified value. */
1250 static int inode_security_set_sid(struct inode *inode, u32 sid)
1252 struct inode_security_struct *isec = inode->i_security;
1253 struct superblock_security_struct *sbsec = inode->i_sb->s_security;
1255 if (!sbsec->initialized) {
1256 /* Defer initialization to selinux_complete_init. */
1261 isec->sclass = inode_mode_to_security_class(inode->i_mode);
1263 isec->initialized = 1;
1268 /* Set the security attributes on a newly created file. */
1269 static int post_create(struct inode *dir,
1270 struct dentry *dentry)
1273 struct task_security_struct *tsec;
1274 struct inode *inode;
1275 struct inode_security_struct *dsec;
1276 struct superblock_security_struct *sbsec;
1282 tsec = current->security;
1283 dsec = dir->i_security;
1284 sbsec = dir->i_sb->s_security;
1286 inode = dentry->d_inode;
1288 /* Some file system types (e.g. NFS) may not instantiate
1289 a dentry for all create operations (e.g. symlink),
1290 so we have to check to see if the inode is non-NULL. */
1291 printk(KERN_WARNING "post_create: no inode, dir (dev=%s, "
1292 "ino=%ld)\n", dir->i_sb->s_id, dir->i_ino);
1296 if (tsec->create_sid && sbsec->behavior != SECURITY_FS_USE_MNTPOINT) {
1297 newsid = tsec->create_sid;
1299 rc = security_transition_sid(tsec->sid, dsec->sid,
1300 inode_mode_to_security_class(inode->i_mode),
1303 printk(KERN_WARNING "post_create: "
1304 "security_transition_sid failed, rc=%d (dev=%s "
1306 -rc, inode->i_sb->s_id, inode->i_ino);
1311 rc = inode_security_set_sid(inode, newsid);
1313 printk(KERN_WARNING "post_create: inode_security_set_sid "
1314 "failed, rc=%d (dev=%s ino=%ld)\n",
1315 -rc, inode->i_sb->s_id, inode->i_ino);
1319 if (sbsec->behavior == SECURITY_FS_USE_XATTR &&
1320 inode->i_op->setxattr) {
1321 /* Use extended attributes. */
1322 rc = security_sid_to_context(newsid, &context, &len);
1324 printk(KERN_WARNING "post_create: sid_to_context "
1325 "failed, rc=%d (dev=%s ino=%ld)\n",
1326 -rc, inode->i_sb->s_id, inode->i_ino);
1329 down(&inode->i_sem);
1330 rc = inode->i_op->setxattr(dentry,
1336 printk(KERN_WARNING "post_create: setxattr failed, "
1337 "rc=%d (dev=%s ino=%ld)\n",
1338 -rc, inode->i_sb->s_id, inode->i_ino);
1347 /* Hook functions begin here. */
1349 static int selinux_ptrace(struct task_struct *parent, struct task_struct *child)
1351 struct task_security_struct *psec = parent->security;
1352 struct task_security_struct *csec = child->security;
1355 rc = secondary_ops->ptrace(parent,child);
1359 rc = task_has_perm(parent, child, PROCESS__PTRACE);
1360 /* Save the SID of the tracing process for later use in apply_creds. */
1362 csec->ptrace_sid = psec->sid;
1366 static int selinux_capget(struct task_struct *target, kernel_cap_t *effective,
1367 kernel_cap_t *inheritable, kernel_cap_t *permitted)
1371 error = task_has_perm(current, target, PROCESS__GETCAP);
1375 return secondary_ops->capget(target, effective, inheritable, permitted);
1378 static int selinux_capset_check(struct task_struct *target, kernel_cap_t *effective,
1379 kernel_cap_t *inheritable, kernel_cap_t *permitted)
1383 error = secondary_ops->capset_check(target, effective, inheritable, permitted);
1387 return task_has_perm(current, target, PROCESS__SETCAP);
1390 static void selinux_capset_set(struct task_struct *target, kernel_cap_t *effective,
1391 kernel_cap_t *inheritable, kernel_cap_t *permitted)
1393 secondary_ops->capset_set(target, effective, inheritable, permitted);
1396 static int selinux_capable(struct task_struct *tsk, int cap)
1400 rc = secondary_ops->capable(tsk, cap);
1404 return task_has_capability(tsk,cap);
1407 static int selinux_sysctl(ctl_table *table, int op)
1411 struct task_security_struct *tsec;
1415 rc = secondary_ops->sysctl(table, op);
1419 tsec = current->security;
1421 rc = selinux_proc_get_sid(table->de, (op == 001) ?
1422 SECCLASS_DIR : SECCLASS_FILE, &tsid);
1424 /* Default to the well-defined sysctl SID. */
1425 tsid = SECINITSID_SYSCTL;
1428 /* The op values are "defined" in sysctl.c, thereby creating
1429 * a bad coupling between this module and sysctl.c */
1431 error = avc_has_perm(tsec->sid, tsid,
1432 SECCLASS_DIR, DIR__SEARCH, NULL);
1440 error = avc_has_perm(tsec->sid, tsid,
1441 SECCLASS_FILE, av, NULL);
1447 static int selinux_quotactl(int cmds, int type, int id, struct super_block *sb)
1460 rc = superblock_has_perm(current,
1462 FILESYSTEM__QUOTAMOD, NULL);
1467 rc = superblock_has_perm(current,
1469 FILESYSTEM__QUOTAGET, NULL);
1472 rc = 0; /* let the kernel handle invalid cmds */
1478 static int selinux_quota_on(struct dentry *dentry)
1480 return dentry_has_perm(current, NULL, dentry, FILE__QUOTAON);
1483 static int selinux_syslog(int type)
1487 rc = secondary_ops->syslog(type);
1492 case 3: /* Read last kernel messages */
1493 case 10: /* Return size of the log buffer */
1494 rc = task_has_system(current, SYSTEM__SYSLOG_READ);
1496 case 6: /* Disable logging to console */
1497 case 7: /* Enable logging to console */
1498 case 8: /* Set level of messages printed to console */
1499 rc = task_has_system(current, SYSTEM__SYSLOG_CONSOLE);
1501 case 0: /* Close log */
1502 case 1: /* Open log */
1503 case 2: /* Read from log */
1504 case 4: /* Read/clear last kernel messages */
1505 case 5: /* Clear ring buffer */
1507 rc = task_has_system(current, SYSTEM__SYSLOG_MOD);
1514 * Check that a process has enough memory to allocate a new virtual
1515 * mapping. 0 means there is enough memory for the allocation to
1516 * succeed and -ENOMEM implies there is not.
1518 * Note that secondary_ops->capable and task_has_perm_noaudit return 0
1519 * if the capability is granted, but __vm_enough_memory requires 1 if
1520 * the capability is granted.
1522 * Do not audit the selinux permission check, as this is applied to all
1523 * processes that allocate mappings.
1525 static int selinux_vm_enough_memory(long pages)
1527 int rc, cap_sys_admin = 0;
1528 struct task_security_struct *tsec = current->security;
1530 rc = secondary_ops->capable(current, CAP_SYS_ADMIN);
1532 rc = avc_has_perm_noaudit(tsec->sid, tsec->sid,
1533 SECCLASS_CAPABILITY,
1534 CAP_TO_MASK(CAP_SYS_ADMIN),
1540 return __vm_enough_memory(pages, cap_sys_admin);
1543 /* binprm security operations */
1545 static int selinux_bprm_alloc_security(struct linux_binprm *bprm)
1547 struct bprm_security_struct *bsec;
1549 bsec = kmalloc(sizeof(struct bprm_security_struct), GFP_KERNEL);
1553 memset(bsec, 0, sizeof *bsec);
1554 bsec->magic = SELINUX_MAGIC;
1556 bsec->sid = SECINITSID_UNLABELED;
1559 bprm->security = bsec;
1563 static int selinux_bprm_set_security(struct linux_binprm *bprm)
1565 struct task_security_struct *tsec;
1566 struct inode *inode = bprm->file->f_dentry->d_inode;
1567 struct inode_security_struct *isec;
1568 struct bprm_security_struct *bsec;
1570 struct avc_audit_data ad;
1573 rc = secondary_ops->bprm_set_security(bprm);
1577 bsec = bprm->security;
1582 tsec = current->security;
1583 isec = inode->i_security;
1585 /* Default to the current task SID. */
1586 bsec->sid = tsec->sid;
1588 /* Reset create SID on execve. */
1589 tsec->create_sid = 0;
1591 if (tsec->exec_sid) {
1592 newsid = tsec->exec_sid;
1593 /* Reset exec SID on execve. */
1596 /* Check for a default transition on this program. */
1597 rc = security_transition_sid(tsec->sid, isec->sid,
1598 SECCLASS_PROCESS, &newsid);
1603 AVC_AUDIT_DATA_INIT(&ad, FS);
1604 ad.u.fs.mnt = bprm->file->f_vfsmnt;
1605 ad.u.fs.dentry = bprm->file->f_dentry;
1607 if (bprm->file->f_vfsmnt->mnt_flags & MNT_NOSUID)
1610 if (tsec->sid == newsid) {
1611 rc = avc_has_perm(tsec->sid, isec->sid,
1612 SECCLASS_FILE, FILE__EXECUTE_NO_TRANS, &ad);
1616 /* Check permissions for the transition. */
1617 rc = avc_has_perm(tsec->sid, newsid,
1618 SECCLASS_PROCESS, PROCESS__TRANSITION, &ad);
1622 rc = avc_has_perm(newsid, isec->sid,
1623 SECCLASS_FILE, FILE__ENTRYPOINT, &ad);
1627 /* Clear any possibly unsafe personality bits on exec: */
1628 current->personality &= ~PER_CLEAR_ON_SETID;
1630 /* Set the security field to the new SID. */
1638 static int selinux_bprm_check_security (struct linux_binprm *bprm)
1640 return secondary_ops->bprm_check_security(bprm);
1644 static int selinux_bprm_secureexec (struct linux_binprm *bprm)
1646 struct task_security_struct *tsec = current->security;
1649 if (tsec->osid != tsec->sid) {
1650 /* Enable secure mode for SIDs transitions unless
1651 the noatsecure permission is granted between
1652 the two SIDs, i.e. ahp returns 0. */
1653 atsecure = avc_has_perm(tsec->osid, tsec->sid,
1655 PROCESS__NOATSECURE, NULL);
1658 return (atsecure || secondary_ops->bprm_secureexec(bprm));
1661 static void selinux_bprm_free_security(struct linux_binprm *bprm)
1663 kfree(bprm->security);
1664 bprm->security = NULL;
1667 extern struct vfsmount *selinuxfs_mount;
1668 extern struct dentry *selinux_null;
1670 /* Derived from fs/exec.c:flush_old_files. */
1671 static inline void flush_unauthorized_files(struct files_struct * files)
1673 struct avc_audit_data ad;
1674 struct file *file, *devnull = NULL;
1675 struct tty_struct *tty = current->signal->tty;
1680 file = list_entry(tty->tty_files.next, typeof(*file), f_list);
1682 /* Revalidate access to controlling tty.
1683 Use inode_has_perm on the tty inode directly rather
1684 than using file_has_perm, as this particular open
1685 file may belong to another process and we are only
1686 interested in the inode-based check here. */
1687 struct inode *inode = file->f_dentry->d_inode;
1688 if (inode_has_perm(current, inode,
1689 FILE__READ | FILE__WRITE, NULL)) {
1690 /* Reset controlling tty. */
1691 current->signal->tty = NULL;
1692 current->signal->tty_old_pgrp = 0;
1698 /* Revalidate access to inherited open files. */
1700 AVC_AUDIT_DATA_INIT(&ad,FS);
1702 spin_lock(&files->file_lock);
1704 unsigned long set, i;
1709 if (i >= files->max_fds || i >= files->max_fdset)
1711 set = files->open_fds->fds_bits[j];
1714 spin_unlock(&files->file_lock);
1715 for ( ; set ; i++,set >>= 1) {
1720 if (file_has_perm(current,
1722 file_to_av(file))) {
1724 fd = get_unused_fd();
1732 atomic_inc(&devnull->f_count);
1734 devnull = dentry_open(dget(selinux_null), mntget(selinuxfs_mount), O_RDWR);
1741 fd_install(fd, devnull);
1746 spin_lock(&files->file_lock);
1749 spin_unlock(&files->file_lock);
1752 static void selinux_bprm_apply_creds(struct linux_binprm *bprm, int unsafe)
1754 struct task_security_struct *tsec;
1755 struct bprm_security_struct *bsec;
1759 secondary_ops->bprm_apply_creds(bprm, unsafe);
1761 tsec = current->security;
1763 bsec = bprm->security;
1766 tsec->osid = tsec->sid;
1768 if (tsec->sid != sid) {
1769 /* Check for shared state. If not ok, leave SID
1770 unchanged and kill. */
1771 if (unsafe & LSM_UNSAFE_SHARE) {
1772 rc = avc_has_perm(tsec->sid, sid, SECCLASS_PROCESS,
1773 PROCESS__SHARE, NULL);
1780 /* Check for ptracing, and update the task SID if ok.
1781 Otherwise, leave SID unchanged and kill. */
1782 if (unsafe & (LSM_UNSAFE_PTRACE | LSM_UNSAFE_PTRACE_CAP)) {
1783 rc = avc_has_perm(tsec->ptrace_sid, sid,
1784 SECCLASS_PROCESS, PROCESS__PTRACE,
1796 * called after apply_creds without the task lock held
1798 static void selinux_bprm_post_apply_creds(struct linux_binprm *bprm)
1800 struct task_security_struct *tsec;
1801 struct rlimit *rlim, *initrlim;
1802 struct itimerval itimer;
1803 struct bprm_security_struct *bsec;
1806 tsec = current->security;
1807 bsec = bprm->security;
1810 force_sig_specific(SIGKILL, current);
1813 if (tsec->osid == tsec->sid)
1816 /* Close files for which the new task SID is not authorized. */
1817 flush_unauthorized_files(current->files);
1819 /* Check whether the new SID can inherit signal state
1820 from the old SID. If not, clear itimers to avoid
1821 subsequent signal generation and flush and unblock
1822 signals. This must occur _after_ the task SID has
1823 been updated so that any kill done after the flush
1824 will be checked against the new SID. */
1825 rc = avc_has_perm(tsec->osid, tsec->sid, SECCLASS_PROCESS,
1826 PROCESS__SIGINH, NULL);
1828 memset(&itimer, 0, sizeof itimer);
1829 for (i = 0; i < 3; i++)
1830 do_setitimer(i, &itimer, NULL);
1831 flush_signals(current);
1832 spin_lock_irq(¤t->sighand->siglock);
1833 flush_signal_handlers(current, 1);
1834 sigemptyset(¤t->blocked);
1835 recalc_sigpending();
1836 spin_unlock_irq(¤t->sighand->siglock);
1839 /* Check whether the new SID can inherit resource limits
1840 from the old SID. If not, reset all soft limits to
1841 the lower of the current task's hard limit and the init
1842 task's soft limit. Note that the setting of hard limits
1843 (even to lower them) can be controlled by the setrlimit
1844 check. The inclusion of the init task's soft limit into
1845 the computation is to avoid resetting soft limits higher
1846 than the default soft limit for cases where the default
1847 is lower than the hard limit, e.g. RLIMIT_CORE or
1849 rc = avc_has_perm(tsec->osid, tsec->sid, SECCLASS_PROCESS,
1850 PROCESS__RLIMITINH, NULL);
1852 for (i = 0; i < RLIM_NLIMITS; i++) {
1853 rlim = current->signal->rlim + i;
1854 initrlim = init_task.signal->rlim+i;
1855 rlim->rlim_cur = min(rlim->rlim_max,initrlim->rlim_cur);
1857 if (current->signal->rlim[RLIMIT_CPU].rlim_cur != RLIM_INFINITY) {
1859 * This will cause RLIMIT_CPU calculations
1862 current->it_prof_expires = jiffies_to_cputime(1);
1866 /* Wake up the parent if it is waiting so that it can
1867 recheck wait permission to the new task SID. */
1868 wake_up_interruptible(¤t->parent->signal->wait_chldexit);
1871 /* superblock security operations */
1873 static int selinux_sb_alloc_security(struct super_block *sb)
1875 return superblock_alloc_security(sb);
1878 static void selinux_sb_free_security(struct super_block *sb)
1880 superblock_free_security(sb);
1883 static inline int match_prefix(char *prefix, int plen, char *option, int olen)
1888 return !memcmp(prefix, option, plen);
1891 static inline int selinux_option(char *option, int len)
1893 return (match_prefix("context=", sizeof("context=")-1, option, len) ||
1894 match_prefix("fscontext=", sizeof("fscontext=")-1, option, len) ||
1895 match_prefix("defcontext=", sizeof("defcontext=")-1, option, len));
1898 static inline void take_option(char **to, char *from, int *first, int len)
1906 memcpy(*to, from, len);
1910 static int selinux_sb_copy_data(struct file_system_type *type, void *orig, void *copy)
1912 int fnosec, fsec, rc = 0;
1913 char *in_save, *in_curr, *in_end;
1914 char *sec_curr, *nosec_save, *nosec;
1919 /* Binary mount data: just copy */
1920 if (type->fs_flags & FS_BINARY_MOUNTDATA) {
1921 copy_page(sec_curr, in_curr);
1925 nosec = (char *)get_zeroed_page(GFP_KERNEL);
1933 in_save = in_end = orig;
1936 if (*in_end == ',' || *in_end == '\0') {
1937 int len = in_end - in_curr;
1939 if (selinux_option(in_curr, len))
1940 take_option(&sec_curr, in_curr, &fsec, len);
1942 take_option(&nosec, in_curr, &fnosec, len);
1944 in_curr = in_end + 1;
1946 } while (*in_end++);
1948 strcpy(in_save, nosec_save);
1949 free_page((unsigned long)nosec_save);
1954 static int selinux_sb_kern_mount(struct super_block *sb, void *data)
1956 struct avc_audit_data ad;
1959 rc = superblock_doinit(sb, data);
1963 AVC_AUDIT_DATA_INIT(&ad,FS);
1964 ad.u.fs.dentry = sb->s_root;
1965 return superblock_has_perm(current, sb, FILESYSTEM__MOUNT, &ad);
1968 static int selinux_sb_statfs(struct super_block *sb)
1970 struct avc_audit_data ad;
1972 AVC_AUDIT_DATA_INIT(&ad,FS);
1973 ad.u.fs.dentry = sb->s_root;
1974 return superblock_has_perm(current, sb, FILESYSTEM__GETATTR, &ad);
1977 static int selinux_mount(char * dev_name,
1978 struct nameidata *nd,
1980 unsigned long flags,
1985 rc = secondary_ops->sb_mount(dev_name, nd, type, flags, data);
1989 if (flags & MS_REMOUNT)
1990 return superblock_has_perm(current, nd->mnt->mnt_sb,
1991 FILESYSTEM__REMOUNT, NULL);
1993 return dentry_has_perm(current, nd->mnt, nd->dentry,
1997 static int selinux_umount(struct vfsmount *mnt, int flags)
2001 rc = secondary_ops->sb_umount(mnt, flags);
2005 return superblock_has_perm(current,mnt->mnt_sb,
2006 FILESYSTEM__UNMOUNT,NULL);
2009 /* inode security operations */
2011 static int selinux_inode_alloc_security(struct inode *inode)
2013 return inode_alloc_security(inode);
2016 static void selinux_inode_free_security(struct inode *inode)
2018 inode_free_security(inode);
2021 static int selinux_inode_create(struct inode *dir, struct dentry *dentry, int mask)
2023 return may_create(dir, dentry, SECCLASS_FILE);
2026 static void selinux_inode_post_create(struct inode *dir, struct dentry *dentry, int mask)
2028 post_create(dir, dentry);
2031 static int selinux_inode_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
2035 rc = secondary_ops->inode_link(old_dentry,dir,new_dentry);
2038 return may_link(dir, old_dentry, MAY_LINK);
2041 static void selinux_inode_post_link(struct dentry *old_dentry, struct inode *inode, struct dentry *new_dentry)
2046 static int selinux_inode_unlink(struct inode *dir, struct dentry *dentry)
2050 rc = secondary_ops->inode_unlink(dir, dentry);
2053 return may_link(dir, dentry, MAY_UNLINK);
2056 static int selinux_inode_symlink(struct inode *dir, struct dentry *dentry, const char *name)
2058 return may_create(dir, dentry, SECCLASS_LNK_FILE);
2061 static void selinux_inode_post_symlink(struct inode *dir, struct dentry *dentry, const char *name)
2063 post_create(dir, dentry);
2066 static int selinux_inode_mkdir(struct inode *dir, struct dentry *dentry, int mask)
2068 return may_create(dir, dentry, SECCLASS_DIR);
2071 static void selinux_inode_post_mkdir(struct inode *dir, struct dentry *dentry, int mask)
2073 post_create(dir, dentry);
2076 static int selinux_inode_rmdir(struct inode *dir, struct dentry *dentry)
2078 return may_link(dir, dentry, MAY_RMDIR);
2081 static int selinux_inode_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
2085 rc = secondary_ops->inode_mknod(dir, dentry, mode, dev);
2089 return may_create(dir, dentry, inode_mode_to_security_class(mode));
2092 static void selinux_inode_post_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
2094 post_create(dir, dentry);
2097 static int selinux_inode_rename(struct inode *old_inode, struct dentry *old_dentry,
2098 struct inode *new_inode, struct dentry *new_dentry)
2100 return may_rename(old_inode, old_dentry, new_inode, new_dentry);
2103 static void selinux_inode_post_rename(struct inode *old_inode, struct dentry *old_dentry,
2104 struct inode *new_inode, struct dentry *new_dentry)
2109 static int selinux_inode_readlink(struct dentry *dentry)
2111 return dentry_has_perm(current, NULL, dentry, FILE__READ);
2114 static int selinux_inode_follow_link(struct dentry *dentry, struct nameidata *nameidata)
2118 rc = secondary_ops->inode_follow_link(dentry,nameidata);
2121 return dentry_has_perm(current, NULL, dentry, FILE__READ);
2124 static int selinux_inode_permission(struct inode *inode, int mask,
2125 struct nameidata *nd)
2129 rc = secondary_ops->inode_permission(inode, mask, nd);
2134 /* No permission to check. Existence test. */
2138 return inode_has_perm(current, inode,
2139 file_mask_to_av(inode->i_mode, mask), NULL);
2142 static int selinux_inode_setattr(struct dentry *dentry, struct iattr *iattr)
2146 rc = secondary_ops->inode_setattr(dentry, iattr);
2150 if (iattr->ia_valid & ATTR_FORCE)
2153 if (iattr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID |
2154 ATTR_ATIME_SET | ATTR_MTIME_SET))
2155 return dentry_has_perm(current, NULL, dentry, FILE__SETATTR);
2157 return dentry_has_perm(current, NULL, dentry, FILE__WRITE);
2160 static int selinux_inode_getattr(struct vfsmount *mnt, struct dentry *dentry)
2162 return dentry_has_perm(current, mnt, dentry, FILE__GETATTR);
2165 static int selinux_inode_setxattr(struct dentry *dentry, char *name, void *value, size_t size, int flags)
2167 struct task_security_struct *tsec = current->security;
2168 struct inode *inode = dentry->d_inode;
2169 struct inode_security_struct *isec = inode->i_security;
2170 struct superblock_security_struct *sbsec;
2171 struct avc_audit_data ad;
2175 if (strcmp(name, XATTR_NAME_SELINUX)) {
2176 if (!strncmp(name, XATTR_SECURITY_PREFIX,
2177 sizeof XATTR_SECURITY_PREFIX - 1) &&
2178 !capable(CAP_SYS_ADMIN)) {
2179 /* A different attribute in the security namespace.
2180 Restrict to administrator. */
2184 /* Not an attribute we recognize, so just check the
2185 ordinary setattr permission. */
2186 return dentry_has_perm(current, NULL, dentry, FILE__SETATTR);
2189 sbsec = inode->i_sb->s_security;
2190 if (sbsec->behavior == SECURITY_FS_USE_MNTPOINT)
2193 if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
2196 AVC_AUDIT_DATA_INIT(&ad,FS);
2197 ad.u.fs.dentry = dentry;
2199 rc = avc_has_perm(tsec->sid, isec->sid, isec->sclass,
2200 FILE__RELABELFROM, &ad);
2204 rc = security_context_to_sid(value, size, &newsid);
2208 rc = avc_has_perm(tsec->sid, newsid, isec->sclass,
2209 FILE__RELABELTO, &ad);
2213 rc = security_validate_transition(isec->sid, newsid, tsec->sid,
2218 return avc_has_perm(newsid,
2220 SECCLASS_FILESYSTEM,
2221 FILESYSTEM__ASSOCIATE,
2225 static void selinux_inode_post_setxattr(struct dentry *dentry, char *name,
2226 void *value, size_t size, int flags)
2228 struct inode *inode = dentry->d_inode;
2229 struct inode_security_struct *isec = inode->i_security;
2233 if (strcmp(name, XATTR_NAME_SELINUX)) {
2234 /* Not an attribute we recognize, so nothing to do. */
2238 rc = security_context_to_sid(value, size, &newsid);
2240 printk(KERN_WARNING "%s: unable to obtain SID for context "
2241 "%s, rc=%d\n", __FUNCTION__, (char*)value, -rc);
2249 static int selinux_inode_getxattr (struct dentry *dentry, char *name)
2251 struct inode *inode = dentry->d_inode;
2252 struct superblock_security_struct *sbsec = inode->i_sb->s_security;
2254 if (sbsec->behavior == SECURITY_FS_USE_MNTPOINT)
2257 return dentry_has_perm(current, NULL, dentry, FILE__GETATTR);
2260 static int selinux_inode_listxattr (struct dentry *dentry)
2262 return dentry_has_perm(current, NULL, dentry, FILE__GETATTR);
2265 static int selinux_inode_removexattr (struct dentry *dentry, char *name)
2267 if (strcmp(name, XATTR_NAME_SELINUX)) {
2268 if (!strncmp(name, XATTR_SECURITY_PREFIX,
2269 sizeof XATTR_SECURITY_PREFIX - 1) &&
2270 !capable(CAP_SYS_ADMIN)) {
2271 /* A different attribute in the security namespace.
2272 Restrict to administrator. */
2276 /* Not an attribute we recognize, so just check the
2277 ordinary setattr permission. Might want a separate
2278 permission for removexattr. */
2279 return dentry_has_perm(current, NULL, dentry, FILE__SETATTR);
2282 /* No one is allowed to remove a SELinux security label.
2283 You can change the label, but all data must be labeled. */
2287 static int selinux_inode_getsecurity(struct inode *inode, const char *name, void *buffer, size_t size)
2289 struct inode_security_struct *isec = inode->i_security;
2294 /* Permission check handled by selinux_inode_getxattr hook.*/
2296 if (strcmp(name, XATTR_SELINUX_SUFFIX))
2299 rc = security_sid_to_context(isec->sid, &context, &len);
2303 if (!buffer || !size) {
2311 memcpy(buffer, context, len);
2316 static int selinux_inode_setsecurity(struct inode *inode, const char *name,
2317 const void *value, size_t size, int flags)
2319 struct inode_security_struct *isec = inode->i_security;
2323 if (strcmp(name, XATTR_SELINUX_SUFFIX))
2326 if (!value || !size)
2329 rc = security_context_to_sid((void*)value, size, &newsid);
2337 static int selinux_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size)
2339 const int len = sizeof(XATTR_NAME_SELINUX);
2340 if (buffer && len <= buffer_size)
2341 memcpy(buffer, XATTR_NAME_SELINUX, len);
2345 /* file security operations */
2347 static int selinux_file_permission(struct file *file, int mask)
2349 struct inode *inode = file->f_dentry->d_inode;
2352 /* No permission to check. Existence test. */
2356 /* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */
2357 if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE))
2360 return file_has_perm(current, file,
2361 file_mask_to_av(inode->i_mode, mask));
2364 static int selinux_file_alloc_security(struct file *file)
2366 return file_alloc_security(file);
2369 static void selinux_file_free_security(struct file *file)
2371 file_free_security(file);
2374 static int selinux_file_ioctl(struct file *file, unsigned int cmd,
2386 case EXT2_IOC_GETFLAGS:
2388 case EXT2_IOC_GETVERSION:
2389 error = file_has_perm(current, file, FILE__GETATTR);
2392 case EXT2_IOC_SETFLAGS:
2394 case EXT2_IOC_SETVERSION:
2395 error = file_has_perm(current, file, FILE__SETATTR);
2398 /* sys_ioctl() checks */
2402 error = file_has_perm(current, file, 0);
2407 error = task_has_capability(current,CAP_SYS_TTY_CONFIG);
2410 /* default case assumes that the command will go
2411 * to the file's ioctl() function.
2414 error = file_has_perm(current, file, FILE__IOCTL);
2420 static int file_map_prot_check(struct file *file, unsigned long prot, int shared)
2422 #ifndef CONFIG_PPC32
2423 if ((prot & PROT_EXEC) && (!file || (!shared && (prot & PROT_WRITE)))) {
2425 * We are making executable an anonymous mapping or a
2426 * private file mapping that will also be writable.
2427 * This has an additional check.
2429 int rc = task_has_perm(current, current, PROCESS__EXECMEM);
2436 /* read access is always possible with a mapping */
2437 u32 av = FILE__READ;
2439 /* write access only matters if the mapping is shared */
2440 if (shared && (prot & PROT_WRITE))
2443 if (prot & PROT_EXEC)
2444 av |= FILE__EXECUTE;
2446 return file_has_perm(current, file, av);
2451 static int selinux_file_mmap(struct file *file, unsigned long reqprot,
2452 unsigned long prot, unsigned long flags)
2456 rc = secondary_ops->file_mmap(file, reqprot, prot, flags);
2460 if (selinux_checkreqprot)
2463 return file_map_prot_check(file, prot,
2464 (flags & MAP_TYPE) == MAP_SHARED);
2467 static int selinux_file_mprotect(struct vm_area_struct *vma,
2468 unsigned long reqprot,
2473 rc = secondary_ops->file_mprotect(vma, reqprot, prot);
2477 if (selinux_checkreqprot)
2480 #ifndef CONFIG_PPC32
2481 if ((prot & PROT_EXEC) && !(vma->vm_flags & VM_EXECUTABLE) &&
2482 (vma->vm_start >= vma->vm_mm->start_brk &&
2483 vma->vm_end <= vma->vm_mm->brk)) {
2485 * We are making an executable mapping in the brk region.
2486 * This has an additional execheap check.
2488 rc = task_has_perm(current, current, PROCESS__EXECHEAP);
2492 if (vma->vm_file != NULL && vma->anon_vma != NULL && (prot & PROT_EXEC)) {
2494 * We are making executable a file mapping that has
2495 * had some COW done. Since pages might have been written,
2496 * check ability to execute the possibly modified content.
2497 * This typically should only occur for text relocations.
2499 int rc = file_has_perm(current, vma->vm_file, FILE__EXECMOD);
2503 if (!vma->vm_file && (prot & PROT_EXEC) &&
2504 vma->vm_start <= vma->vm_mm->start_stack &&
2505 vma->vm_end >= vma->vm_mm->start_stack) {
2506 /* Attempt to make the process stack executable.
2507 * This has an additional execstack check.
2509 rc = task_has_perm(current, current, PROCESS__EXECSTACK);
2515 return file_map_prot_check(vma->vm_file, prot, vma->vm_flags&VM_SHARED);
2518 static int selinux_file_lock(struct file *file, unsigned int cmd)
2520 return file_has_perm(current, file, FILE__LOCK);
2523 static int selinux_file_fcntl(struct file *file, unsigned int cmd,
2530 if (!file->f_dentry || !file->f_dentry->d_inode) {
2535 if ((file->f_flags & O_APPEND) && !(arg & O_APPEND)) {
2536 err = file_has_perm(current, file,FILE__WRITE);
2545 /* Just check FD__USE permission */
2546 err = file_has_perm(current, file, 0);
2551 #if BITS_PER_LONG == 32
2556 if (!file->f_dentry || !file->f_dentry->d_inode) {
2560 err = file_has_perm(current, file, FILE__LOCK);
2567 static int selinux_file_set_fowner(struct file *file)
2569 struct task_security_struct *tsec;
2570 struct file_security_struct *fsec;
2572 tsec = current->security;
2573 fsec = file->f_security;
2574 fsec->fown_sid = tsec->sid;
2579 static int selinux_file_send_sigiotask(struct task_struct *tsk,
2580 struct fown_struct *fown, int signum)
2584 struct task_security_struct *tsec;
2585 struct file_security_struct *fsec;
2587 /* struct fown_struct is never outside the context of a struct file */
2588 file = (struct file *)((long)fown - offsetof(struct file,f_owner));
2590 tsec = tsk->security;
2591 fsec = file->f_security;
2594 perm = signal_to_av(SIGIO); /* as per send_sigio_to_task */
2596 perm = signal_to_av(signum);
2598 return avc_has_perm(fsec->fown_sid, tsec->sid,
2599 SECCLASS_PROCESS, perm, NULL);
2602 static int selinux_file_receive(struct file *file)
2604 return file_has_perm(current, file, file_to_av(file));
2607 /* task security operations */
2609 static int selinux_task_create(unsigned long clone_flags)
2613 rc = secondary_ops->task_create(clone_flags);
2617 return task_has_perm(current, current, PROCESS__FORK);
2620 static int selinux_task_alloc_security(struct task_struct *tsk)
2622 struct task_security_struct *tsec1, *tsec2;
2625 tsec1 = current->security;
2627 rc = task_alloc_security(tsk);
2630 tsec2 = tsk->security;
2632 tsec2->osid = tsec1->osid;
2633 tsec2->sid = tsec1->sid;
2635 /* Retain the exec and create SIDs across fork */
2636 tsec2->exec_sid = tsec1->exec_sid;
2637 tsec2->create_sid = tsec1->create_sid;
2639 /* Retain ptracer SID across fork, if any.
2640 This will be reset by the ptrace hook upon any
2641 subsequent ptrace_attach operations. */
2642 tsec2->ptrace_sid = tsec1->ptrace_sid;
2647 static void selinux_task_free_security(struct task_struct *tsk)
2649 task_free_security(tsk);
2652 static int selinux_task_setuid(uid_t id0, uid_t id1, uid_t id2, int flags)
2654 /* Since setuid only affects the current process, and
2655 since the SELinux controls are not based on the Linux
2656 identity attributes, SELinux does not need to control
2657 this operation. However, SELinux does control the use
2658 of the CAP_SETUID and CAP_SETGID capabilities using the
2663 static int selinux_task_post_setuid(uid_t id0, uid_t id1, uid_t id2, int flags)
2665 return secondary_ops->task_post_setuid(id0,id1,id2,flags);
2668 static int selinux_task_setgid(gid_t id0, gid_t id1, gid_t id2, int flags)
2670 /* See the comment for setuid above. */
2674 static int selinux_task_setpgid(struct task_struct *p, pid_t pgid)
2676 return task_has_perm(current, p, PROCESS__SETPGID);
2679 static int selinux_task_getpgid(struct task_struct *p)
2681 return task_has_perm(current, p, PROCESS__GETPGID);
2684 static int selinux_task_getsid(struct task_struct *p)
2686 return task_has_perm(current, p, PROCESS__GETSESSION);
2689 static int selinux_task_setgroups(struct group_info *group_info)
2691 /* See the comment for setuid above. */
2695 static int selinux_task_setnice(struct task_struct *p, int nice)
2699 rc = secondary_ops->task_setnice(p, nice);
2703 return task_has_perm(current,p, PROCESS__SETSCHED);
2706 static int selinux_task_setrlimit(unsigned int resource, struct rlimit *new_rlim)
2708 struct rlimit *old_rlim = current->signal->rlim + resource;
2711 rc = secondary_ops->task_setrlimit(resource, new_rlim);
2715 /* Control the ability to change the hard limit (whether
2716 lowering or raising it), so that the hard limit can
2717 later be used as a safe reset point for the soft limit
2718 upon context transitions. See selinux_bprm_apply_creds. */
2719 if (old_rlim->rlim_max != new_rlim->rlim_max)
2720 return task_has_perm(current, current, PROCESS__SETRLIMIT);
2725 static int selinux_task_setscheduler(struct task_struct *p, int policy, struct sched_param *lp)
2727 return task_has_perm(current, p, PROCESS__SETSCHED);
2730 static int selinux_task_getscheduler(struct task_struct *p)
2732 return task_has_perm(current, p, PROCESS__GETSCHED);
2735 static int selinux_task_kill(struct task_struct *p, struct siginfo *info, int sig)
2740 rc = secondary_ops->task_kill(p, info, sig);
2744 if (info && ((unsigned long)info == 1 ||
2745 (unsigned long)info == 2 || SI_FROMKERNEL(info)))
2749 perm = PROCESS__SIGNULL; /* null signal; existence test */
2751 perm = signal_to_av(sig);
2753 return task_has_perm(current, p, perm);
2756 static int selinux_task_prctl(int option,
2762 /* The current prctl operations do not appear to require
2763 any SELinux controls since they merely observe or modify
2764 the state of the current process. */
2768 static int selinux_task_wait(struct task_struct *p)
2772 perm = signal_to_av(p->exit_signal);
2774 return task_has_perm(p, current, perm);
2777 static void selinux_task_reparent_to_init(struct task_struct *p)
2779 struct task_security_struct *tsec;
2781 secondary_ops->task_reparent_to_init(p);
2784 tsec->osid = tsec->sid;
2785 tsec->sid = SECINITSID_KERNEL;
2789 static void selinux_task_to_inode(struct task_struct *p,
2790 struct inode *inode)
2792 struct task_security_struct *tsec = p->security;
2793 struct inode_security_struct *isec = inode->i_security;
2795 isec->sid = tsec->sid;
2796 isec->initialized = 1;
2800 #ifdef CONFIG_SECURITY_NETWORK
2802 /* Returns error only if unable to parse addresses */
2803 static int selinux_parse_skb_ipv4(struct sk_buff *skb, struct avc_audit_data *ad)
2805 int offset, ihlen, ret = -EINVAL;
2806 struct iphdr _iph, *ih;
2808 offset = skb->nh.raw - skb->data;
2809 ih = skb_header_pointer(skb, offset, sizeof(_iph), &_iph);
2813 ihlen = ih->ihl * 4;
2814 if (ihlen < sizeof(_iph))
2817 ad->u.net.v4info.saddr = ih->saddr;
2818 ad->u.net.v4info.daddr = ih->daddr;
2821 switch (ih->protocol) {
2823 struct tcphdr _tcph, *th;
2825 if (ntohs(ih->frag_off) & IP_OFFSET)
2829 th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
2833 ad->u.net.sport = th->source;
2834 ad->u.net.dport = th->dest;
2839 struct udphdr _udph, *uh;
2841 if (ntohs(ih->frag_off) & IP_OFFSET)
2845 uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
2849 ad->u.net.sport = uh->source;
2850 ad->u.net.dport = uh->dest;
2861 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
2863 /* Returns error only if unable to parse addresses */
2864 static int selinux_parse_skb_ipv6(struct sk_buff *skb, struct avc_audit_data *ad)
2867 int ret = -EINVAL, offset;
2868 struct ipv6hdr _ipv6h, *ip6;
2870 offset = skb->nh.raw - skb->data;
2871 ip6 = skb_header_pointer(skb, offset, sizeof(_ipv6h), &_ipv6h);
2875 ipv6_addr_copy(&ad->u.net.v6info.saddr, &ip6->saddr);
2876 ipv6_addr_copy(&ad->u.net.v6info.daddr, &ip6->daddr);
2879 nexthdr = ip6->nexthdr;
2880 offset += sizeof(_ipv6h);
2881 offset = ipv6_skip_exthdr(skb, offset, &nexthdr);
2887 struct tcphdr _tcph, *th;
2889 th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
2893 ad->u.net.sport = th->source;
2894 ad->u.net.dport = th->dest;
2899 struct udphdr _udph, *uh;
2901 uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
2905 ad->u.net.sport = uh->source;
2906 ad->u.net.dport = uh->dest;
2910 /* includes fragments */
2920 static int selinux_parse_skb(struct sk_buff *skb, struct avc_audit_data *ad,
2921 char **addrp, int *len, int src)
2925 switch (ad->u.net.family) {
2927 ret = selinux_parse_skb_ipv4(skb, ad);
2931 *addrp = (char *)(src ? &ad->u.net.v4info.saddr :
2932 &ad->u.net.v4info.daddr);
2935 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
2937 ret = selinux_parse_skb_ipv6(skb, ad);
2941 *addrp = (char *)(src ? &ad->u.net.v6info.saddr :
2942 &ad->u.net.v6info.daddr);
2952 /* socket security operations */
2953 static int socket_has_perm(struct task_struct *task, struct socket *sock,
2956 struct inode_security_struct *isec;
2957 struct task_security_struct *tsec;
2958 struct avc_audit_data ad;
2961 tsec = task->security;
2962 isec = SOCK_INODE(sock)->i_security;
2964 if (isec->sid == SECINITSID_KERNEL)
2967 AVC_AUDIT_DATA_INIT(&ad,NET);
2968 ad.u.net.sk = sock->sk;
2969 err = avc_has_perm(tsec->sid, isec->sid, isec->sclass, perms, &ad);
2975 static int selinux_socket_create(int family, int type,
2976 int protocol, int kern)
2979 struct task_security_struct *tsec;
2984 tsec = current->security;
2985 err = avc_has_perm(tsec->sid, tsec->sid,
2986 socket_type_to_security_class(family, type,
2987 protocol), SOCKET__CREATE, NULL);
2993 static void selinux_socket_post_create(struct socket *sock, int family,
2994 int type, int protocol, int kern)
2996 struct inode_security_struct *isec;
2997 struct task_security_struct *tsec;
2999 isec = SOCK_INODE(sock)->i_security;
3001 tsec = current->security;
3002 isec->sclass = socket_type_to_security_class(family, type, protocol);
3003 isec->sid = kern ? SECINITSID_KERNEL : tsec->sid;
3004 isec->initialized = 1;
3009 /* Range of port numbers used to automatically bind.
3010 Need to determine whether we should perform a name_bind
3011 permission check between the socket and the port number. */
3012 #define ip_local_port_range_0 sysctl_local_port_range[0]
3013 #define ip_local_port_range_1 sysctl_local_port_range[1]
3015 static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
3020 err = socket_has_perm(current, sock, SOCKET__BIND);
3025 * If PF_INET or PF_INET6, check name_bind permission for the port.
3027 family = sock->sk->sk_family;
3028 if (family == PF_INET || family == PF_INET6) {
3030 struct inode_security_struct *isec;
3031 struct task_security_struct *tsec;
3032 struct avc_audit_data ad;
3033 struct sockaddr_in *addr4 = NULL;
3034 struct sockaddr_in6 *addr6 = NULL;
3035 unsigned short snum;
3036 struct sock *sk = sock->sk;
3037 u32 sid, node_perm, addrlen;
3039 tsec = current->security;
3040 isec = SOCK_INODE(sock)->i_security;
3042 if (family == PF_INET) {
3043 addr4 = (struct sockaddr_in *)address;
3044 snum = ntohs(addr4->sin_port);
3045 addrlen = sizeof(addr4->sin_addr.s_addr);
3046 addrp = (char *)&addr4->sin_addr.s_addr;
3048 addr6 = (struct sockaddr_in6 *)address;
3049 snum = ntohs(addr6->sin6_port);
3050 addrlen = sizeof(addr6->sin6_addr.s6_addr);
3051 addrp = (char *)&addr6->sin6_addr.s6_addr;
3054 if (snum&&(snum < max(PROT_SOCK,ip_local_port_range_0) ||
3055 snum > ip_local_port_range_1)) {
3056 err = security_port_sid(sk->sk_family, sk->sk_type,
3057 sk->sk_protocol, snum, &sid);
3060 AVC_AUDIT_DATA_INIT(&ad,NET);
3061 ad.u.net.sport = htons(snum);
3062 ad.u.net.family = family;
3063 err = avc_has_perm(isec->sid, sid,
3065 SOCKET__NAME_BIND, &ad);
3070 switch(sk->sk_protocol) {
3072 node_perm = TCP_SOCKET__NODE_BIND;
3076 node_perm = UDP_SOCKET__NODE_BIND;
3080 node_perm = RAWIP_SOCKET__NODE_BIND;
3084 err = security_node_sid(family, addrp, addrlen, &sid);
3088 AVC_AUDIT_DATA_INIT(&ad,NET);
3089 ad.u.net.sport = htons(snum);
3090 ad.u.net.family = family;
3092 if (family == PF_INET)
3093 ad.u.net.v4info.saddr = addr4->sin_addr.s_addr;
3095 ipv6_addr_copy(&ad.u.net.v6info.saddr, &addr6->sin6_addr);
3097 err = avc_has_perm(isec->sid, sid,
3098 isec->sclass, node_perm, &ad);
3106 static int selinux_socket_connect(struct socket *sock, struct sockaddr *address, int addrlen)
3108 struct inode_security_struct *isec;
3111 err = socket_has_perm(current, sock, SOCKET__CONNECT);
3116 * If a TCP socket, check name_connect permission for the port.
3118 isec = SOCK_INODE(sock)->i_security;
3119 if (isec->sclass == SECCLASS_TCP_SOCKET) {
3120 struct sock *sk = sock->sk;
3121 struct avc_audit_data ad;
3122 struct sockaddr_in *addr4 = NULL;
3123 struct sockaddr_in6 *addr6 = NULL;
3124 unsigned short snum;
3127 if (sk->sk_family == PF_INET) {
3128 addr4 = (struct sockaddr_in *)address;
3129 if (addrlen < sizeof(struct sockaddr_in))
3131 snum = ntohs(addr4->sin_port);
3133 addr6 = (struct sockaddr_in6 *)address;
3134 if (addrlen < SIN6_LEN_RFC2133)
3136 snum = ntohs(addr6->sin6_port);
3139 err = security_port_sid(sk->sk_family, sk->sk_type,
3140 sk->sk_protocol, snum, &sid);
3144 AVC_AUDIT_DATA_INIT(&ad,NET);
3145 ad.u.net.dport = htons(snum);
3146 ad.u.net.family = sk->sk_family;
3147 err = avc_has_perm(isec->sid, sid, isec->sclass,
3148 TCP_SOCKET__NAME_CONNECT, &ad);
3157 static int selinux_socket_listen(struct socket *sock, int backlog)
3159 return socket_has_perm(current, sock, SOCKET__LISTEN);
3162 static int selinux_socket_accept(struct socket *sock, struct socket *newsock)
3165 struct inode_security_struct *isec;
3166 struct inode_security_struct *newisec;
3168 err = socket_has_perm(current, sock, SOCKET__ACCEPT);
3172 newisec = SOCK_INODE(newsock)->i_security;
3174 isec = SOCK_INODE(sock)->i_security;
3175 newisec->sclass = isec->sclass;
3176 newisec->sid = isec->sid;
3177 newisec->initialized = 1;
3182 static int selinux_socket_sendmsg(struct socket *sock, struct msghdr *msg,
3185 return socket_has_perm(current, sock, SOCKET__WRITE);
3188 static int selinux_socket_recvmsg(struct socket *sock, struct msghdr *msg,
3189 int size, int flags)
3191 return socket_has_perm(current, sock, SOCKET__READ);
3194 static int selinux_socket_getsockname(struct socket *sock)
3196 return socket_has_perm(current, sock, SOCKET__GETATTR);
3199 static int selinux_socket_getpeername(struct socket *sock)
3201 return socket_has_perm(current, sock, SOCKET__GETATTR);
3204 static int selinux_socket_setsockopt(struct socket *sock,int level,int optname)
3206 return socket_has_perm(current, sock, SOCKET__SETOPT);
3209 static int selinux_socket_getsockopt(struct socket *sock, int level,
3212 return socket_has_perm(current, sock, SOCKET__GETOPT);
3215 static int selinux_socket_shutdown(struct socket *sock, int how)
3217 return socket_has_perm(current, sock, SOCKET__SHUTDOWN);
3220 static int selinux_socket_unix_stream_connect(struct socket *sock,
3221 struct socket *other,
3224 struct sk_security_struct *ssec;
3225 struct inode_security_struct *isec;
3226 struct inode_security_struct *other_isec;
3227 struct avc_audit_data ad;
3230 err = secondary_ops->unix_stream_connect(sock, other, newsk);
3234 isec = SOCK_INODE(sock)->i_security;
3235 other_isec = SOCK_INODE(other)->i_security;
3237 AVC_AUDIT_DATA_INIT(&ad,NET);
3238 ad.u.net.sk = other->sk;
3240 err = avc_has_perm(isec->sid, other_isec->sid,
3242 UNIX_STREAM_SOCKET__CONNECTTO, &ad);
3246 /* connecting socket */
3247 ssec = sock->sk->sk_security;
3248 ssec->peer_sid = other_isec->sid;
3250 /* server child socket */
3251 ssec = newsk->sk_security;
3252 ssec->peer_sid = isec->sid;
3257 static int selinux_socket_unix_may_send(struct socket *sock,
3258 struct socket *other)
3260 struct inode_security_struct *isec;
3261 struct inode_security_struct *other_isec;
3262 struct avc_audit_data ad;
3265 isec = SOCK_INODE(sock)->i_security;
3266 other_isec = SOCK_INODE(other)->i_security;
3268 AVC_AUDIT_DATA_INIT(&ad,NET);
3269 ad.u.net.sk = other->sk;
3271 err = avc_has_perm(isec->sid, other_isec->sid,
3272 isec->sclass, SOCKET__SENDTO, &ad);
3279 static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
3284 u32 netif_perm, node_perm, node_sid, if_sid, recv_perm = 0;
3287 struct socket *sock;
3288 struct net_device *dev;
3289 struct avc_audit_data ad;
3291 family = sk->sk_family;
3292 if (family != PF_INET && family != PF_INET6)