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>
15 * Copyright (C) 2006 Hewlett-Packard Development Company, L.P.
16 * Paul Moore, <paul.moore@hp.com>
18 * This program is free software; you can redistribute it and/or modify
19 * it under the terms of the GNU General Public License version 2,
20 * as published by the Free Software Foundation.
23 #include <linux/module.h>
24 #include <linux/init.h>
25 #include <linux/kernel.h>
26 #include <linux/ptrace.h>
27 #include <linux/errno.h>
28 #include <linux/sched.h>
29 #include <linux/security.h>
30 #include <linux/xattr.h>
31 #include <linux/capability.h>
32 #include <linux/unistd.h>
34 #include <linux/mman.h>
35 #include <linux/slab.h>
36 #include <linux/pagemap.h>
37 #include <linux/swap.h>
38 #include <linux/smp_lock.h>
39 #include <linux/spinlock.h>
40 #include <linux/syscalls.h>
41 #include <linux/file.h>
42 #include <linux/namei.h>
43 #include <linux/mount.h>
44 #include <linux/ext2_fs.h>
45 #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 sysctl_local_port_range[] */
52 #include <net/tcp.h> /* struct or_callable used in sock_rcv_skb */
53 #include <asm/uaccess.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/dccp.h>
62 #include <linux/quota.h>
63 #include <linux/un.h> /* for Unix socket types */
64 #include <net/af_unix.h> /* for Unix socket types */
65 #include <linux/parser.h>
66 #include <linux/nfs_mount.h>
68 #include <linux/hugetlb.h>
69 #include <linux/personality.h>
70 #include <linux/sysctl.h>
71 #include <linux/audit.h>
72 #include <linux/string.h>
73 #include <linux/selinux.h>
74 #include <linux/mutex.h>
82 #define XATTR_SELINUX_SUFFIX "selinux"
83 #define XATTR_NAME_SELINUX XATTR_SECURITY_PREFIX XATTR_SELINUX_SUFFIX
85 extern unsigned int policydb_loaded_version
;
86 extern int selinux_nlmsg_lookup(u16 sclass
, u16 nlmsg_type
, u32
*perm
);
87 extern int selinux_compat_net
;
89 #ifdef CONFIG_SECURITY_SELINUX_DEVELOP
90 int selinux_enforcing
= 0;
92 static int __init
enforcing_setup(char *str
)
94 selinux_enforcing
= simple_strtol(str
,NULL
,0);
97 __setup("enforcing=", enforcing_setup
);
100 #ifdef CONFIG_SECURITY_SELINUX_BOOTPARAM
101 int selinux_enabled
= CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE
;
103 static int __init
selinux_enabled_setup(char *str
)
105 selinux_enabled
= simple_strtol(str
, NULL
, 0);
108 __setup("selinux=", selinux_enabled_setup
);
110 int selinux_enabled
= 1;
113 /* Original (dummy) security module. */
114 static struct security_operations
*original_ops
= NULL
;
116 /* Minimal support for a secondary security module,
117 just to allow the use of the dummy or capability modules.
118 The owlsm module can alternatively be used as a secondary
119 module as long as CONFIG_OWLSM_FD is not enabled. */
120 static struct security_operations
*secondary_ops
= NULL
;
122 /* Lists of inode and superblock security structures initialized
123 before the policy was loaded. */
124 static LIST_HEAD(superblock_security_head
);
125 static DEFINE_SPINLOCK(sb_security_lock
);
127 static struct kmem_cache
*sel_inode_cache
;
129 /* Return security context for a given sid or just the context
130 length if the buffer is null or length is 0 */
131 static int selinux_getsecurity(u32 sid
, void *buffer
, size_t size
)
137 rc
= security_sid_to_context(sid
, &context
, &len
);
141 if (!buffer
|| !size
)
142 goto getsecurity_exit
;
146 goto getsecurity_exit
;
148 memcpy(buffer
, context
, len
);
155 /* Allocate and free functions for each kind of security blob. */
157 static int task_alloc_security(struct task_struct
*task
)
159 struct task_security_struct
*tsec
;
161 tsec
= kzalloc(sizeof(struct task_security_struct
), GFP_KERNEL
);
166 tsec
->osid
= tsec
->sid
= tsec
->ptrace_sid
= SECINITSID_UNLABELED
;
167 task
->security
= tsec
;
172 static void task_free_security(struct task_struct
*task
)
174 struct task_security_struct
*tsec
= task
->security
;
175 task
->security
= NULL
;
179 static int inode_alloc_security(struct inode
*inode
)
181 struct task_security_struct
*tsec
= current
->security
;
182 struct inode_security_struct
*isec
;
184 isec
= kmem_cache_zalloc(sel_inode_cache
, GFP_KERNEL
);
188 mutex_init(&isec
->lock
);
189 INIT_LIST_HEAD(&isec
->list
);
191 isec
->sid
= SECINITSID_UNLABELED
;
192 isec
->sclass
= SECCLASS_FILE
;
193 isec
->task_sid
= tsec
->sid
;
194 inode
->i_security
= isec
;
199 static void inode_free_security(struct inode
*inode
)
201 struct inode_security_struct
*isec
= inode
->i_security
;
202 struct superblock_security_struct
*sbsec
= inode
->i_sb
->s_security
;
204 spin_lock(&sbsec
->isec_lock
);
205 if (!list_empty(&isec
->list
))
206 list_del_init(&isec
->list
);
207 spin_unlock(&sbsec
->isec_lock
);
209 inode
->i_security
= NULL
;
210 kmem_cache_free(sel_inode_cache
, isec
);
213 static int file_alloc_security(struct file
*file
)
215 struct task_security_struct
*tsec
= current
->security
;
216 struct file_security_struct
*fsec
;
218 fsec
= kzalloc(sizeof(struct file_security_struct
), GFP_KERNEL
);
223 fsec
->sid
= tsec
->sid
;
224 fsec
->fown_sid
= tsec
->sid
;
225 file
->f_security
= fsec
;
230 static void file_free_security(struct file
*file
)
232 struct file_security_struct
*fsec
= file
->f_security
;
233 file
->f_security
= NULL
;
237 static int superblock_alloc_security(struct super_block
*sb
)
239 struct superblock_security_struct
*sbsec
;
241 sbsec
= kzalloc(sizeof(struct superblock_security_struct
), GFP_KERNEL
);
245 mutex_init(&sbsec
->lock
);
246 INIT_LIST_HEAD(&sbsec
->list
);
247 INIT_LIST_HEAD(&sbsec
->isec_head
);
248 spin_lock_init(&sbsec
->isec_lock
);
250 sbsec
->sid
= SECINITSID_UNLABELED
;
251 sbsec
->def_sid
= SECINITSID_FILE
;
252 sbsec
->mntpoint_sid
= SECINITSID_UNLABELED
;
253 sb
->s_security
= sbsec
;
258 static void superblock_free_security(struct super_block
*sb
)
260 struct superblock_security_struct
*sbsec
= sb
->s_security
;
262 spin_lock(&sb_security_lock
);
263 if (!list_empty(&sbsec
->list
))
264 list_del_init(&sbsec
->list
);
265 spin_unlock(&sb_security_lock
);
267 sb
->s_security
= NULL
;
271 static int sk_alloc_security(struct sock
*sk
, int family
, gfp_t priority
)
273 struct sk_security_struct
*ssec
;
275 ssec
= kzalloc(sizeof(*ssec
), priority
);
280 ssec
->peer_sid
= SECINITSID_UNLABELED
;
281 ssec
->sid
= SECINITSID_UNLABELED
;
282 sk
->sk_security
= ssec
;
284 selinux_netlbl_sk_security_init(ssec
, family
);
289 static void sk_free_security(struct sock
*sk
)
291 struct sk_security_struct
*ssec
= sk
->sk_security
;
293 sk
->sk_security
= NULL
;
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
);
326 static match_table_t tokens
= {
327 {Opt_context
, "context=%s"},
328 {Opt_fscontext
, "fscontext=%s"},
329 {Opt_defcontext
, "defcontext=%s"},
330 {Opt_rootcontext
, "rootcontext=%s"},
333 #define SEL_MOUNT_FAIL_MSG "SELinux: duplicate or incompatible mount options\n"
335 static int may_context_mount_sb_relabel(u32 sid
,
336 struct superblock_security_struct
*sbsec
,
337 struct task_security_struct
*tsec
)
341 rc
= avc_has_perm(tsec
->sid
, sbsec
->sid
, SECCLASS_FILESYSTEM
,
342 FILESYSTEM__RELABELFROM
, NULL
);
346 rc
= avc_has_perm(tsec
->sid
, sid
, SECCLASS_FILESYSTEM
,
347 FILESYSTEM__RELABELTO
, NULL
);
351 static int may_context_mount_inode_relabel(u32 sid
,
352 struct superblock_security_struct
*sbsec
,
353 struct task_security_struct
*tsec
)
356 rc
= avc_has_perm(tsec
->sid
, sbsec
->sid
, SECCLASS_FILESYSTEM
,
357 FILESYSTEM__RELABELFROM
, NULL
);
361 rc
= avc_has_perm(sid
, sbsec
->sid
, SECCLASS_FILESYSTEM
,
362 FILESYSTEM__ASSOCIATE
, NULL
);
366 static int try_context_mount(struct super_block
*sb
, void *data
)
368 char *context
= NULL
, *defcontext
= NULL
;
369 char *fscontext
= NULL
, *rootcontext
= NULL
;
372 int alloc
= 0, rc
= 0, seen
= 0;
373 struct task_security_struct
*tsec
= current
->security
;
374 struct superblock_security_struct
*sbsec
= sb
->s_security
;
379 name
= sb
->s_type
->name
;
381 if (sb
->s_type
->fs_flags
& FS_BINARY_MOUNTDATA
) {
383 /* NFS we understand. */
384 if (!strcmp(name
, "nfs")) {
385 struct nfs_mount_data
*d
= data
;
387 if (d
->version
< NFS_MOUNT_VERSION
)
391 context
= d
->context
;
398 /* Standard string-based options. */
399 char *p
, *options
= data
;
401 while ((p
= strsep(&options
, "|")) != NULL
) {
403 substring_t args
[MAX_OPT_ARGS
];
408 token
= match_token(p
, tokens
, args
);
412 if (seen
& (Opt_context
|Opt_defcontext
)) {
414 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG
);
417 context
= match_strdup(&args
[0]);
428 if (seen
& Opt_fscontext
) {
430 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG
);
433 fscontext
= match_strdup(&args
[0]);
440 seen
|= Opt_fscontext
;
443 case Opt_rootcontext
:
444 if (seen
& Opt_rootcontext
) {
446 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG
);
449 rootcontext
= match_strdup(&args
[0]);
456 seen
|= Opt_rootcontext
;
460 if (sbsec
->behavior
!= SECURITY_FS_USE_XATTR
) {
462 printk(KERN_WARNING
"SELinux: "
463 "defcontext option is invalid "
464 "for this filesystem type\n");
467 if (seen
& (Opt_context
|Opt_defcontext
)) {
469 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG
);
472 defcontext
= match_strdup(&args
[0]);
479 seen
|= Opt_defcontext
;
484 printk(KERN_WARNING
"SELinux: unknown mount "
495 /* sets the context of the superblock for the fs being mounted. */
497 rc
= security_context_to_sid(fscontext
, strlen(fscontext
), &sid
);
499 printk(KERN_WARNING
"SELinux: security_context_to_sid"
500 "(%s) failed for (dev %s, type %s) errno=%d\n",
501 fscontext
, sb
->s_id
, name
, rc
);
505 rc
= may_context_mount_sb_relabel(sid
, sbsec
, tsec
);
513 * Switch to using mount point labeling behavior.
514 * sets the label used on all file below the mountpoint, and will set
515 * the superblock context if not already set.
518 rc
= security_context_to_sid(context
, strlen(context
), &sid
);
520 printk(KERN_WARNING
"SELinux: security_context_to_sid"
521 "(%s) failed for (dev %s, type %s) errno=%d\n",
522 context
, sb
->s_id
, name
, rc
);
527 rc
= may_context_mount_sb_relabel(sid
, sbsec
, tsec
);
532 rc
= may_context_mount_inode_relabel(sid
, sbsec
, tsec
);
536 sbsec
->mntpoint_sid
= sid
;
538 sbsec
->behavior
= SECURITY_FS_USE_MNTPOINT
;
542 struct inode
*inode
= sb
->s_root
->d_inode
;
543 struct inode_security_struct
*isec
= inode
->i_security
;
544 rc
= security_context_to_sid(rootcontext
, strlen(rootcontext
), &sid
);
546 printk(KERN_WARNING
"SELinux: security_context_to_sid"
547 "(%s) failed for (dev %s, type %s) errno=%d\n",
548 rootcontext
, sb
->s_id
, name
, rc
);
552 rc
= may_context_mount_inode_relabel(sid
, sbsec
, tsec
);
557 isec
->initialized
= 1;
561 rc
= security_context_to_sid(defcontext
, strlen(defcontext
), &sid
);
563 printk(KERN_WARNING
"SELinux: security_context_to_sid"
564 "(%s) failed for (dev %s, type %s) errno=%d\n",
565 defcontext
, sb
->s_id
, name
, rc
);
569 if (sid
== sbsec
->def_sid
)
572 rc
= may_context_mount_inode_relabel(sid
, sbsec
, tsec
);
576 sbsec
->def_sid
= sid
;
590 static int superblock_doinit(struct super_block
*sb
, void *data
)
592 struct superblock_security_struct
*sbsec
= sb
->s_security
;
593 struct dentry
*root
= sb
->s_root
;
594 struct inode
*inode
= root
->d_inode
;
597 mutex_lock(&sbsec
->lock
);
598 if (sbsec
->initialized
)
601 if (!ss_initialized
) {
602 /* Defer initialization until selinux_complete_init,
603 after the initial policy is loaded and the security
604 server is ready to handle calls. */
605 spin_lock(&sb_security_lock
);
606 if (list_empty(&sbsec
->list
))
607 list_add(&sbsec
->list
, &superblock_security_head
);
608 spin_unlock(&sb_security_lock
);
612 /* Determine the labeling behavior to use for this filesystem type. */
613 rc
= security_fs_use(sb
->s_type
->name
, &sbsec
->behavior
, &sbsec
->sid
);
615 printk(KERN_WARNING
"%s: security_fs_use(%s) returned %d\n",
616 __FUNCTION__
, sb
->s_type
->name
, rc
);
620 rc
= try_context_mount(sb
, data
);
624 if (sbsec
->behavior
== SECURITY_FS_USE_XATTR
) {
625 /* Make sure that the xattr handler exists and that no
626 error other than -ENODATA is returned by getxattr on
627 the root directory. -ENODATA is ok, as this may be
628 the first boot of the SELinux kernel before we have
629 assigned xattr values to the filesystem. */
630 if (!inode
->i_op
->getxattr
) {
631 printk(KERN_WARNING
"SELinux: (dev %s, type %s) has no "
632 "xattr support\n", sb
->s_id
, sb
->s_type
->name
);
636 rc
= inode
->i_op
->getxattr(root
, XATTR_NAME_SELINUX
, NULL
, 0);
637 if (rc
< 0 && rc
!= -ENODATA
) {
638 if (rc
== -EOPNOTSUPP
)
639 printk(KERN_WARNING
"SELinux: (dev %s, type "
640 "%s) has no security xattr handler\n",
641 sb
->s_id
, sb
->s_type
->name
);
643 printk(KERN_WARNING
"SELinux: (dev %s, type "
644 "%s) getxattr errno %d\n", sb
->s_id
,
645 sb
->s_type
->name
, -rc
);
650 if (strcmp(sb
->s_type
->name
, "proc") == 0)
653 sbsec
->initialized
= 1;
655 if (sbsec
->behavior
> ARRAY_SIZE(labeling_behaviors
)) {
656 printk(KERN_ERR
"SELinux: initialized (dev %s, type %s), unknown behavior\n",
657 sb
->s_id
, sb
->s_type
->name
);
660 printk(KERN_DEBUG
"SELinux: initialized (dev %s, type %s), %s\n",
661 sb
->s_id
, sb
->s_type
->name
,
662 labeling_behaviors
[sbsec
->behavior
-1]);
665 /* Initialize the root inode. */
666 rc
= inode_doinit_with_dentry(sb
->s_root
->d_inode
, sb
->s_root
);
668 /* Initialize any other inodes associated with the superblock, e.g.
669 inodes created prior to initial policy load or inodes created
670 during get_sb by a pseudo filesystem that directly
672 spin_lock(&sbsec
->isec_lock
);
674 if (!list_empty(&sbsec
->isec_head
)) {
675 struct inode_security_struct
*isec
=
676 list_entry(sbsec
->isec_head
.next
,
677 struct inode_security_struct
, list
);
678 struct inode
*inode
= isec
->inode
;
679 spin_unlock(&sbsec
->isec_lock
);
680 inode
= igrab(inode
);
682 if (!IS_PRIVATE (inode
))
686 spin_lock(&sbsec
->isec_lock
);
687 list_del_init(&isec
->list
);
690 spin_unlock(&sbsec
->isec_lock
);
692 mutex_unlock(&sbsec
->lock
);
696 static inline u16
inode_mode_to_security_class(umode_t mode
)
698 switch (mode
& S_IFMT
) {
700 return SECCLASS_SOCK_FILE
;
702 return SECCLASS_LNK_FILE
;
704 return SECCLASS_FILE
;
706 return SECCLASS_BLK_FILE
;
710 return SECCLASS_CHR_FILE
;
712 return SECCLASS_FIFO_FILE
;
716 return SECCLASS_FILE
;
719 static inline int default_protocol_stream(int protocol
)
721 return (protocol
== IPPROTO_IP
|| protocol
== IPPROTO_TCP
);
724 static inline int default_protocol_dgram(int protocol
)
726 return (protocol
== IPPROTO_IP
|| protocol
== IPPROTO_UDP
);
729 static inline u16
socket_type_to_security_class(int family
, int type
, int protocol
)
736 return SECCLASS_UNIX_STREAM_SOCKET
;
738 return SECCLASS_UNIX_DGRAM_SOCKET
;
745 if (default_protocol_stream(protocol
))
746 return SECCLASS_TCP_SOCKET
;
748 return SECCLASS_RAWIP_SOCKET
;
750 if (default_protocol_dgram(protocol
))
751 return SECCLASS_UDP_SOCKET
;
753 return SECCLASS_RAWIP_SOCKET
;
755 return SECCLASS_DCCP_SOCKET
;
757 return SECCLASS_RAWIP_SOCKET
;
763 return SECCLASS_NETLINK_ROUTE_SOCKET
;
764 case NETLINK_FIREWALL
:
765 return SECCLASS_NETLINK_FIREWALL_SOCKET
;
766 case NETLINK_INET_DIAG
:
767 return SECCLASS_NETLINK_TCPDIAG_SOCKET
;
769 return SECCLASS_NETLINK_NFLOG_SOCKET
;
771 return SECCLASS_NETLINK_XFRM_SOCKET
;
772 case NETLINK_SELINUX
:
773 return SECCLASS_NETLINK_SELINUX_SOCKET
;
775 return SECCLASS_NETLINK_AUDIT_SOCKET
;
777 return SECCLASS_NETLINK_IP6FW_SOCKET
;
778 case NETLINK_DNRTMSG
:
779 return SECCLASS_NETLINK_DNRT_SOCKET
;
780 case NETLINK_KOBJECT_UEVENT
:
781 return SECCLASS_NETLINK_KOBJECT_UEVENT_SOCKET
;
783 return SECCLASS_NETLINK_SOCKET
;
786 return SECCLASS_PACKET_SOCKET
;
788 return SECCLASS_KEY_SOCKET
;
790 return SECCLASS_APPLETALK_SOCKET
;
793 return SECCLASS_SOCKET
;
796 #ifdef CONFIG_PROC_FS
797 static int selinux_proc_get_sid(struct proc_dir_entry
*de
,
802 char *buffer
, *path
, *end
;
804 buffer
= (char*)__get_free_page(GFP_KERNEL
);
814 while (de
&& de
!= de
->parent
) {
815 buflen
-= de
->namelen
+ 1;
819 memcpy(end
, de
->name
, de
->namelen
);
824 rc
= security_genfs_sid("proc", path
, tclass
, sid
);
825 free_page((unsigned long)buffer
);
829 static int selinux_proc_get_sid(struct proc_dir_entry
*de
,
837 /* The inode's security attributes must be initialized before first use. */
838 static int inode_doinit_with_dentry(struct inode
*inode
, struct dentry
*opt_dentry
)
840 struct superblock_security_struct
*sbsec
= NULL
;
841 struct inode_security_struct
*isec
= inode
->i_security
;
843 struct dentry
*dentry
;
844 #define INITCONTEXTLEN 255
845 char *context
= NULL
;
849 if (isec
->initialized
)
852 mutex_lock(&isec
->lock
);
853 if (isec
->initialized
)
856 sbsec
= inode
->i_sb
->s_security
;
857 if (!sbsec
->initialized
) {
858 /* Defer initialization until selinux_complete_init,
859 after the initial policy is loaded and the security
860 server is ready to handle calls. */
861 spin_lock(&sbsec
->isec_lock
);
862 if (list_empty(&isec
->list
))
863 list_add(&isec
->list
, &sbsec
->isec_head
);
864 spin_unlock(&sbsec
->isec_lock
);
868 switch (sbsec
->behavior
) {
869 case SECURITY_FS_USE_XATTR
:
870 if (!inode
->i_op
->getxattr
) {
871 isec
->sid
= sbsec
->def_sid
;
875 /* Need a dentry, since the xattr API requires one.
876 Life would be simpler if we could just pass the inode. */
878 /* Called from d_instantiate or d_splice_alias. */
879 dentry
= dget(opt_dentry
);
881 /* Called from selinux_complete_init, try to find a dentry. */
882 dentry
= d_find_alias(inode
);
885 printk(KERN_WARNING
"%s: no dentry for dev=%s "
886 "ino=%ld\n", __FUNCTION__
, inode
->i_sb
->s_id
,
891 len
= INITCONTEXTLEN
;
892 context
= kmalloc(len
, GFP_KERNEL
);
898 rc
= inode
->i_op
->getxattr(dentry
, XATTR_NAME_SELINUX
,
901 /* Need a larger buffer. Query for the right size. */
902 rc
= inode
->i_op
->getxattr(dentry
, XATTR_NAME_SELINUX
,
910 context
= kmalloc(len
, GFP_KERNEL
);
916 rc
= inode
->i_op
->getxattr(dentry
,
922 if (rc
!= -ENODATA
) {
923 printk(KERN_WARNING
"%s: getxattr returned "
924 "%d for dev=%s ino=%ld\n", __FUNCTION__
,
925 -rc
, inode
->i_sb
->s_id
, inode
->i_ino
);
929 /* Map ENODATA to the default file SID */
930 sid
= sbsec
->def_sid
;
933 rc
= security_context_to_sid_default(context
, rc
, &sid
,
936 printk(KERN_WARNING
"%s: context_to_sid(%s) "
937 "returned %d for dev=%s ino=%ld\n",
938 __FUNCTION__
, context
, -rc
,
939 inode
->i_sb
->s_id
, inode
->i_ino
);
941 /* Leave with the unlabeled SID */
949 case SECURITY_FS_USE_TASK
:
950 isec
->sid
= isec
->task_sid
;
952 case SECURITY_FS_USE_TRANS
:
953 /* Default to the fs SID. */
954 isec
->sid
= sbsec
->sid
;
956 /* Try to obtain a transition SID. */
957 isec
->sclass
= inode_mode_to_security_class(inode
->i_mode
);
958 rc
= security_transition_sid(isec
->task_sid
,
966 case SECURITY_FS_USE_MNTPOINT
:
967 isec
->sid
= sbsec
->mntpoint_sid
;
970 /* Default to the fs superblock SID. */
971 isec
->sid
= sbsec
->sid
;
974 struct proc_inode
*proci
= PROC_I(inode
);
976 isec
->sclass
= inode_mode_to_security_class(inode
->i_mode
);
977 rc
= selinux_proc_get_sid(proci
->pde
,
988 isec
->initialized
= 1;
991 mutex_unlock(&isec
->lock
);
993 if (isec
->sclass
== SECCLASS_FILE
)
994 isec
->sclass
= inode_mode_to_security_class(inode
->i_mode
);
998 /* Convert a Linux signal to an access vector. */
999 static inline u32
signal_to_av(int sig
)
1005 /* Commonly granted from child to parent. */
1006 perm
= PROCESS__SIGCHLD
;
1009 /* Cannot be caught or ignored */
1010 perm
= PROCESS__SIGKILL
;
1013 /* Cannot be caught or ignored */
1014 perm
= PROCESS__SIGSTOP
;
1017 /* All other signals. */
1018 perm
= PROCESS__SIGNAL
;
1025 /* Check permission betweeen a pair of tasks, e.g. signal checks,
1026 fork check, ptrace check, etc. */
1027 static int task_has_perm(struct task_struct
*tsk1
,
1028 struct task_struct
*tsk2
,
1031 struct task_security_struct
*tsec1
, *tsec2
;
1033 tsec1
= tsk1
->security
;
1034 tsec2
= tsk2
->security
;
1035 return avc_has_perm(tsec1
->sid
, tsec2
->sid
,
1036 SECCLASS_PROCESS
, perms
, NULL
);
1039 /* Check whether a task is allowed to use a capability. */
1040 static int task_has_capability(struct task_struct
*tsk
,
1043 struct task_security_struct
*tsec
;
1044 struct avc_audit_data ad
;
1046 tsec
= tsk
->security
;
1048 AVC_AUDIT_DATA_INIT(&ad
,CAP
);
1052 return avc_has_perm(tsec
->sid
, tsec
->sid
,
1053 SECCLASS_CAPABILITY
, CAP_TO_MASK(cap
), &ad
);
1056 /* Check whether a task is allowed to use a system operation. */
1057 static int task_has_system(struct task_struct
*tsk
,
1060 struct task_security_struct
*tsec
;
1062 tsec
= tsk
->security
;
1064 return avc_has_perm(tsec
->sid
, SECINITSID_KERNEL
,
1065 SECCLASS_SYSTEM
, perms
, NULL
);
1068 /* Check whether a task has a particular permission to an inode.
1069 The 'adp' parameter is optional and allows other audit
1070 data to be passed (e.g. the dentry). */
1071 static int inode_has_perm(struct task_struct
*tsk
,
1072 struct inode
*inode
,
1074 struct avc_audit_data
*adp
)
1076 struct task_security_struct
*tsec
;
1077 struct inode_security_struct
*isec
;
1078 struct avc_audit_data ad
;
1080 if (unlikely (IS_PRIVATE (inode
)))
1083 tsec
= tsk
->security
;
1084 isec
= inode
->i_security
;
1088 AVC_AUDIT_DATA_INIT(&ad
, FS
);
1089 ad
.u
.fs
.inode
= inode
;
1092 return avc_has_perm(tsec
->sid
, isec
->sid
, isec
->sclass
, perms
, adp
);
1095 /* Same as inode_has_perm, but pass explicit audit data containing
1096 the dentry to help the auditing code to more easily generate the
1097 pathname if needed. */
1098 static inline int dentry_has_perm(struct task_struct
*tsk
,
1099 struct vfsmount
*mnt
,
1100 struct dentry
*dentry
,
1103 struct inode
*inode
= dentry
->d_inode
;
1104 struct avc_audit_data ad
;
1105 AVC_AUDIT_DATA_INIT(&ad
,FS
);
1107 ad
.u
.fs
.dentry
= dentry
;
1108 return inode_has_perm(tsk
, inode
, av
, &ad
);
1111 /* Check whether a task can use an open file descriptor to
1112 access an inode in a given way. Check access to the
1113 descriptor itself, and then use dentry_has_perm to
1114 check a particular permission to the file.
1115 Access to the descriptor is implicitly granted if it
1116 has the same SID as the process. If av is zero, then
1117 access to the file is not checked, e.g. for cases
1118 where only the descriptor is affected like seek. */
1119 static int file_has_perm(struct task_struct
*tsk
,
1123 struct task_security_struct
*tsec
= tsk
->security
;
1124 struct file_security_struct
*fsec
= file
->f_security
;
1125 struct vfsmount
*mnt
= file
->f_path
.mnt
;
1126 struct dentry
*dentry
= file
->f_path
.dentry
;
1127 struct inode
*inode
= dentry
->d_inode
;
1128 struct avc_audit_data ad
;
1131 AVC_AUDIT_DATA_INIT(&ad
, FS
);
1133 ad
.u
.fs
.dentry
= dentry
;
1135 if (tsec
->sid
!= fsec
->sid
) {
1136 rc
= avc_has_perm(tsec
->sid
, fsec
->sid
,
1144 /* av is zero if only checking access to the descriptor. */
1146 return inode_has_perm(tsk
, inode
, av
, &ad
);
1151 /* Check whether a task can create a file. */
1152 static int may_create(struct inode
*dir
,
1153 struct dentry
*dentry
,
1156 struct task_security_struct
*tsec
;
1157 struct inode_security_struct
*dsec
;
1158 struct superblock_security_struct
*sbsec
;
1160 struct avc_audit_data ad
;
1163 tsec
= current
->security
;
1164 dsec
= dir
->i_security
;
1165 sbsec
= dir
->i_sb
->s_security
;
1167 AVC_AUDIT_DATA_INIT(&ad
, FS
);
1168 ad
.u
.fs
.dentry
= dentry
;
1170 rc
= avc_has_perm(tsec
->sid
, dsec
->sid
, SECCLASS_DIR
,
1171 DIR__ADD_NAME
| DIR__SEARCH
,
1176 if (tsec
->create_sid
&& sbsec
->behavior
!= SECURITY_FS_USE_MNTPOINT
) {
1177 newsid
= tsec
->create_sid
;
1179 rc
= security_transition_sid(tsec
->sid
, dsec
->sid
, tclass
,
1185 rc
= avc_has_perm(tsec
->sid
, newsid
, tclass
, FILE__CREATE
, &ad
);
1189 return avc_has_perm(newsid
, sbsec
->sid
,
1190 SECCLASS_FILESYSTEM
,
1191 FILESYSTEM__ASSOCIATE
, &ad
);
1194 /* Check whether a task can create a key. */
1195 static int may_create_key(u32 ksid
,
1196 struct task_struct
*ctx
)
1198 struct task_security_struct
*tsec
;
1200 tsec
= ctx
->security
;
1202 return avc_has_perm(tsec
->sid
, ksid
, SECCLASS_KEY
, KEY__CREATE
, NULL
);
1206 #define MAY_UNLINK 1
1209 /* Check whether a task can link, unlink, or rmdir a file/directory. */
1210 static int may_link(struct inode
*dir
,
1211 struct dentry
*dentry
,
1215 struct task_security_struct
*tsec
;
1216 struct inode_security_struct
*dsec
, *isec
;
1217 struct avc_audit_data ad
;
1221 tsec
= current
->security
;
1222 dsec
= dir
->i_security
;
1223 isec
= dentry
->d_inode
->i_security
;
1225 AVC_AUDIT_DATA_INIT(&ad
, FS
);
1226 ad
.u
.fs
.dentry
= dentry
;
1229 av
|= (kind
? DIR__REMOVE_NAME
: DIR__ADD_NAME
);
1230 rc
= avc_has_perm(tsec
->sid
, dsec
->sid
, SECCLASS_DIR
, av
, &ad
);
1245 printk(KERN_WARNING
"may_link: unrecognized kind %d\n", kind
);
1249 rc
= avc_has_perm(tsec
->sid
, isec
->sid
, isec
->sclass
, av
, &ad
);
1253 static inline int may_rename(struct inode
*old_dir
,
1254 struct dentry
*old_dentry
,
1255 struct inode
*new_dir
,
1256 struct dentry
*new_dentry
)
1258 struct task_security_struct
*tsec
;
1259 struct inode_security_struct
*old_dsec
, *new_dsec
, *old_isec
, *new_isec
;
1260 struct avc_audit_data ad
;
1262 int old_is_dir
, new_is_dir
;
1265 tsec
= current
->security
;
1266 old_dsec
= old_dir
->i_security
;
1267 old_isec
= old_dentry
->d_inode
->i_security
;
1268 old_is_dir
= S_ISDIR(old_dentry
->d_inode
->i_mode
);
1269 new_dsec
= new_dir
->i_security
;
1271 AVC_AUDIT_DATA_INIT(&ad
, FS
);
1273 ad
.u
.fs
.dentry
= old_dentry
;
1274 rc
= avc_has_perm(tsec
->sid
, old_dsec
->sid
, SECCLASS_DIR
,
1275 DIR__REMOVE_NAME
| DIR__SEARCH
, &ad
);
1278 rc
= avc_has_perm(tsec
->sid
, old_isec
->sid
,
1279 old_isec
->sclass
, FILE__RENAME
, &ad
);
1282 if (old_is_dir
&& new_dir
!= old_dir
) {
1283 rc
= avc_has_perm(tsec
->sid
, old_isec
->sid
,
1284 old_isec
->sclass
, DIR__REPARENT
, &ad
);
1289 ad
.u
.fs
.dentry
= new_dentry
;
1290 av
= DIR__ADD_NAME
| DIR__SEARCH
;
1291 if (new_dentry
->d_inode
)
1292 av
|= DIR__REMOVE_NAME
;
1293 rc
= avc_has_perm(tsec
->sid
, new_dsec
->sid
, SECCLASS_DIR
, av
, &ad
);
1296 if (new_dentry
->d_inode
) {
1297 new_isec
= new_dentry
->d_inode
->i_security
;
1298 new_is_dir
= S_ISDIR(new_dentry
->d_inode
->i_mode
);
1299 rc
= avc_has_perm(tsec
->sid
, new_isec
->sid
,
1301 (new_is_dir
? DIR__RMDIR
: FILE__UNLINK
), &ad
);
1309 /* Check whether a task can perform a filesystem operation. */
1310 static int superblock_has_perm(struct task_struct
*tsk
,
1311 struct super_block
*sb
,
1313 struct avc_audit_data
*ad
)
1315 struct task_security_struct
*tsec
;
1316 struct superblock_security_struct
*sbsec
;
1318 tsec
= tsk
->security
;
1319 sbsec
= sb
->s_security
;
1320 return avc_has_perm(tsec
->sid
, sbsec
->sid
, SECCLASS_FILESYSTEM
,
1324 /* Convert a Linux mode and permission mask to an access vector. */
1325 static inline u32
file_mask_to_av(int mode
, int mask
)
1329 if ((mode
& S_IFMT
) != S_IFDIR
) {
1330 if (mask
& MAY_EXEC
)
1331 av
|= FILE__EXECUTE
;
1332 if (mask
& MAY_READ
)
1335 if (mask
& MAY_APPEND
)
1337 else if (mask
& MAY_WRITE
)
1341 if (mask
& MAY_EXEC
)
1343 if (mask
& MAY_WRITE
)
1345 if (mask
& MAY_READ
)
1352 /* Convert a Linux file to an access vector. */
1353 static inline u32
file_to_av(struct file
*file
)
1357 if (file
->f_mode
& FMODE_READ
)
1359 if (file
->f_mode
& FMODE_WRITE
) {
1360 if (file
->f_flags
& O_APPEND
)
1369 /* Hook functions begin here. */
1371 static int selinux_ptrace(struct task_struct
*parent
, struct task_struct
*child
)
1373 struct task_security_struct
*psec
= parent
->security
;
1374 struct task_security_struct
*csec
= child
->security
;
1377 rc
= secondary_ops
->ptrace(parent
,child
);
1381 rc
= task_has_perm(parent
, child
, PROCESS__PTRACE
);
1382 /* Save the SID of the tracing process for later use in apply_creds. */
1383 if (!(child
->ptrace
& PT_PTRACED
) && !rc
)
1384 csec
->ptrace_sid
= psec
->sid
;
1388 static int selinux_capget(struct task_struct
*target
, kernel_cap_t
*effective
,
1389 kernel_cap_t
*inheritable
, kernel_cap_t
*permitted
)
1393 error
= task_has_perm(current
, target
, PROCESS__GETCAP
);
1397 return secondary_ops
->capget(target
, effective
, inheritable
, permitted
);
1400 static int selinux_capset_check(struct task_struct
*target
, kernel_cap_t
*effective
,
1401 kernel_cap_t
*inheritable
, kernel_cap_t
*permitted
)
1405 error
= secondary_ops
->capset_check(target
, effective
, inheritable
, permitted
);
1409 return task_has_perm(current
, target
, PROCESS__SETCAP
);
1412 static void selinux_capset_set(struct task_struct
*target
, kernel_cap_t
*effective
,
1413 kernel_cap_t
*inheritable
, kernel_cap_t
*permitted
)
1415 secondary_ops
->capset_set(target
, effective
, inheritable
, permitted
);
1418 static int selinux_capable(struct task_struct
*tsk
, int cap
)
1422 rc
= secondary_ops
->capable(tsk
, cap
);
1426 return task_has_capability(tsk
,cap
);
1429 static int selinux_sysctl_get_sid(ctl_table
*table
, u16 tclass
, u32
*sid
)
1432 char *buffer
, *path
, *end
;
1435 buffer
= (char*)__get_free_page(GFP_KERNEL
);
1440 end
= buffer
+buflen
;
1446 const char *name
= table
->procname
;
1447 size_t namelen
= strlen(name
);
1448 buflen
-= namelen
+ 1;
1452 memcpy(end
, name
, namelen
);
1455 table
= table
->parent
;
1461 memcpy(end
, "/sys", 4);
1463 rc
= security_genfs_sid("proc", path
, tclass
, sid
);
1465 free_page((unsigned long)buffer
);
1470 static int selinux_sysctl(ctl_table
*table
, int op
)
1474 struct task_security_struct
*tsec
;
1478 rc
= secondary_ops
->sysctl(table
, op
);
1482 tsec
= current
->security
;
1484 rc
= selinux_sysctl_get_sid(table
, (op
== 0001) ?
1485 SECCLASS_DIR
: SECCLASS_FILE
, &tsid
);
1487 /* Default to the well-defined sysctl SID. */
1488 tsid
= SECINITSID_SYSCTL
;
1491 /* The op values are "defined" in sysctl.c, thereby creating
1492 * a bad coupling between this module and sysctl.c */
1494 error
= avc_has_perm(tsec
->sid
, tsid
,
1495 SECCLASS_DIR
, DIR__SEARCH
, NULL
);
1503 error
= avc_has_perm(tsec
->sid
, tsid
,
1504 SECCLASS_FILE
, av
, NULL
);
1510 static int selinux_quotactl(int cmds
, int type
, int id
, struct super_block
*sb
)
1523 rc
= superblock_has_perm(current
,
1525 FILESYSTEM__QUOTAMOD
, NULL
);
1530 rc
= superblock_has_perm(current
,
1532 FILESYSTEM__QUOTAGET
, NULL
);
1535 rc
= 0; /* let the kernel handle invalid cmds */
1541 static int selinux_quota_on(struct dentry
*dentry
)
1543 return dentry_has_perm(current
, NULL
, dentry
, FILE__QUOTAON
);
1546 static int selinux_syslog(int type
)
1550 rc
= secondary_ops
->syslog(type
);
1555 case 3: /* Read last kernel messages */
1556 case 10: /* Return size of the log buffer */
1557 rc
= task_has_system(current
, SYSTEM__SYSLOG_READ
);
1559 case 6: /* Disable logging to console */
1560 case 7: /* Enable logging to console */
1561 case 8: /* Set level of messages printed to console */
1562 rc
= task_has_system(current
, SYSTEM__SYSLOG_CONSOLE
);
1564 case 0: /* Close log */
1565 case 1: /* Open log */
1566 case 2: /* Read from log */
1567 case 4: /* Read/clear last kernel messages */
1568 case 5: /* Clear ring buffer */
1570 rc
= task_has_system(current
, SYSTEM__SYSLOG_MOD
);
1577 * Check that a process has enough memory to allocate a new virtual
1578 * mapping. 0 means there is enough memory for the allocation to
1579 * succeed and -ENOMEM implies there is not.
1581 * Note that secondary_ops->capable and task_has_perm_noaudit return 0
1582 * if the capability is granted, but __vm_enough_memory requires 1 if
1583 * the capability is granted.
1585 * Do not audit the selinux permission check, as this is applied to all
1586 * processes that allocate mappings.
1588 static int selinux_vm_enough_memory(long pages
)
1590 int rc
, cap_sys_admin
= 0;
1591 struct task_security_struct
*tsec
= current
->security
;
1593 rc
= secondary_ops
->capable(current
, CAP_SYS_ADMIN
);
1595 rc
= avc_has_perm_noaudit(tsec
->sid
, tsec
->sid
,
1596 SECCLASS_CAPABILITY
,
1597 CAP_TO_MASK(CAP_SYS_ADMIN
),
1603 return __vm_enough_memory(pages
, cap_sys_admin
);
1606 /* binprm security operations */
1608 static int selinux_bprm_alloc_security(struct linux_binprm
*bprm
)
1610 struct bprm_security_struct
*bsec
;
1612 bsec
= kzalloc(sizeof(struct bprm_security_struct
), GFP_KERNEL
);
1617 bsec
->sid
= SECINITSID_UNLABELED
;
1620 bprm
->security
= bsec
;
1624 static int selinux_bprm_set_security(struct linux_binprm
*bprm
)
1626 struct task_security_struct
*tsec
;
1627 struct inode
*inode
= bprm
->file
->f_path
.dentry
->d_inode
;
1628 struct inode_security_struct
*isec
;
1629 struct bprm_security_struct
*bsec
;
1631 struct avc_audit_data ad
;
1634 rc
= secondary_ops
->bprm_set_security(bprm
);
1638 bsec
= bprm
->security
;
1643 tsec
= current
->security
;
1644 isec
= inode
->i_security
;
1646 /* Default to the current task SID. */
1647 bsec
->sid
= tsec
->sid
;
1649 /* Reset fs, key, and sock SIDs on execve. */
1650 tsec
->create_sid
= 0;
1651 tsec
->keycreate_sid
= 0;
1652 tsec
->sockcreate_sid
= 0;
1654 if (tsec
->exec_sid
) {
1655 newsid
= tsec
->exec_sid
;
1656 /* Reset exec SID on execve. */
1659 /* Check for a default transition on this program. */
1660 rc
= security_transition_sid(tsec
->sid
, isec
->sid
,
1661 SECCLASS_PROCESS
, &newsid
);
1666 AVC_AUDIT_DATA_INIT(&ad
, FS
);
1667 ad
.u
.fs
.mnt
= bprm
->file
->f_path
.mnt
;
1668 ad
.u
.fs
.dentry
= bprm
->file
->f_path
.dentry
;
1670 if (bprm
->file
->f_path
.mnt
->mnt_flags
& MNT_NOSUID
)
1673 if (tsec
->sid
== newsid
) {
1674 rc
= avc_has_perm(tsec
->sid
, isec
->sid
,
1675 SECCLASS_FILE
, FILE__EXECUTE_NO_TRANS
, &ad
);
1679 /* Check permissions for the transition. */
1680 rc
= avc_has_perm(tsec
->sid
, newsid
,
1681 SECCLASS_PROCESS
, PROCESS__TRANSITION
, &ad
);
1685 rc
= avc_has_perm(newsid
, isec
->sid
,
1686 SECCLASS_FILE
, FILE__ENTRYPOINT
, &ad
);
1690 /* Clear any possibly unsafe personality bits on exec: */
1691 current
->personality
&= ~PER_CLEAR_ON_SETID
;
1693 /* Set the security field to the new SID. */
1701 static int selinux_bprm_check_security (struct linux_binprm
*bprm
)
1703 return secondary_ops
->bprm_check_security(bprm
);
1707 static int selinux_bprm_secureexec (struct linux_binprm
*bprm
)
1709 struct task_security_struct
*tsec
= current
->security
;
1712 if (tsec
->osid
!= tsec
->sid
) {
1713 /* Enable secure mode for SIDs transitions unless
1714 the noatsecure permission is granted between
1715 the two SIDs, i.e. ahp returns 0. */
1716 atsecure
= avc_has_perm(tsec
->osid
, tsec
->sid
,
1718 PROCESS__NOATSECURE
, NULL
);
1721 return (atsecure
|| secondary_ops
->bprm_secureexec(bprm
));
1724 static void selinux_bprm_free_security(struct linux_binprm
*bprm
)
1726 kfree(bprm
->security
);
1727 bprm
->security
= NULL
;
1730 extern struct vfsmount
*selinuxfs_mount
;
1731 extern struct dentry
*selinux_null
;
1733 /* Derived from fs/exec.c:flush_old_files. */
1734 static inline void flush_unauthorized_files(struct files_struct
* files
)
1736 struct avc_audit_data ad
;
1737 struct file
*file
, *devnull
= NULL
;
1738 struct tty_struct
*tty
;
1739 struct fdtable
*fdt
;
1743 mutex_lock(&tty_mutex
);
1744 tty
= get_current_tty();
1747 file
= list_entry(tty
->tty_files
.next
, typeof(*file
), f_u
.fu_list
);
1749 /* Revalidate access to controlling tty.
1750 Use inode_has_perm on the tty inode directly rather
1751 than using file_has_perm, as this particular open
1752 file may belong to another process and we are only
1753 interested in the inode-based check here. */
1754 struct inode
*inode
= file
->f_path
.dentry
->d_inode
;
1755 if (inode_has_perm(current
, inode
,
1756 FILE__READ
| FILE__WRITE
, NULL
)) {
1762 mutex_unlock(&tty_mutex
);
1763 /* Reset controlling tty. */
1767 /* Revalidate access to inherited open files. */
1769 AVC_AUDIT_DATA_INIT(&ad
,FS
);
1771 spin_lock(&files
->file_lock
);
1773 unsigned long set
, i
;
1778 fdt
= files_fdtable(files
);
1779 if (i
>= fdt
->max_fds
)
1781 set
= fdt
->open_fds
->fds_bits
[j
];
1784 spin_unlock(&files
->file_lock
);
1785 for ( ; set
; i
++,set
>>= 1) {
1790 if (file_has_perm(current
,
1792 file_to_av(file
))) {
1794 fd
= get_unused_fd();
1804 devnull
= dentry_open(dget(selinux_null
), mntget(selinuxfs_mount
), O_RDWR
);
1805 if (IS_ERR(devnull
)) {
1812 fd_install(fd
, devnull
);
1817 spin_lock(&files
->file_lock
);
1820 spin_unlock(&files
->file_lock
);
1823 static void selinux_bprm_apply_creds(struct linux_binprm
*bprm
, int unsafe
)
1825 struct task_security_struct
*tsec
;
1826 struct bprm_security_struct
*bsec
;
1830 secondary_ops
->bprm_apply_creds(bprm
, unsafe
);
1832 tsec
= current
->security
;
1834 bsec
= bprm
->security
;
1837 tsec
->osid
= tsec
->sid
;
1839 if (tsec
->sid
!= sid
) {
1840 /* Check for shared state. If not ok, leave SID
1841 unchanged and kill. */
1842 if (unsafe
& LSM_UNSAFE_SHARE
) {
1843 rc
= avc_has_perm(tsec
->sid
, sid
, SECCLASS_PROCESS
,
1844 PROCESS__SHARE
, NULL
);
1851 /* Check for ptracing, and update the task SID if ok.
1852 Otherwise, leave SID unchanged and kill. */
1853 if (unsafe
& (LSM_UNSAFE_PTRACE
| LSM_UNSAFE_PTRACE_CAP
)) {
1854 rc
= avc_has_perm(tsec
->ptrace_sid
, sid
,
1855 SECCLASS_PROCESS
, PROCESS__PTRACE
,
1867 * called after apply_creds without the task lock held
1869 static void selinux_bprm_post_apply_creds(struct linux_binprm
*bprm
)
1871 struct task_security_struct
*tsec
;
1872 struct rlimit
*rlim
, *initrlim
;
1873 struct itimerval itimer
;
1874 struct bprm_security_struct
*bsec
;
1877 tsec
= current
->security
;
1878 bsec
= bprm
->security
;
1881 force_sig_specific(SIGKILL
, current
);
1884 if (tsec
->osid
== tsec
->sid
)
1887 /* Close files for which the new task SID is not authorized. */
1888 flush_unauthorized_files(current
->files
);
1890 /* Check whether the new SID can inherit signal state
1891 from the old SID. If not, clear itimers to avoid
1892 subsequent signal generation and flush and unblock
1893 signals. This must occur _after_ the task SID has
1894 been updated so that any kill done after the flush
1895 will be checked against the new SID. */
1896 rc
= avc_has_perm(tsec
->osid
, tsec
->sid
, SECCLASS_PROCESS
,
1897 PROCESS__SIGINH
, NULL
);
1899 memset(&itimer
, 0, sizeof itimer
);
1900 for (i
= 0; i
< 3; i
++)
1901 do_setitimer(i
, &itimer
, NULL
);
1902 flush_signals(current
);
1903 spin_lock_irq(¤t
->sighand
->siglock
);
1904 flush_signal_handlers(current
, 1);
1905 sigemptyset(¤t
->blocked
);
1906 recalc_sigpending();
1907 spin_unlock_irq(¤t
->sighand
->siglock
);
1910 /* Check whether the new SID can inherit resource limits
1911 from the old SID. If not, reset all soft limits to
1912 the lower of the current task's hard limit and the init
1913 task's soft limit. Note that the setting of hard limits
1914 (even to lower them) can be controlled by the setrlimit
1915 check. The inclusion of the init task's soft limit into
1916 the computation is to avoid resetting soft limits higher
1917 than the default soft limit for cases where the default
1918 is lower than the hard limit, e.g. RLIMIT_CORE or
1920 rc
= avc_has_perm(tsec
->osid
, tsec
->sid
, SECCLASS_PROCESS
,
1921 PROCESS__RLIMITINH
, NULL
);
1923 for (i
= 0; i
< RLIM_NLIMITS
; i
++) {
1924 rlim
= current
->signal
->rlim
+ i
;
1925 initrlim
= init_task
.signal
->rlim
+i
;
1926 rlim
->rlim_cur
= min(rlim
->rlim_max
,initrlim
->rlim_cur
);
1928 if (current
->signal
->rlim
[RLIMIT_CPU
].rlim_cur
!= RLIM_INFINITY
) {
1930 * This will cause RLIMIT_CPU calculations
1933 current
->it_prof_expires
= jiffies_to_cputime(1);
1937 /* Wake up the parent if it is waiting so that it can
1938 recheck wait permission to the new task SID. */
1939 wake_up_interruptible(¤t
->parent
->signal
->wait_chldexit
);
1942 /* superblock security operations */
1944 static int selinux_sb_alloc_security(struct super_block
*sb
)
1946 return superblock_alloc_security(sb
);
1949 static void selinux_sb_free_security(struct super_block
*sb
)
1951 superblock_free_security(sb
);
1954 static inline int match_prefix(char *prefix
, int plen
, char *option
, int olen
)
1959 return !memcmp(prefix
, option
, plen
);
1962 static inline int selinux_option(char *option
, int len
)
1964 return (match_prefix("context=", sizeof("context=")-1, option
, len
) ||
1965 match_prefix("fscontext=", sizeof("fscontext=")-1, option
, len
) ||
1966 match_prefix("defcontext=", sizeof("defcontext=")-1, option
, len
) ||
1967 match_prefix("rootcontext=", sizeof("rootcontext=")-1, option
, len
));
1970 static inline void take_option(char **to
, char *from
, int *first
, int len
)
1977 memcpy(*to
, from
, len
);
1981 static inline void take_selinux_option(char **to
, char *from
, int *first
,
1984 int current_size
= 0;
1993 while (current_size
< len
) {
2003 static int selinux_sb_copy_data(struct file_system_type
*type
, void *orig
, void *copy
)
2005 int fnosec
, fsec
, rc
= 0;
2006 char *in_save
, *in_curr
, *in_end
;
2007 char *sec_curr
, *nosec_save
, *nosec
;
2013 /* Binary mount data: just copy */
2014 if (type
->fs_flags
& FS_BINARY_MOUNTDATA
) {
2015 copy_page(sec_curr
, in_curr
);
2019 nosec
= (char *)get_zeroed_page(GFP_KERNEL
);
2027 in_save
= in_end
= orig
;
2031 open_quote
= !open_quote
;
2032 if ((*in_end
== ',' && open_quote
== 0) ||
2034 int len
= in_end
- in_curr
;
2036 if (selinux_option(in_curr
, len
))
2037 take_selinux_option(&sec_curr
, in_curr
, &fsec
, len
);
2039 take_option(&nosec
, in_curr
, &fnosec
, len
);
2041 in_curr
= in_end
+ 1;
2043 } while (*in_end
++);
2045 strcpy(in_save
, nosec_save
);
2046 free_page((unsigned long)nosec_save
);
2051 static int selinux_sb_kern_mount(struct super_block
*sb
, void *data
)
2053 struct avc_audit_data ad
;
2056 rc
= superblock_doinit(sb
, data
);
2060 AVC_AUDIT_DATA_INIT(&ad
,FS
);
2061 ad
.u
.fs
.dentry
= sb
->s_root
;
2062 return superblock_has_perm(current
, sb
, FILESYSTEM__MOUNT
, &ad
);
2065 static int selinux_sb_statfs(struct dentry
*dentry
)
2067 struct avc_audit_data ad
;
2069 AVC_AUDIT_DATA_INIT(&ad
,FS
);
2070 ad
.u
.fs
.dentry
= dentry
->d_sb
->s_root
;
2071 return superblock_has_perm(current
, dentry
->d_sb
, FILESYSTEM__GETATTR
, &ad
);
2074 static int selinux_mount(char * dev_name
,
2075 struct nameidata
*nd
,
2077 unsigned long flags
,
2082 rc
= secondary_ops
->sb_mount(dev_name
, nd
, type
, flags
, data
);
2086 if (flags
& MS_REMOUNT
)
2087 return superblock_has_perm(current
, nd
->mnt
->mnt_sb
,
2088 FILESYSTEM__REMOUNT
, NULL
);
2090 return dentry_has_perm(current
, nd
->mnt
, nd
->dentry
,
2094 static int selinux_umount(struct vfsmount
*mnt
, int flags
)
2098 rc
= secondary_ops
->sb_umount(mnt
, flags
);
2102 return superblock_has_perm(current
,mnt
->mnt_sb
,
2103 FILESYSTEM__UNMOUNT
,NULL
);
2106 /* inode security operations */
2108 static int selinux_inode_alloc_security(struct inode
*inode
)
2110 return inode_alloc_security(inode
);
2113 static void selinux_inode_free_security(struct inode
*inode
)
2115 inode_free_security(inode
);
2118 static int selinux_inode_init_security(struct inode
*inode
, struct inode
*dir
,
2119 char **name
, void **value
,
2122 struct task_security_struct
*tsec
;
2123 struct inode_security_struct
*dsec
;
2124 struct superblock_security_struct
*sbsec
;
2127 char *namep
= NULL
, *context
;
2129 tsec
= current
->security
;
2130 dsec
= dir
->i_security
;
2131 sbsec
= dir
->i_sb
->s_security
;
2133 if (tsec
->create_sid
&& sbsec
->behavior
!= SECURITY_FS_USE_MNTPOINT
) {
2134 newsid
= tsec
->create_sid
;
2136 rc
= security_transition_sid(tsec
->sid
, dsec
->sid
,
2137 inode_mode_to_security_class(inode
->i_mode
),
2140 printk(KERN_WARNING
"%s: "
2141 "security_transition_sid failed, rc=%d (dev=%s "
2144 -rc
, inode
->i_sb
->s_id
, inode
->i_ino
);
2149 /* Possibly defer initialization to selinux_complete_init. */
2150 if (sbsec
->initialized
) {
2151 struct inode_security_struct
*isec
= inode
->i_security
;
2152 isec
->sclass
= inode_mode_to_security_class(inode
->i_mode
);
2154 isec
->initialized
= 1;
2157 if (!ss_initialized
|| sbsec
->behavior
== SECURITY_FS_USE_MNTPOINT
)
2161 namep
= kstrdup(XATTR_SELINUX_SUFFIX
, GFP_KERNEL
);
2168 rc
= security_sid_to_context(newsid
, &context
, &clen
);
2180 static int selinux_inode_create(struct inode
*dir
, struct dentry
*dentry
, int mask
)
2182 return may_create(dir
, dentry
, SECCLASS_FILE
);
2185 static int selinux_inode_link(struct dentry
*old_dentry
, struct inode
*dir
, struct dentry
*new_dentry
)
2189 rc
= secondary_ops
->inode_link(old_dentry
,dir
,new_dentry
);
2192 return may_link(dir
, old_dentry
, MAY_LINK
);
2195 static int selinux_inode_unlink(struct inode
*dir
, struct dentry
*dentry
)
2199 rc
= secondary_ops
->inode_unlink(dir
, dentry
);
2202 return may_link(dir
, dentry
, MAY_UNLINK
);
2205 static int selinux_inode_symlink(struct inode
*dir
, struct dentry
*dentry
, const char *name
)
2207 return may_create(dir
, dentry
, SECCLASS_LNK_FILE
);
2210 static int selinux_inode_mkdir(struct inode
*dir
, struct dentry
*dentry
, int mask
)
2212 return may_create(dir
, dentry
, SECCLASS_DIR
);
2215 static int selinux_inode_rmdir(struct inode
*dir
, struct dentry
*dentry
)
2217 return may_link(dir
, dentry
, MAY_RMDIR
);
2220 static int selinux_inode_mknod(struct inode
*dir
, struct dentry
*dentry
, int mode
, dev_t dev
)
2224 rc
= secondary_ops
->inode_mknod(dir
, dentry
, mode
, dev
);
2228 return may_create(dir
, dentry
, inode_mode_to_security_class(mode
));
2231 static int selinux_inode_rename(struct inode
*old_inode
, struct dentry
*old_dentry
,
2232 struct inode
*new_inode
, struct dentry
*new_dentry
)
2234 return may_rename(old_inode
, old_dentry
, new_inode
, new_dentry
);
2237 static int selinux_inode_readlink(struct dentry
*dentry
)
2239 return dentry_has_perm(current
, NULL
, dentry
, FILE__READ
);
2242 static int selinux_inode_follow_link(struct dentry
*dentry
, struct nameidata
*nameidata
)
2246 rc
= secondary_ops
->inode_follow_link(dentry
,nameidata
);
2249 return dentry_has_perm(current
, NULL
, dentry
, FILE__READ
);
2252 static int selinux_inode_permission(struct inode
*inode
, int mask
,
2253 struct nameidata
*nd
)
2257 rc
= secondary_ops
->inode_permission(inode
, mask
, nd
);
2262 /* No permission to check. Existence test. */
2266 return inode_has_perm(current
, inode
,
2267 file_mask_to_av(inode
->i_mode
, mask
), NULL
);
2270 static int selinux_inode_setattr(struct dentry
*dentry
, struct iattr
*iattr
)
2274 rc
= secondary_ops
->inode_setattr(dentry
, iattr
);
2278 if (iattr
->ia_valid
& ATTR_FORCE
)
2281 if (iattr
->ia_valid
& (ATTR_MODE
| ATTR_UID
| ATTR_GID
|
2282 ATTR_ATIME_SET
| ATTR_MTIME_SET
))
2283 return dentry_has_perm(current
, NULL
, dentry
, FILE__SETATTR
);
2285 return dentry_has_perm(current
, NULL
, dentry
, FILE__WRITE
);
2288 static int selinux_inode_getattr(struct vfsmount
*mnt
, struct dentry
*dentry
)
2290 return dentry_has_perm(current
, mnt
, dentry
, FILE__GETATTR
);
2293 static int selinux_inode_setxattr(struct dentry
*dentry
, char *name
, void *value
, size_t size
, int flags
)
2295 struct task_security_struct
*tsec
= current
->security
;
2296 struct inode
*inode
= dentry
->d_inode
;
2297 struct inode_security_struct
*isec
= inode
->i_security
;
2298 struct superblock_security_struct
*sbsec
;
2299 struct avc_audit_data ad
;
2303 if (strcmp(name
, XATTR_NAME_SELINUX
)) {
2304 if (!strncmp(name
, XATTR_SECURITY_PREFIX
,
2305 sizeof XATTR_SECURITY_PREFIX
- 1) &&
2306 !capable(CAP_SYS_ADMIN
)) {
2307 /* A different attribute in the security namespace.
2308 Restrict to administrator. */
2312 /* Not an attribute we recognize, so just check the
2313 ordinary setattr permission. */
2314 return dentry_has_perm(current
, NULL
, dentry
, FILE__SETATTR
);
2317 sbsec
= inode
->i_sb
->s_security
;
2318 if (sbsec
->behavior
== SECURITY_FS_USE_MNTPOINT
)
2321 if ((current
->fsuid
!= inode
->i_uid
) && !capable(CAP_FOWNER
))
2324 AVC_AUDIT_DATA_INIT(&ad
,FS
);
2325 ad
.u
.fs
.dentry
= dentry
;
2327 rc
= avc_has_perm(tsec
->sid
, isec
->sid
, isec
->sclass
,
2328 FILE__RELABELFROM
, &ad
);
2332 rc
= security_context_to_sid(value
, size
, &newsid
);
2336 rc
= avc_has_perm(tsec
->sid
, newsid
, isec
->sclass
,
2337 FILE__RELABELTO
, &ad
);
2341 rc
= security_validate_transition(isec
->sid
, newsid
, tsec
->sid
,
2346 return avc_has_perm(newsid
,
2348 SECCLASS_FILESYSTEM
,
2349 FILESYSTEM__ASSOCIATE
,
2353 static void selinux_inode_post_setxattr(struct dentry
*dentry
, char *name
,
2354 void *value
, size_t size
, int flags
)
2356 struct inode
*inode
= dentry
->d_inode
;
2357 struct inode_security_struct
*isec
= inode
->i_security
;
2361 if (strcmp(name
, XATTR_NAME_SELINUX
)) {
2362 /* Not an attribute we recognize, so nothing to do. */
2366 rc
= security_context_to_sid(value
, size
, &newsid
);
2368 printk(KERN_WARNING
"%s: unable to obtain SID for context "
2369 "%s, rc=%d\n", __FUNCTION__
, (char*)value
, -rc
);
2377 static int selinux_inode_getxattr (struct dentry
*dentry
, char *name
)
2379 return dentry_has_perm(current
, NULL
, dentry
, FILE__GETATTR
);
2382 static int selinux_inode_listxattr (struct dentry
*dentry
)
2384 return dentry_has_perm(current
, NULL
, dentry
, FILE__GETATTR
);
2387 static int selinux_inode_removexattr (struct dentry
*dentry
, char *name
)
2389 if (strcmp(name
, XATTR_NAME_SELINUX
)) {
2390 if (!strncmp(name
, XATTR_SECURITY_PREFIX
,
2391 sizeof XATTR_SECURITY_PREFIX
- 1) &&
2392 !capable(CAP_SYS_ADMIN
)) {
2393 /* A different attribute in the security namespace.
2394 Restrict to administrator. */
2398 /* Not an attribute we recognize, so just check the
2399 ordinary setattr permission. Might want a separate
2400 permission for removexattr. */
2401 return dentry_has_perm(current
, NULL
, dentry
, FILE__SETATTR
);
2404 /* No one is allowed to remove a SELinux security label.
2405 You can change the label, but all data must be labeled. */
2409 static const char *selinux_inode_xattr_getsuffix(void)
2411 return XATTR_SELINUX_SUFFIX
;
2415 * Copy the in-core inode security context value to the user. If the
2416 * getxattr() prior to this succeeded, check to see if we need to
2417 * canonicalize the value to be finally returned to the user.
2419 * Permission check is handled by selinux_inode_getxattr hook.
2421 static int selinux_inode_getsecurity(const struct inode
*inode
, const char *name
, void *buffer
, size_t size
, int err
)
2423 struct inode_security_struct
*isec
= inode
->i_security
;
2425 if (strcmp(name
, XATTR_SELINUX_SUFFIX
))
2428 return selinux_getsecurity(isec
->sid
, buffer
, size
);
2431 static int selinux_inode_setsecurity(struct inode
*inode
, const char *name
,
2432 const void *value
, size_t size
, int flags
)
2434 struct inode_security_struct
*isec
= inode
->i_security
;
2438 if (strcmp(name
, XATTR_SELINUX_SUFFIX
))
2441 if (!value
|| !size
)
2444 rc
= security_context_to_sid((void*)value
, size
, &newsid
);
2452 static int selinux_inode_listsecurity(struct inode
*inode
, char *buffer
, size_t buffer_size
)
2454 const int len
= sizeof(XATTR_NAME_SELINUX
);
2455 if (buffer
&& len
<= buffer_size
)
2456 memcpy(buffer
, XATTR_NAME_SELINUX
, len
);
2460 /* file security operations */
2462 static int selinux_file_permission(struct file
*file
, int mask
)
2465 struct inode
*inode
= file
->f_path
.dentry
->d_inode
;
2468 /* No permission to check. Existence test. */
2472 /* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */
2473 if ((file
->f_flags
& O_APPEND
) && (mask
& MAY_WRITE
))
2476 rc
= file_has_perm(current
, file
,
2477 file_mask_to_av(inode
->i_mode
, mask
));
2481 return selinux_netlbl_inode_permission(inode
, mask
);
2484 static int selinux_file_alloc_security(struct file
*file
)
2486 return file_alloc_security(file
);
2489 static void selinux_file_free_security(struct file
*file
)
2491 file_free_security(file
);
2494 static int selinux_file_ioctl(struct file
*file
, unsigned int cmd
,
2506 case EXT2_IOC_GETFLAGS
:
2508 case EXT2_IOC_GETVERSION
:
2509 error
= file_has_perm(current
, file
, FILE__GETATTR
);
2512 case EXT2_IOC_SETFLAGS
:
2514 case EXT2_IOC_SETVERSION
:
2515 error
= file_has_perm(current
, file
, FILE__SETATTR
);
2518 /* sys_ioctl() checks */
2522 error
= file_has_perm(current
, file
, 0);
2527 error
= task_has_capability(current
,CAP_SYS_TTY_CONFIG
);
2530 /* default case assumes that the command will go
2531 * to the file's ioctl() function.
2534 error
= file_has_perm(current
, file
, FILE__IOCTL
);
2540 static int file_map_prot_check(struct file
*file
, unsigned long prot
, int shared
)
2542 #ifndef CONFIG_PPC32
2543 if ((prot
& PROT_EXEC
) && (!file
|| (!shared
&& (prot
& PROT_WRITE
)))) {
2545 * We are making executable an anonymous mapping or a
2546 * private file mapping that will also be writable.
2547 * This has an additional check.
2549 int rc
= task_has_perm(current
, current
, PROCESS__EXECMEM
);
2556 /* read access is always possible with a mapping */
2557 u32 av
= FILE__READ
;
2559 /* write access only matters if the mapping is shared */
2560 if (shared
&& (prot
& PROT_WRITE
))
2563 if (prot
& PROT_EXEC
)
2564 av
|= FILE__EXECUTE
;
2566 return file_has_perm(current
, file
, av
);
2571 static int selinux_file_mmap(struct file
*file
, unsigned long reqprot
,
2572 unsigned long prot
, unsigned long flags
)
2576 rc
= secondary_ops
->file_mmap(file
, reqprot
, prot
, flags
);
2580 if (selinux_checkreqprot
)
2583 return file_map_prot_check(file
, prot
,
2584 (flags
& MAP_TYPE
) == MAP_SHARED
);
2587 static int selinux_file_mprotect(struct vm_area_struct
*vma
,
2588 unsigned long reqprot
,
2593 rc
= secondary_ops
->file_mprotect(vma
, reqprot
, prot
);
2597 if (selinux_checkreqprot
)
2600 #ifndef CONFIG_PPC32
2601 if ((prot
& PROT_EXEC
) && !(vma
->vm_flags
& VM_EXEC
)) {
2603 if (vma
->vm_start
>= vma
->vm_mm
->start_brk
&&
2604 vma
->vm_end
<= vma
->vm_mm
->brk
) {
2605 rc
= task_has_perm(current
, current
,
2607 } else if (!vma
->vm_file
&&
2608 vma
->vm_start
<= vma
->vm_mm
->start_stack
&&
2609 vma
->vm_end
>= vma
->vm_mm
->start_stack
) {
2610 rc
= task_has_perm(current
, current
, PROCESS__EXECSTACK
);
2611 } else if (vma
->vm_file
&& vma
->anon_vma
) {
2613 * We are making executable a file mapping that has
2614 * had some COW done. Since pages might have been
2615 * written, check ability to execute the possibly
2616 * modified content. This typically should only
2617 * occur for text relocations.
2619 rc
= file_has_perm(current
, vma
->vm_file
,
2627 return file_map_prot_check(vma
->vm_file
, prot
, vma
->vm_flags
&VM_SHARED
);
2630 static int selinux_file_lock(struct file
*file
, unsigned int cmd
)
2632 return file_has_perm(current
, file
, FILE__LOCK
);
2635 static int selinux_file_fcntl(struct file
*file
, unsigned int cmd
,
2642 if (!file
->f_path
.dentry
|| !file
->f_path
.dentry
->d_inode
) {
2647 if ((file
->f_flags
& O_APPEND
) && !(arg
& O_APPEND
)) {
2648 err
= file_has_perm(current
, file
,FILE__WRITE
);
2657 /* Just check FD__USE permission */
2658 err
= file_has_perm(current
, file
, 0);
2663 #if BITS_PER_LONG == 32
2668 if (!file
->f_path
.dentry
|| !file
->f_path
.dentry
->d_inode
) {
2672 err
= file_has_perm(current
, file
, FILE__LOCK
);
2679 static int selinux_file_set_fowner(struct file
*file
)
2681 struct task_security_struct
*tsec
;
2682 struct file_security_struct
*fsec
;
2684 tsec
= current
->security
;
2685 fsec
= file
->f_security
;
2686 fsec
->fown_sid
= tsec
->sid
;
2691 static int selinux_file_send_sigiotask(struct task_struct
*tsk
,
2692 struct fown_struct
*fown
, int signum
)
2696 struct task_security_struct
*tsec
;
2697 struct file_security_struct
*fsec
;
2699 /* struct fown_struct is never outside the context of a struct file */
2700 file
= container_of(fown
, struct file
, f_owner
);
2702 tsec
= tsk
->security
;
2703 fsec
= file
->f_security
;
2706 perm
= signal_to_av(SIGIO
); /* as per send_sigio_to_task */
2708 perm
= signal_to_av(signum
);
2710 return avc_has_perm(fsec
->fown_sid
, tsec
->sid
,
2711 SECCLASS_PROCESS
, perm
, NULL
);
2714 static int selinux_file_receive(struct file
*file
)
2716 return file_has_perm(current
, file
, file_to_av(file
));
2719 /* task security operations */
2721 static int selinux_task_create(unsigned long clone_flags
)
2725 rc
= secondary_ops
->task_create(clone_flags
);
2729 return task_has_perm(current
, current
, PROCESS__FORK
);
2732 static int selinux_task_alloc_security(struct task_struct
*tsk
)
2734 struct task_security_struct
*tsec1
, *tsec2
;
2737 tsec1
= current
->security
;
2739 rc
= task_alloc_security(tsk
);
2742 tsec2
= tsk
->security
;
2744 tsec2
->osid
= tsec1
->osid
;
2745 tsec2
->sid
= tsec1
->sid
;
2747 /* Retain the exec, fs, key, and sock SIDs across fork */
2748 tsec2
->exec_sid
= tsec1
->exec_sid
;
2749 tsec2
->create_sid
= tsec1
->create_sid
;
2750 tsec2
->keycreate_sid
= tsec1
->keycreate_sid
;
2751 tsec2
->sockcreate_sid
= tsec1
->sockcreate_sid
;
2753 /* Retain ptracer SID across fork, if any.
2754 This will be reset by the ptrace hook upon any
2755 subsequent ptrace_attach operations. */
2756 tsec2
->ptrace_sid
= tsec1
->ptrace_sid
;
2761 static void selinux_task_free_security(struct task_struct
*tsk
)
2763 task_free_security(tsk
);
2766 static int selinux_task_setuid(uid_t id0
, uid_t id1
, uid_t id2
, int flags
)
2768 /* Since setuid only affects the current process, and
2769 since the SELinux controls are not based on the Linux
2770 identity attributes, SELinux does not need to control
2771 this operation. However, SELinux does control the use
2772 of the CAP_SETUID and CAP_SETGID capabilities using the
2777 static int selinux_task_post_setuid(uid_t id0
, uid_t id1
, uid_t id2
, int flags
)
2779 return secondary_ops
->task_post_setuid(id0
,id1
,id2
,flags
);
2782 static int selinux_task_setgid(gid_t id0
, gid_t id1
, gid_t id2
, int flags
)
2784 /* See the comment for setuid above. */
2788 static int selinux_task_setpgid(struct task_struct
*p
, pid_t pgid
)
2790 return task_has_perm(current
, p
, PROCESS__SETPGID
);
2793 static int selinux_task_getpgid(struct task_struct
*p
)
2795 return task_has_perm(current
, p
, PROCESS__GETPGID
);
2798 static int selinux_task_getsid(struct task_struct
*p
)
2800 return task_has_perm(current
, p
, PROCESS__GETSESSION
);
2803 static void selinux_task_getsecid(struct task_struct
*p
, u32
*secid
)
2805 selinux_get_task_sid(p
, secid
);
2808 static int selinux_task_setgroups(struct group_info
*group_info
)
2810 /* See the comment for setuid above. */
2814 static int selinux_task_setnice(struct task_struct
*p
, int nice
)
2818 rc
= secondary_ops
->task_setnice(p
, nice
);
2822 return task_has_perm(current
,p
, PROCESS__SETSCHED
);
2825 static int selinux_task_setioprio(struct task_struct
*p
, int ioprio
)
2827 return task_has_perm(current
, p
, PROCESS__SETSCHED
);
2830 static int selinux_task_getioprio(struct task_struct
*p
)
2832 return task_has_perm(current
, p
, PROCESS__GETSCHED
);
2835 static int selinux_task_setrlimit(unsigned int resource
, struct rlimit
*new_rlim
)
2837 struct rlimit
*old_rlim
= current
->signal
->rlim
+ resource
;
2840 rc
= secondary_ops
->task_setrlimit(resource
, new_rlim
);
2844 /* Control the ability to change the hard limit (whether
2845 lowering or raising it), so that the hard limit can
2846 later be used as a safe reset point for the soft limit
2847 upon context transitions. See selinux_bprm_apply_creds. */
2848 if (old_rlim
->rlim_max
!= new_rlim
->rlim_max
)
2849 return task_has_perm(current
, current
, PROCESS__SETRLIMIT
);
2854 static int selinux_task_setscheduler(struct task_struct
*p
, int policy
, struct sched_param
*lp
)
2856 return task_has_perm(current
, p
, PROCESS__SETSCHED
);
2859 static int selinux_task_getscheduler(struct task_struct
*p
)
2861 return task_has_perm(current
, p
, PROCESS__GETSCHED
);
2864 static int selinux_task_movememory(struct task_struct
*p
)
2866 return task_has_perm(current
, p
, PROCESS__SETSCHED
);
2869 static int selinux_task_kill(struct task_struct
*p
, struct siginfo
*info
,
2874 struct task_security_struct
*tsec
;
2876 rc
= secondary_ops
->task_kill(p
, info
, sig
, secid
);
2880 if (info
!= SEND_SIG_NOINFO
&& (is_si_special(info
) || SI_FROMKERNEL(info
)))
2884 perm
= PROCESS__SIGNULL
; /* null signal; existence test */
2886 perm
= signal_to_av(sig
);
2889 rc
= avc_has_perm(secid
, tsec
->sid
, SECCLASS_PROCESS
, perm
, NULL
);
2891 rc
= task_has_perm(current
, p
, perm
);
2895 static int selinux_task_prctl(int option
,
2901 /* The current prctl operations do not appear to require
2902 any SELinux controls since they merely observe or modify
2903 the state of the current process. */
2907 static int selinux_task_wait(struct task_struct
*p
)
2911 perm
= signal_to_av(p
->exit_signal
);
2913 return task_has_perm(p
, current
, perm
);
2916 static void selinux_task_reparent_to_init(struct task_struct
*p
)
2918 struct task_security_struct
*tsec
;
2920 secondary_ops
->task_reparent_to_init(p
);
2923 tsec
->osid
= tsec
->sid
;
2924 tsec
->sid
= SECINITSID_KERNEL
;
2928 static void selinux_task_to_inode(struct task_struct
*p
,
2929 struct inode
*inode
)
2931 struct task_security_struct
*tsec
= p
->security
;
2932 struct inode_security_struct
*isec
= inode
->i_security
;
2934 isec
->sid
= tsec
->sid
;
2935 isec
->initialized
= 1;
2939 /* Returns error only if unable to parse addresses */
2940 static int selinux_parse_skb_ipv4(struct sk_buff
*skb
,
2941 struct avc_audit_data
*ad
, u8
*proto
)
2943 int offset
, ihlen
, ret
= -EINVAL
;
2944 struct iphdr _iph
, *ih
;
2946 offset
= skb_network_offset(skb
);
2947 ih
= skb_header_pointer(skb
, offset
, sizeof(_iph
), &_iph
);
2951 ihlen
= ih
->ihl
* 4;
2952 if (ihlen
< sizeof(_iph
))
2955 ad
->u
.net
.v4info
.saddr
= ih
->saddr
;
2956 ad
->u
.net
.v4info
.daddr
= ih
->daddr
;
2960 *proto
= ih
->protocol
;
2962 switch (ih
->protocol
) {
2964 struct tcphdr _tcph
, *th
;
2966 if (ntohs(ih
->frag_off
) & IP_OFFSET
)
2970 th
= skb_header_pointer(skb
, offset
, sizeof(_tcph
), &_tcph
);
2974 ad
->u
.net
.sport
= th
->source
;
2975 ad
->u
.net
.dport
= th
->dest
;
2980 struct udphdr _udph
, *uh
;
2982 if (ntohs(ih
->frag_off
) & IP_OFFSET
)
2986 uh
= skb_header_pointer(skb
, offset
, sizeof(_udph
), &_udph
);
2990 ad
->u
.net
.sport
= uh
->source
;
2991 ad
->u
.net
.dport
= uh
->dest
;
2995 case IPPROTO_DCCP
: {
2996 struct dccp_hdr _dccph
, *dh
;
2998 if (ntohs(ih
->frag_off
) & IP_OFFSET
)
3002 dh
= skb_header_pointer(skb
, offset
, sizeof(_dccph
), &_dccph
);
3006 ad
->u
.net
.sport
= dh
->dccph_sport
;
3007 ad
->u
.net
.dport
= dh
->dccph_dport
;
3018 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
3020 /* Returns error only if unable to parse addresses */
3021 static int selinux_parse_skb_ipv6(struct sk_buff
*skb
,
3022 struct avc_audit_data
*ad
, u8
*proto
)
3025 int ret
= -EINVAL
, offset
;
3026 struct ipv6hdr _ipv6h
, *ip6
;
3028 offset
= skb_network_offset(skb
);
3029 ip6
= skb_header_pointer(skb
, offset
, sizeof(_ipv6h
), &_ipv6h
);
3033 ipv6_addr_copy(&ad
->u
.net
.v6info
.saddr
, &ip6
->saddr
);
3034 ipv6_addr_copy(&ad
->u
.net
.v6info
.daddr
, &ip6
->daddr
);
3037 nexthdr
= ip6
->nexthdr
;
3038 offset
+= sizeof(_ipv6h
);
3039 offset
= ipv6_skip_exthdr(skb
, offset
, &nexthdr
);
3048 struct tcphdr _tcph
, *th
;
3050 th
= skb_header_pointer(skb
, offset
, sizeof(_tcph
), &_tcph
);
3054 ad
->u
.net
.sport
= th
->source
;
3055 ad
->u
.net
.dport
= th
->dest
;
3060 struct udphdr _udph
, *uh
;
3062 uh
= skb_header_pointer(skb
, offset
, sizeof(_udph
), &_udph
);
3066 ad
->u
.net
.sport
= uh
->source
;
3067 ad
->u
.net
.dport
= uh
->dest
;
3071 case IPPROTO_DCCP
: {
3072 struct dccp_hdr _dccph
, *dh
;
3074 dh
= skb_header_pointer(skb
, offset
, sizeof(_dccph
), &_dccph
);
3078 ad
->u
.net
.sport
= dh
->dccph_sport
;
3079 ad
->u
.net
.dport
= dh
->dccph_dport
;
3083 /* includes fragments */
3093 static int selinux_parse_skb(struct sk_buff
*skb
, struct avc_audit_data
*ad
,
3094 char **addrp
, int *len
, int src
, u8
*proto
)
3098 switch (ad
->u
.net
.family
) {
3100 ret
= selinux_parse_skb_ipv4(skb
, ad
, proto
);
3104 *addrp
= (char *)(src
? &ad
->u
.net
.v4info
.saddr
:
3105 &ad
->u
.net
.v4info
.daddr
);
3108 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
3110 ret
= selinux_parse_skb_ipv6(skb
, ad
, proto
);
3114 *addrp
= (char *)(src
? &ad
->u
.net
.v6info
.saddr
:
3115 &ad
->u
.net
.v6info
.daddr
);
3126 * selinux_skb_extlbl_sid - Determine the external label of a packet
3128 * @base_sid: the SELinux SID to use as a context for MLS only external labels
3129 * @sid: the packet's SID
3132 * Check the various different forms of external packet labeling and determine
3133 * the external SID for the packet.
3136 static void selinux_skb_extlbl_sid(struct sk_buff
*skb
,
3143 selinux_skb_xfrm_sid(skb
, &xfrm_sid
);
3144 if (selinux_netlbl_skbuff_getsid(skb
,
3145 (xfrm_sid
== SECSID_NULL
?
3146 base_sid
: xfrm_sid
),
3148 nlbl_sid
= SECSID_NULL
;
3150 *sid
= (nlbl_sid
== SECSID_NULL
? xfrm_sid
: nlbl_sid
);
3153 /* socket security operations */
3154 static int socket_has_perm(struct task_struct
*task
, struct socket
*sock
,
3157 struct inode_security_struct
*isec
;
3158 struct task_security_struct
*tsec
;
3159 struct avc_audit_data ad
;
3162 tsec
= task
->security
;
3163 isec
= SOCK_INODE(sock
)->i_security
;
3165 if (isec
->sid
== SECINITSID_KERNEL
)
3168 AVC_AUDIT_DATA_INIT(&ad
,NET
);
3169 ad
.u
.net
.sk
= sock
->sk
;
3170 err
= avc_has_perm(tsec
->sid
, isec
->sid
, isec
->sclass
, perms
, &ad
);
3176 static int selinux_socket_create(int family
, int type
,
3177 int protocol
, int kern
)
3180 struct task_security_struct
*tsec
;
3186 tsec
= current
->security
;
3187 newsid
= tsec
->sockcreate_sid
? : tsec
->sid
;
3188 err
= avc_has_perm(tsec
->sid
, newsid
,
3189 socket_type_to_security_class(family
, type
,
3190 protocol
), SOCKET__CREATE
, NULL
);
3196 static int selinux_socket_post_create(struct socket
*sock
, int family
,
3197 int type
, int protocol
, int kern
)
3200 struct inode_security_struct
*isec
;
3201 struct task_security_struct
*tsec
;
3202 struct sk_security_struct
*sksec
;
3205 isec
= SOCK_INODE(sock
)->i_security
;
3207 tsec
= current
->security
;
3208 newsid
= tsec
->sockcreate_sid
? : tsec
->sid
;
3209 isec
->sclass
= socket_type_to_security_class(family
, type
, protocol
);
3210 isec
->sid
= kern
? SECINITSID_KERNEL
: newsid
;
3211 isec
->initialized
= 1;
3214 sksec
= sock
->sk
->sk_security
;
3215 sksec
->sid
= isec
->sid
;
3216 err
= selinux_netlbl_socket_post_create(sock
);
3222 /* Range of port numbers used to automatically bind.
3223 Need to determine whether we should perform a name_bind
3224 permission check between the socket and the port number. */
3225 #define ip_local_port_range_0 sysctl_local_port_range[0]
3226 #define ip_local_port_range_1 sysctl_local_port_range[1]
3228 static int selinux_socket_bind(struct socket
*sock
, struct sockaddr
*address
, int addrlen
)
3233 err
= socket_has_perm(current
, sock
, SOCKET__BIND
);
3238 * If PF_INET or PF_INET6, check name_bind permission for the port.
3239 * Multiple address binding for SCTP is not supported yet: we just
3240 * check the first address now.
3242 family
= sock
->sk
->sk_family
;
3243 if (family
== PF_INET
|| family
== PF_INET6
) {
3245 struct inode_security_struct
*isec
;
3246 struct task_security_struct
*tsec
;
3247 struct avc_audit_data ad
;
3248 struct sockaddr_in
*addr4
= NULL
;
3249 struct sockaddr_in6
*addr6
= NULL
;
3250 unsigned short snum
;
3251 struct sock
*sk
= sock
->sk
;
3252 u32 sid
, node_perm
, addrlen
;
3254 tsec
= current
->security
;
3255 isec
= SOCK_INODE(sock
)->i_security
;
3257 if (family
== PF_INET
) {
3258 addr4
= (struct sockaddr_in
*)address
;
3259 snum
= ntohs(addr4
->sin_port
);
3260 addrlen
= sizeof(addr4
->sin_addr
.s_addr
);
3261 addrp
= (char *)&addr4
->sin_addr
.s_addr
;
3263 addr6
= (struct sockaddr_in6
*)address
;
3264 snum
= ntohs(addr6
->sin6_port
);
3265 addrlen
= sizeof(addr6
->sin6_addr
.s6_addr
);
3266 addrp
= (char *)&addr6
->sin6_addr
.s6_addr
;
3269 if (snum
&&(snum
< max(PROT_SOCK
,ip_local_port_range_0
) ||
3270 snum
> ip_local_port_range_1
)) {
3271 err
= security_port_sid(sk
->sk_family
, sk
->sk_type
,
3272 sk
->sk_protocol
, snum
, &sid
);
3275 AVC_AUDIT_DATA_INIT(&ad
,NET
);
3276 ad
.u
.net
.sport
= htons(snum
);
3277 ad
.u
.net
.family
= family
;
3278 err
= avc_has_perm(isec
->sid
, sid
,
3280 SOCKET__NAME_BIND
, &ad
);
3285 switch(isec
->sclass
) {
3286 case SECCLASS_TCP_SOCKET
:
3287 node_perm
= TCP_SOCKET__NODE_BIND
;
3290 case SECCLASS_UDP_SOCKET
:
3291 node_perm
= UDP_SOCKET__NODE_BIND
;
3294 case SECCLASS_DCCP_SOCKET
:
3295 node_perm
= DCCP_SOCKET__NODE_BIND
;
3299 node_perm
= RAWIP_SOCKET__NODE_BIND
;
3303 err
= security_node_sid(family
, addrp
, addrlen
, &sid
);
3307 AVC_AUDIT_DATA_INIT(&ad
,NET
);
3308 ad
.u
.net
.sport
= htons(snum
);
3309 ad
.u
.net
.family
= family
;
3311 if (family
== PF_INET
)
3312 ad
.u
.net
.v4info
.saddr
= addr4
->sin_addr
.s_addr
;
3314 ipv6_addr_copy(&ad
.u
.net
.v6info
.saddr
, &addr6
->sin6_addr
);
3316 err
= avc_has_perm(isec
->sid
, sid
,
3317 isec
->sclass
, node_perm
, &ad
);
3325 static int selinux_socket_connect(struct socket
*sock
, struct sockaddr
*address
, int addrlen
)
3327 struct inode_security_struct
*isec
;
3330 err
= socket_has_perm(current
, sock
, SOCKET__CONNECT
);
3335 * If a TCP or DCCP socket, check name_connect permission for the port.
3337 isec
= SOCK_INODE(sock
)->i_security
;
3338 if (isec
->sclass
== SECCLASS_TCP_SOCKET
||
3339 isec
->sclass
== SECCLASS_DCCP_SOCKET
) {
3340 struct sock
*sk
= sock
->sk
;
3341 struct avc_audit_data ad
;
3342 struct sockaddr_in
*addr4
= NULL
;
3343 struct sockaddr_in6
*addr6
= NULL
;
3344 unsigned short snum
;
3347 if (sk
->sk_family
== PF_INET
) {
3348 addr4
= (struct sockaddr_in
*)address
;
3349 if (addrlen
< sizeof(struct sockaddr_in
))
3351 snum
= ntohs(addr4
->sin_port
);
3353 addr6
= (struct sockaddr_in6
*)address
;
3354 if (addrlen
< SIN6_LEN_RFC2133
)
3356 snum
= ntohs(addr6
->sin6_port
);
3359 err
= security_port_sid(sk
->sk_family
, sk
->sk_type
,
3360 sk
->sk_protocol
, snum
, &sid
);
3364 perm
= (isec
->sclass
== SECCLASS_TCP_SOCKET
) ?
3365 TCP_SOCKET__NAME_CONNECT
: DCCP_SOCKET__NAME_CONNECT
;
3367 AVC_AUDIT_DATA_INIT(&ad
,NET
);
3368 ad
.u
.net
.dport
= htons(snum
);
3369 ad
.u
.net
.family
= sk
->sk_family
;
3370 err
= avc_has_perm(isec
->sid
, sid
, isec
->sclass
, perm
, &ad
);
3379 static int selinux_socket_listen(struct socket
*sock
, int backlog
)
3381 return socket_has_perm(current
, sock
, SOCKET__LISTEN
);
3384 static int selinux_socket_accept(struct socket
*sock
, struct socket
*newsock
)
3387 struct inode_security_struct
*isec
;
3388 struct inode_security_struct
*newisec
;
3390 err
= socket_has_perm(current
, sock
, SOCKET__ACCEPT
);
3394 newisec
= SOCK_INODE(newsock
)->i_security
;
3396 isec
= SOCK_INODE(sock
)->i_security
;
3397 newisec
->sclass
= isec
->sclass
;
3398 newisec
->sid
= isec
->sid
;
3399 newisec
->initialized
= 1;
3404 static int selinux_socket_sendmsg(struct socket
*sock
, struct msghdr
*msg
,
3409 rc
= socket_has_perm(current
, sock
, SOCKET__WRITE
);
3413 return selinux_netlbl_inode_permission(SOCK_INODE(sock
), MAY_WRITE
);
3416 static int selinux_socket_recvmsg(struct socket
*sock
, struct msghdr
*msg
,
3417 int size
, int flags
)
3419 return socket_has_perm(current
, sock
, SOCKET__READ
);
3422 static int selinux_socket_getsockname(struct socket
*sock
)
3424 return socket_has_perm(current
, sock
, SOCKET__GETATTR
);
3427 static int selinux_socket_getpeername(struct socket
*sock
)
3429 return socket_has_perm(current
, sock
, SOCKET__GETATTR
);
3432 static int selinux_socket_setsockopt(struct socket
*sock
,int level
,int optname
)
3436 err
= socket_has_perm(current
, sock
, SOCKET__SETOPT
);
3440 return selinux_netlbl_socket_setsockopt(sock
, level
, optname
);
3443 static int selinux_socket_getsockopt(struct socket
*sock
, int level
,
3446 return socket_has_perm(current
, sock
, SOCKET__GETOPT
);
3449 static int selinux_socket_shutdown(struct socket
*sock
, int how
)
3451 return socket_has_perm(current
, sock
, SOCKET__SHUTDOWN
);
3454 static int selinux_socket_unix_stream_connect(struct socket
*sock
,
3455 struct socket
*other
,
3458 struct sk_security_struct
*ssec
;
3459 struct inode_security_struct
*isec
;
3460 struct inode_security_struct
*other_isec
;
3461 struct avc_audit_data ad
;
3464 err
= secondary_ops
->unix_stream_connect(sock
, other
, newsk
);
3468 isec
= SOCK_INODE(sock
)->i_security
;
3469 other_isec
= SOCK_INODE(other
)->i_security
;
3471 AVC_AUDIT_DATA_INIT(&ad
,NET
);
3472 ad
.u
.net
.sk
= other
->sk
;
3474 err
= avc_has_perm(isec
->sid
, other_isec
->sid
,
3476 UNIX_STREAM_SOCKET__CONNECTTO
, &ad
);
3480 /* connecting socket */
3481 ssec
= sock
->sk
->sk_security
;
3482 ssec
->peer_sid
= other_isec
->sid
;
3484 /* server child socket */
3485 ssec
= newsk
->sk_security
;
3486 ssec
->peer_sid
= isec
->sid
;
3487 err
= security_sid_mls_copy(other_isec
->sid
, ssec
->peer_sid
, &ssec
->sid
);
3492 static int selinux_socket_unix_may_send(struct socket
*sock
,
3493 struct socket
*other
)
3495 struct inode_security_struct
*isec
;
3496 struct inode_security_struct
*other_isec
;
3497 struct avc_audit_data ad
;
3500 isec
= SOCK_INODE(sock
)->i_security
;
3501 other_isec
= SOCK_INODE(other
)->i_security
;
3503 AVC_AUDIT_DATA_INIT(&ad
,NET
);
3504 ad
.u
.net
.sk
= other
->sk
;
3506 err
= avc_has_perm(isec
->sid
, other_isec
->sid
,
3507 isec
->sclass
, SOCKET__SENDTO
, &ad
);
3514 static int selinux_sock_rcv_skb_compat(struct sock
*sk
, struct sk_buff
*skb
,
3515 struct avc_audit_data
*ad
, u16 family
, char *addrp
, int len
)
3518 u32 netif_perm
, node_perm
, node_sid
, if_sid
, recv_perm
= 0;
3519 struct socket
*sock
;
3523 read_lock_bh(&sk
->sk_callback_lock
);
3524 sock
= sk
->sk_socket
;
3526 struct inode
*inode
;
3527 inode
= SOCK_INODE(sock
);
3529 struct inode_security_struct
*isec
;
3530 isec
= inode
->i_security
;
3531 sock_sid
= isec
->sid
;
3532 sock_class
= isec
->sclass
;
3535 read_unlock_bh(&sk
->sk_callback_lock
);
3542 err
= sel_netif_sids(skb
->dev
, &if_sid
, NULL
);
3546 switch (sock_class
) {
3547 case SECCLASS_UDP_SOCKET
:
3548 netif_perm
= NETIF__UDP_RECV
;
3549 node_perm
= NODE__UDP_RECV
;
3550 recv_perm
= UDP_SOCKET__RECV_MSG
;
3553 case SECCLASS_TCP_SOCKET
:
3554 netif_perm
= NETIF__TCP_RECV
;
3555 node_perm
= NODE__TCP_RECV
;
3556 recv_perm
= TCP_SOCKET__RECV_MSG
;
3559 case SECCLASS_DCCP_SOCKET
:
3560 netif_perm
= NETIF__DCCP_RECV
;
3561 node_perm
= NODE__DCCP_RECV
;
3562 recv_perm
= DCCP_SOCKET__RECV_MSG
;
3566 netif_perm
= NETIF__RAWIP_RECV
;
3567 node_perm
= NODE__RAWIP_RECV
;
3571 err
= avc_has_perm(sock_sid
, if_sid
, SECCLASS_NETIF
, netif_perm
, ad
);
3575 err
= security_node_sid(family
, addrp
, len
, &node_sid
);
3579 err
= avc_has_perm(sock_sid
, node_sid
, SECCLASS_NODE
, node_perm
, ad
);
3586 err
= security_port_sid(sk
->sk_family
, sk
->sk_type
,
3587 sk
->sk_protocol
, ntohs(ad
->u
.net
.sport
),
3592 err
= avc_has_perm(sock_sid
, port_sid
,
3593 sock_class
, recv_perm
, ad
);
3600 static int selinux_socket_sock_rcv_skb(struct sock
*sk
, struct sk_buff
*skb
)
3605 struct avc_audit_data ad
;
3606 struct sk_security_struct
*sksec
= sk
->sk_security
;
3608 family
= sk
->sk_family
;
3609 if (family
!= PF_INET
&& family
!= PF_INET6
)
3612 /* Handle mapped IPv4 packets arriving via IPv6 sockets */
3613 if (family
== PF_INET6
&& skb
->protocol
== htons(ETH_P_IP
))
3616 AVC_AUDIT_DATA_INIT(&ad
, NET
);
3617 ad
.u
.net
.netif
= skb
->dev
? skb
->dev
->name
: "[unknown]";
3618 ad
.u
.net
.family
= family
;
3620 err
= selinux_parse_skb(skb
, &ad
, &addrp
, &len
, 1, NULL
);
3624 if (selinux_compat_net
)
3625 err
= selinux_sock_rcv_skb_compat(sk
, skb
, &ad
, family
,
3628 err
= avc_has_perm(sksec
->sid
, skb
->secmark
, SECCLASS_PACKET
,
3633 err
= selinux_netlbl_sock_rcv_skb(sksec
, skb
, &ad
);
3637 err
= selinux_xfrm_sock_rcv_skb(sksec
->sid
, skb
, &ad
);
3642 static int selinux_socket_getpeersec_stream(struct socket
*sock
, char __user
*optval
,
3643 int __user
*optlen
, unsigned len
)
3648 struct sk_security_struct
*ssec
;
3649 struct inode_security_struct
*isec
;
3650 u32 peer_sid
= SECSID_NULL
;
3652 isec
= SOCK_INODE(sock
)->i_security
;
3654 if (isec
->sclass
== SECCLASS_UNIX_STREAM_SOCKET
||
3655 isec
->sclass
== SECCLASS_TCP_SOCKET
) {
3656 ssec
= sock
->sk
->sk_security
;
3657 peer_sid
= ssec
->peer_sid
;
3659 if (peer_sid
== SECSID_NULL
) {
3664 err
= security_sid_to_context(peer_sid
, &scontext
, &scontext_len
);
3669 if (scontext_len
> len
) {
3674 if (copy_to_user(optval
, scontext
, scontext_len
))
3678 if (put_user(scontext_len
, optlen
))
3686 static int selinux_socket_getpeersec_dgram(struct socket
*sock
, struct sk_buff
*skb
, u32
*secid
)
3688 u32 peer_secid
= SECSID_NULL
;
3691 if (sock
&& sock
->sk
->sk_family
== PF_UNIX
)
3692 selinux_get_inode_sid(SOCK_INODE(sock
), &peer_secid
);
3694 selinux_skb_extlbl_sid(skb
, SECINITSID_UNLABELED
, &peer_secid
);
3696 if (peer_secid
== SECSID_NULL
)
3698 *secid
= peer_secid
;
3703 static int selinux_sk_alloc_security(struct sock
*sk
, int family
, gfp_t priority
)
3705 return sk_alloc_security(sk
, family
, priority
);
3708 static void selinux_sk_free_security(struct sock
*sk
)
3710 sk_free_security(sk
);
3713 static void selinux_sk_clone_security(const struct sock
*sk
, struct sock
*newsk
)
3715 struct sk_security_struct
*ssec
= sk
->sk_security
;
3716 struct sk_security_struct
*newssec
= newsk
->sk_security
;
3718 newssec
->sid
= ssec
->sid
;
3719 newssec
->peer_sid
= ssec
->peer_sid
;
3721 selinux_netlbl_sk_security_clone(ssec
, newssec
);
3724 static void selinux_sk_getsecid(struct sock
*sk
, u32
*secid
)
3727 *secid
= SECINITSID_ANY_SOCKET
;
3729 struct sk_security_struct
*sksec
= sk
->sk_security
;
3731 *secid
= sksec
->sid
;
3735 static void selinux_sock_graft(struct sock
* sk
, struct socket
*parent
)
3737 struct inode_security_struct
*isec
= SOCK_INODE(parent
)->i_security
;
3738 struct sk_security_struct
*sksec
= sk
->sk_security
;
3740 if (sk
->sk_family
== PF_INET
|| sk
->sk_family
== PF_INET6
||
3741 sk
->sk_family
== PF_UNIX
)
3742 isec
->sid
= sksec
->sid
;
3744 selinux_netlbl_sock_graft(sk
, parent
);
3747 static int selinux_inet_conn_request(struct sock
*sk
, struct sk_buff
*skb
,
3748 struct request_sock
*req
)
3750 struct sk_security_struct
*sksec
= sk
->sk_security
;
3755 selinux_skb_extlbl_sid(skb
, SECINITSID_UNLABELED
, &peersid
);
3756 if (peersid
== SECSID_NULL
) {
3757 req
->secid
= sksec
->sid
;
3758 req
->peer_secid
= SECSID_NULL
;
3762 err
= security_sid_mls_copy(sksec
->sid
, peersid
, &newsid
);
3766 req
->secid
= newsid
;
3767 req
->peer_secid
= peersid
;
3771 static void selinux_inet_csk_clone(struct sock
*newsk
,
3772 const struct request_sock
*req
)
3774 struct sk_security_struct
*newsksec
= newsk
->sk_security
;
3776 newsksec
->sid
= req
->secid
;
3777 newsksec
->peer_sid
= req
->peer_secid
;
3778 /* NOTE: Ideally, we should also get the isec->sid for the
3779 new socket in sync, but we don't have the isec available yet.
3780 So we will wait until sock_graft to do it, by which
3781 time it will have been created and available. */
3783 /* We don't need to take any sort of lock here as we are the only
3784 * thread with access to newsksec */
3785 selinux_netlbl_sk_security_reset(newsksec
, req
->rsk_ops
->family
);
3788 static void selinux_inet_conn_established(struct sock
*sk
,
3789 struct sk_buff
*skb
)
3791 struct sk_security_struct
*sksec
= sk
->sk_security
;
3793 selinux_skb_extlbl_sid(skb
, SECINITSID_UNLABELED
, &sksec
->peer_sid
);
3796 static void selinux_req_classify_flow(const struct request_sock
*req
,
3799 fl
->secid
= req
->secid
;
3802 static int selinux_nlmsg_perm(struct sock
*sk
, struct sk_buff
*skb
)
3806 struct nlmsghdr
*nlh
;
3807 struct socket
*sock
= sk
->sk_socket
;
3808 struct inode_security_struct
*isec
= SOCK_INODE(sock
)->i_security
;
3810 if (skb
->len
< NLMSG_SPACE(0)) {
3814 nlh
= nlmsg_hdr(skb
);
3816 err
= selinux_nlmsg_lookup(isec
->sclass
, nlh
->nlmsg_type
, &perm
);
3818 if (err
== -EINVAL
) {
3819 audit_log(current
->audit_context
, GFP_KERNEL
, AUDIT_SELINUX_ERR
,
3820 "SELinux: unrecognized netlink message"
3821 " type=%hu for sclass=%hu\n",
3822 nlh
->nlmsg_type
, isec
->sclass
);
3823 if (!selinux_enforcing
)
3833 err
= socket_has_perm(current
, sock
, perm
);
3838 #ifdef CONFIG_NETFILTER
3840 static int selinux_ip_postroute_last_compat(struct sock
*sk
, struct net_device
*dev
,
3841 struct avc_audit_data
*ad
,
3842 u16 family
, char *addrp
, int len
)
3845 u32 netif_perm
, node_perm
, node_sid
, if_sid
, send_perm
= 0;
3846 struct socket
*sock
;
3847 struct inode
*inode
;
3848 struct inode_security_struct
*isec
;
3850 sock
= sk
->sk_socket
;
3854 inode
= SOCK_INODE(sock
);
3858 isec
= inode
->i_security
;
3860 err
= sel_netif_sids(dev
, &if_sid
, NULL
);
3864 switch (isec
->sclass
) {
3865 case SECCLASS_UDP_SOCKET
:
3866 netif_perm
= NETIF__UDP_SEND
;
3867 node_perm
= NODE__UDP_SEND
;
3868 send_perm
= UDP_SOCKET__SEND_MSG
;
3871 case SECCLASS_TCP_SOCKET
:
3872 netif_perm
= NETIF__TCP_SEND
;
3873 node_perm
= NODE__TCP_SEND
;
3874 send_perm
= TCP_SOCKET__SEND_MSG
;
3877 case SECCLASS_DCCP_SOCKET
:
3878 netif_perm
= NETIF__DCCP_SEND
;
3879 node_perm
= NODE__DCCP_SEND
;
3880 send_perm
= DCCP_SOCKET__SEND_MSG
;
3884 netif_perm
= NETIF__RAWIP_SEND
;
3885 node_perm
= NODE__RAWIP_SEND
;
3889 err
= avc_has_perm(isec
->sid
, if_sid
, SECCLASS_NETIF
, netif_perm
, ad
);
3893 err
= security_node_sid(family
, addrp
, len
, &node_sid
);
3897 err
= avc_has_perm(isec
->sid
, node_sid
, SECCLASS_NODE
, node_perm
, ad
);
3904 err
= security_port_sid(sk
->sk_family
,
3907 ntohs(ad
->u
.net
.dport
),
3912 err
= avc_has_perm(isec
->sid
, port_sid
, isec
->sclass
,
3919 static unsigned int selinux_ip_postroute_last(unsigned int hooknum
,
3920 struct sk_buff
**pskb
,
3921 const struct net_device
*in
,
3922 const struct net_device
*out
,
3923 int (*okfn
)(struct sk_buff
*),
3929 struct sk_buff
*skb
= *pskb
;
3930 struct avc_audit_data ad
;
3931 struct net_device
*dev
= (struct net_device
*)out
;
3932 struct sk_security_struct
*sksec
;
3939 sksec
= sk
->sk_security
;
3941 AVC_AUDIT_DATA_INIT(&ad
, NET
);
3942 ad
.u
.net
.netif
= dev
->name
;
3943 ad
.u
.net
.family
= family
;
3945 err
= selinux_parse_skb(skb
, &ad
, &addrp
, &len
, 0, &proto
);
3949 if (selinux_compat_net
)
3950 err
= selinux_ip_postroute_last_compat(sk
, dev
, &ad
,
3951 family
, addrp
, len
);
3953 err
= avc_has_perm(sksec
->sid
, skb
->secmark
, SECCLASS_PACKET
,
3959 err
= selinux_xfrm_postroute_last(sksec
->sid
, skb
, &ad
, proto
);
3961 return err
? NF_DROP
: NF_ACCEPT
;
3964 static unsigned int selinux_ipv4_postroute_last(unsigned int hooknum
,
3965 struct sk_buff
**pskb
,
3966 const struct net_device
*in
,
3967 const struct net_device
*out
,
3968 int (*okfn
)(struct sk_buff
*))
3970 return selinux_ip_postroute_last(hooknum
, pskb
, in
, out
, okfn
, PF_INET
);
3973 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
3975 static unsigned int selinux_ipv6_postroute_last(unsigned int hooknum
,
3976 struct sk_buff
**pskb
,
3977 const struct net_device
*in
,
3978 const struct net_device
*out
,
3979 int (*okfn
)(struct sk_buff
*))
3981 return selinux_ip_postroute_last(hooknum
, pskb
, in
, out
, okfn
, PF_INET6
);
3986 #endif /* CONFIG_NETFILTER */
3988 static int selinux_netlink_send(struct sock
*sk
, struct sk_buff
*skb
)
3992 err
= secondary_ops
->netlink_send(sk
, skb
);
3996 if (policydb_loaded_version
>= POLICYDB_VERSION_NLCLASS
)
3997 err
= selinux_nlmsg_perm(sk
, skb
);
4002 static int selinux_netlink_recv(struct sk_buff
*skb
, int capability
)
4005 struct avc_audit_data ad
;
4007 err
= secondary_ops
->netlink_recv(skb
, capability
);
4011 AVC_AUDIT_DATA_INIT(&ad
, CAP
);
4012 ad
.u
.cap
= capability
;
4014 return avc_has_perm(NETLINK_CB(skb
).sid
, NETLINK_CB(skb
).sid
,
4015 SECCLASS_CAPABILITY
, CAP_TO_MASK(capability
), &ad
);
4018 static int ipc_alloc_security(struct task_struct
*task
,
4019 struct kern_ipc_perm
*perm
,
4022 struct task_security_struct
*tsec
= task
->security
;
4023 struct ipc_security_struct
*isec
;
4025 isec
= kzalloc(sizeof(struct ipc_security_struct
), GFP_KERNEL
);
4029 isec
->sclass
= sclass
;
4030 isec
->ipc_perm
= perm
;
4031 isec
->sid
= tsec
->sid
;
4032 perm
->security
= isec
;
4037 static void ipc_free_security(struct kern_ipc_perm
*perm
)
4039 struct ipc_security_struct
*isec
= perm
->security
;
4040 perm
->security
= NULL
;
4044 static int msg_msg_alloc_security(struct msg_msg
*msg
)
4046 struct msg_security_struct
*msec
;
4048 msec
= kzalloc(sizeof(struct msg_security_struct
), GFP_KERNEL
);
4053 msec
->sid
= SECINITSID_UNLABELED
;
4054 msg
->security
= msec
;
4059 static void msg_msg_free_security(struct msg_msg
*msg
)
4061 struct msg_security_struct
*msec
= msg
->security
;
4063 msg
->security
= NULL
;
4067 static int ipc_has_perm(struct kern_ipc_perm
*ipc_perms
,
4070 struct task_security_struct
*tsec
;
4071 struct ipc_security_struct
*isec
;
4072 struct avc_audit_data ad
;
4074 tsec
= current
->security
;
4075 isec
= ipc_perms
->security
;
4077 AVC_AUDIT_DATA_INIT(&ad
, IPC
);
4078 ad
.u
.ipc_id
= ipc_perms
->key
;
4080 return avc_has_perm(tsec
->sid
, isec
->sid
, isec
->sclass
, perms
, &ad
);
4083 static int selinux_msg_msg_alloc_security(struct msg_msg
*msg
)
4085 return msg_msg_alloc_security(msg
);
4088 static void selinux_msg_msg_free_security(struct msg_msg
*msg
)
4090 msg_msg_free_security(msg
);
4093 /* message queue security operations */
4094 static int selinux_msg_queue_alloc_security(struct msg_queue
*msq
)
4096 struct task_security_struct
*tsec
;
4097 struct ipc_security_struct
*isec
;
4098 struct avc_audit_data ad
;
4101 rc
= ipc_alloc_security(current
, &msq
->q_perm
, SECCLASS_MSGQ
);
4105 tsec
= current
->security
;
4106 isec
= msq
->q_perm
.security
;
4108 AVC_AUDIT_DATA_INIT(&ad
, IPC
);
4109 ad
.u
.ipc_id
= msq
->q_perm
.key
;
4111 rc
= avc_has_perm(tsec
->sid
, isec
->sid
, SECCLASS_MSGQ
,
4114 ipc_free_security(&msq
->q_perm
);
4120 static void selinux_msg_queue_free_security(struct msg_queue
*msq
)
4122 ipc_free_security(&msq
->q_perm
);
4125 static int selinux_msg_queue_associate(struct msg_queue
*msq
, int msqflg
)
4127 struct task_security_struct
*tsec
;
4128 struct ipc_security_struct
*isec
;
4129 struct avc_audit_data ad
;
4131 tsec
= current
->security
;
4132 isec
= msq
->q_perm
.security
;
4134 AVC_AUDIT_DATA_INIT(&ad
, IPC
);
4135 ad
.u
.ipc_id
= msq
->q_perm
.key
;
4137 return avc_has_perm(tsec
->sid
, isec
->sid
, SECCLASS_MSGQ
,
4138 MSGQ__ASSOCIATE
, &ad
);
4141 static int selinux_msg_queue_msgctl(struct msg_queue
*msq
, int cmd
)
4149 /* No specific object, just general system-wide information. */
4150 return task_has_system(current
, SYSTEM__IPC_INFO
);
4153 perms
= MSGQ__GETATTR
| MSGQ__ASSOCIATE
;
4156 perms
= MSGQ__SETATTR
;
4159 perms
= MSGQ__DESTROY
;
4165 err
= ipc_has_perm(&msq
->q_perm
, perms
);
4169 static int selinux_msg_queue_msgsnd(struct msg_queue
*msq
, struct msg_msg
*msg
, int msqflg
)
4171 struct task_security_struct
*tsec
;
4172 struct ipc_security_struct
*isec
;
4173 struct msg_security_struct
*msec
;
4174 struct avc_audit_data ad
;
4177 tsec
= current
->security
;
4178 isec
= msq
->q_perm
.security
;
4179 msec
= msg
->security
;
4182 * First time through, need to assign label to the message
4184 if (msec
->sid
== SECINITSID_UNLABELED
) {
4186 * Compute new sid based on current process and
4187 * message queue this message will be stored in
4189 rc
= security_transition_sid(tsec
->sid
,
4197 AVC_AUDIT_DATA_INIT(&ad
, IPC
);
4198 ad
.u
.ipc_id
= msq
->q_perm
.key
;
4200 /* Can this process write to the queue? */
4201 rc
= avc_has_perm(tsec
->sid
, isec
->sid
, SECCLASS_MSGQ
,
4204 /* Can this process send the message */
4205 rc
= avc_has_perm(tsec
->sid
, msec
->sid
,
4206 SECCLASS_MSG
, MSG__SEND
, &ad
);
4208 /* Can the message be put in the queue? */
4209 rc
= avc_has_perm(msec
->sid
, isec
->sid
,
4210 SECCLASS_MSGQ
, MSGQ__ENQUEUE
, &ad
);
4215 static int selinux_msg_queue_msgrcv(struct msg_queue
*msq
, struct msg_msg
*msg
,
4216 struct task_struct
*target
,
4217 long type
, int mode
)
4219 struct task_security_struct
*tsec
;
4220 struct ipc_security_struct
*isec
;
4221 struct msg_security_struct
*msec
;
4222 struct avc_audit_data ad
;
4225 tsec
= target
->security
;
4226 isec
= msq
->q_perm
.security
;
4227 msec
= msg
->security
;
4229 AVC_AUDIT_DATA_INIT(&ad
, IPC
);
4230 ad
.u
.ipc_id
= msq
->q_perm
.key
;
4232 rc
= avc_has_perm(tsec
->sid
, isec
->sid
,
4233 SECCLASS_MSGQ
, MSGQ__READ
, &ad
);
4235 rc
= avc_has_perm(tsec
->sid
, msec
->sid
,
4236 SECCLASS_MSG
, MSG__RECEIVE
, &ad
);
4240 /* Shared Memory security operations */
4241 static int selinux_shm_alloc_security(struct shmid_kernel
*shp
)
4243 struct task_security_struct
*tsec
;
4244 struct ipc_security_struct
*isec
;
4245 struct avc_audit_data ad
;
4248 rc
= ipc_alloc_security(current
, &shp
->shm_perm
, SECCLASS_SHM
);
4252 tsec
= current
->security
;
4253 isec
= shp
->shm_perm
.security
;
4255 AVC_AUDIT_DATA_INIT(&ad
, IPC
);
4256 ad
.u
.ipc_id
= shp
->shm_perm
.key
;
4258 rc
= avc_has_perm(tsec
->sid
, isec
->sid
, SECCLASS_SHM
,
4261 ipc_free_security(&shp
->shm_perm
);
4267 static void selinux_shm_free_security(struct shmid_kernel
*shp
)
4269 ipc_free_security(&shp
->shm_perm
);
4272 static int selinux_shm_associate(struct shmid_kernel
*shp
, int shmflg
)
4274 struct task_security_struct
*tsec
;
4275 struct ipc_security_struct
*isec
;
4276 struct avc_audit_data ad
;
4278 tsec
= current
->security
;
4279 isec
= shp
->shm_perm
.security
;
4281 AVC_AUDIT_DATA_INIT(&ad
, IPC
);
4282 ad
.u
.ipc_id
= shp
->shm_perm
.key
;
4284 return avc_has_perm(tsec
->sid
, isec
->sid
, SECCLASS_SHM
,
4285 SHM__ASSOCIATE
, &ad
);
4288 /* Note, at this point, shp is locked down */
4289 static int selinux_shm_shmctl(struct shmid_kernel
*shp
, int cmd
)
4297 /* No specific object, just general system-wide information. */
4298 return task_has_system(current
, SYSTEM__IPC_INFO
);
4301 perms
= SHM__GETATTR
| SHM__ASSOCIATE
;
4304 perms
= SHM__SETATTR
;
4311 perms
= SHM__DESTROY
;
4317 err
= ipc_has_perm(&shp
->shm_perm
, perms
);
4321 static int selinux_shm_shmat(struct shmid_kernel
*shp
,
4322 char __user
*shmaddr
, int shmflg
)
4327 rc
= secondary_ops
->shm_shmat(shp
, shmaddr
, shmflg
);
4331 if (shmflg
& SHM_RDONLY
)
4334 perms
= SHM__READ
| SHM__WRITE
;
4336 return ipc_has_perm(&shp
->shm_perm
, perms
);
4339 /* Semaphore security operations */
4340 static int selinux_sem_alloc_security(struct sem_array
*sma
)
4342 struct task_security_struct
*tsec
;
4343 struct ipc_security_struct
*isec
;
4344 struct avc_audit_data ad
;
4347 rc
= ipc_alloc_security(current
, &sma
->sem_perm
, SECCLASS_SEM
);
4351 tsec
= current
->security
;
4352 isec
= sma
->sem_perm
.security
;
4354 AVC_AUDIT_DATA_INIT(&ad
, IPC
);
4355 ad
.u
.ipc_id
= sma
->sem_perm
.key
;
4357 rc
= avc_has_perm(tsec
->sid
, isec
->sid
, SECCLASS_SEM
,
4360 ipc_free_security(&sma
->sem_perm
);
4366 static void selinux_sem_free_security(struct sem_array
*sma
)
4368 ipc_free_security(&sma
->sem_perm
);
4371 static int selinux_sem_associate(struct sem_array
*sma
, int semflg
)
4373 struct task_security_struct
*tsec
;
4374 struct ipc_security_struct
*isec
;
4375 struct avc_audit_data ad
;
4377 tsec
= current
->security
;
4378 isec
= sma
->sem_perm
.security
;
4380 AVC_AUDIT_DATA_INIT(&ad
, IPC
);
4381 ad
.u
.ipc_id
= sma
->sem_perm
.key
;
4383 return avc_has_perm(tsec
->sid
, isec
->sid
, SECCLASS_SEM
,
4384 SEM__ASSOCIATE
, &ad
);
4387 /* Note, at this point, sma is locked down */
4388 static int selinux_sem_semctl(struct sem_array
*sma
, int cmd
)
4396 /* No specific object, just general system-wide information. */
4397 return task_has_system(current
, SYSTEM__IPC_INFO
);
4401 perms
= SEM__GETATTR
;
4412 perms
= SEM__DESTROY
;
4415 perms
= SEM__SETATTR
;
4419 perms
= SEM__GETATTR
| SEM__ASSOCIATE
;
4425 err
= ipc_has_perm(&sma
->sem_perm
, perms
);
4429 static int selinux_sem_semop(struct sem_array
*sma
,
4430 struct sembuf
*sops
, unsigned nsops
, int alter
)
4435 perms
= SEM__READ
| SEM__WRITE
;
4439 return ipc_has_perm(&sma
->sem_perm
, perms
);
4442 static int selinux_ipc_permission(struct kern_ipc_perm
*ipcp
, short flag
)
4448 av
|= IPC__UNIX_READ
;
4450 av
|= IPC__UNIX_WRITE
;
4455 return ipc_has_perm(ipcp
, av
);
4458 /* module stacking operations */
4459 static int selinux_register_security (const char *name
, struct security_operations
*ops
)
4461 if (secondary_ops
!= original_ops
) {
4462 printk(KERN_ERR
"%s: There is already a secondary security "
4463 "module registered.\n", __FUNCTION__
);
4467 secondary_ops
= ops
;
4469 printk(KERN_INFO
"%s: Registering secondary module %s\n",
4476 static int selinux_unregister_security (const char *name
, struct security_operations
*ops
)
4478 if (ops
!= secondary_ops
) {
4479 printk(KERN_ERR
"%s: trying to unregister a security module "
4480 "that is not registered.\n", __FUNCTION__
);
4484 secondary_ops
= original_ops
;
4489 static void selinux_d_instantiate (struct dentry
*dentry
, struct inode
*inode
)
4492 inode_doinit_with_dentry(inode
, dentry
);
4495 static int selinux_getprocattr(struct task_struct
*p
,
4496 char *name
, char **value
)
4498 struct task_security_struct
*tsec
;
4504 error
= task_has_perm(current
, p
, PROCESS__GETATTR
);
4511 if (!strcmp(name
, "current"))
4513 else if (!strcmp(name
, "prev"))
4515 else if (!strcmp(name
, "exec"))
4516 sid
= tsec
->exec_sid
;
4517 else if (!strcmp(name
, "fscreate"))
4518 sid
= tsec
->create_sid
;
4519 else if (!strcmp(name
, "keycreate"))
4520 sid
= tsec
->keycreate_sid
;
4521 else if (!strcmp(name
, "sockcreate"))
4522 sid
= tsec
->sockcreate_sid
;
4529 error
= security_sid_to_context(sid
, value
, &len
);
4535 static int selinux_setprocattr(struct task_struct
*p
,
4536 char *name
, void *value
, size_t size
)
4538 struct task_security_struct
*tsec
;
4544 /* SELinux only allows a process to change its own
4545 security attributes. */
4550 * Basic control over ability to set these attributes at all.
4551 * current == p, but we'll pass them separately in case the
4552 * above restriction is ever removed.
4554 if (!strcmp(name
, "exec"))
4555 error
= task_has_perm(current
, p
, PROCESS__SETEXEC
);
4556 else if (!strcmp(name
, "fscreate"))
4557 error
= task_has_perm(current
, p
, PROCESS__SETFSCREATE
);
4558 else if (!strcmp(name
, "keycreate"))
4559 error
= task_has_perm(current
, p
, PROCESS__SETKEYCREATE
);
4560 else if (!strcmp(name
, "sockcreate"))
4561 error
= task_has_perm(current
, p
, PROCESS__SETSOCKCREATE
);
4562 else if (!strcmp(name
, "current"))
4563 error
= task_has_perm(current
, p
, PROCESS__SETCURRENT
);
4569 /* Obtain a SID for the context, if one was specified. */
4570 if (size
&& str
[1] && str
[1] != '\n') {
4571 if (str
[size
-1] == '\n') {
4575 error
= security_context_to_sid(value
, size
, &sid
);
4580 /* Permission checking based on the specified context is
4581 performed during the actual operation (execve,
4582 open/mkdir/...), when we know the full context of the
4583 operation. See selinux_bprm_set_security for the execve
4584 checks and may_create for the file creation checks. The
4585 operation will then fail if the context is not permitted. */
4587 if (!strcmp(name
, "exec"))
4588 tsec
->exec_sid
= sid
;
4589 else if (!strcmp(name
, "fscreate"))
4590 tsec
->create_sid
= sid
;
4591 else if (!strcmp(name
, "keycreate")) {
4592 error
= may_create_key(sid
, p
);
4595 tsec
->keycreate_sid
= sid
;
4596 } else if (!strcmp(name
, "sockcreate"))
4597 tsec
->sockcreate_sid
= sid
;
4598 else if (!strcmp(name
, "current")) {
4599 struct av_decision avd
;
4604 /* Only allow single threaded processes to change context */
4605 if (atomic_read(&p
->mm
->mm_users
) != 1) {
4606 struct task_struct
*g
, *t
;
4607 struct mm_struct
*mm
= p
->mm
;
4608 read_lock(&tasklist_lock
);
4609 do_each_thread(g
, t
)
4610 if (t
->mm
== mm
&& t
!= p
) {
4611 read_unlock(&tasklist_lock
);
4614 while_each_thread(g
, t
);
4615 read_unlock(&tasklist_lock
);
4618 /* Check permissions for the transition. */
4619 error
= avc_has_perm(tsec
->sid
, sid
, SECCLASS_PROCESS
,
4620 PROCESS__DYNTRANSITION
, NULL
);
4624 /* Check for ptracing, and update the task SID if ok.
4625 Otherwise, leave SID unchanged and fail. */
4627 if (p
->ptrace
& PT_PTRACED
) {
4628 error
= avc_has_perm_noaudit(tsec
->ptrace_sid
, sid
,
4630 PROCESS__PTRACE
, &avd
);
4634 avc_audit(tsec
->ptrace_sid
, sid
, SECCLASS_PROCESS
,
4635 PROCESS__PTRACE
, &avd
, error
, NULL
);
4649 static int selinux_secid_to_secctx(u32 secid
, char **secdata
, u32
*seclen
)
4651 return security_sid_to_context(secid
, secdata
, seclen
);
4654 static void selinux_release_secctx(char *secdata
, u32 seclen
)
4662 static int selinux_key_alloc(struct key
*k
, struct task_struct
*tsk
,
4663 unsigned long flags
)
4665 struct task_security_struct
*tsec
= tsk
->security
;
4666 struct key_security_struct
*ksec
;
4668 ksec
= kzalloc(sizeof(struct key_security_struct
), GFP_KERNEL
);
4673 if (tsec
->keycreate_sid
)
4674 ksec
->sid
= tsec
->keycreate_sid
;
4676 ksec
->sid
= tsec
->sid
;
4682 static void selinux_key_free(struct key
*k
)
4684 struct key_security_struct
*ksec
= k
->security
;
4690 static int selinux_key_permission(key_ref_t key_ref
,
4691 struct task_struct
*ctx
,
4695 struct task_security_struct
*tsec
;
4696 struct key_security_struct
*ksec
;
4698 key
= key_ref_to_ptr(key_ref
);
4700 tsec
= ctx
->security
;
4701 ksec
= key
->security
;
4703 /* if no specific permissions are requested, we skip the
4704 permission check. No serious, additional covert channels
4705 appear to be created. */
4709 return avc_has_perm(tsec
->sid
, ksec
->sid
,
4710 SECCLASS_KEY
, perm
, NULL
);
4715 static struct security_operations selinux_ops
= {
4716 .ptrace
= selinux_ptrace
,
4717 .capget
= selinux_capget
,
4718 .capset_check
= selinux_capset_check
,
4719 .capset_set
= selinux_capset_set
,
4720 .sysctl
= selinux_sysctl
,
4721 .capable
= selinux_capable
,
4722 .quotactl
= selinux_quotactl
,
4723 .quota_on
= selinux_quota_on
,
4724 .syslog
= selinux_syslog
,
4725 .vm_enough_memory
= selinux_vm_enough_memory
,
4727 .netlink_send
= selinux_netlink_send
,
4728 .netlink_recv
= selinux_netlink_recv
,
4730 .bprm_alloc_security
= selinux_bprm_alloc_security
,
4731 .bprm_free_security
= selinux_bprm_free_security
,
4732 .bprm_apply_creds
= selinux_bprm_apply_creds
,
4733 .bprm_post_apply_creds
= selinux_bprm_post_apply_creds
,
4734 .bprm_set_security
= selinux_bprm_set_security
,
4735 .bprm_check_security
= selinux_bprm_check_security
,
4736 .bprm_secureexec
= selinux_bprm_secureexec
,
4738 .sb_alloc_security
= selinux_sb_alloc_security
,
4739 .sb_free_security
= selinux_sb_free_security
,
4740 .sb_copy_data
= selinux_sb_copy_data
,
4741 .sb_kern_mount
= selinux_sb_kern_mount
,
4742 .sb_statfs
= selinux_sb_statfs
,
4743 .sb_mount
= selinux_mount
,
4744 .sb_umount
= selinux_umount
,
4746 .inode_alloc_security
= selinux_inode_alloc_security
,
4747 .inode_free_security
= selinux_inode_free_security
,
4748 .inode_init_security
= selinux_inode_init_security
,
4749 .inode_create
= selinux_inode_create
,
4750 .inode_link
= selinux_inode_link
,
4751 .inode_unlink
= selinux_inode_unlink
,
4752 .inode_symlink
= selinux_inode_symlink
,
4753 .inode_mkdir
= selinux_inode_mkdir
,
4754 .inode_rmdir
= selinux_inode_rmdir
,
4755 .inode_mknod
= selinux_inode_mknod
,
4756 .inode_rename
= selinux_inode_rename
,
4757 .inode_readlink
= selinux_inode_readlink
,
4758 .inode_follow_link
= selinux_inode_follow_link
,
4759 .inode_permission
= selinux_inode_permission
,
4760 .inode_setattr
= selinux_inode_setattr
,
4761 .inode_getattr
= selinux_inode_getattr
,
4762 .inode_setxattr
= selinux_inode_setxattr
,
4763 .inode_post_setxattr
= selinux_inode_post_setxattr
,
4764 .inode_getxattr
= selinux_inode_getxattr
,
4765 .inode_listxattr
= selinux_inode_listxattr
,
4766 .inode_removexattr
= selinux_inode_removexattr
,
4767 .inode_xattr_getsuffix
= selinux_inode_xattr_getsuffix
,
4768 .inode_getsecurity
= selinux_inode_getsecurity
,
4769 .inode_setsecurity
= selinux_inode_setsecurity
,
4770 .inode_listsecurity
= selinux_inode_listsecurity
,
4772 .file_permission
= selinux_file_permission
,
4773 .file_alloc_security
= selinux_file_alloc_security
,
4774 .file_free_security
= selinux_file_free_security
,
4775 .file_ioctl
= selinux_file_ioctl
,
4776 .file_mmap
= selinux_file_mmap
,
4777 .file_mprotect
= selinux_file_mprotect
,
4778 .file_lock
= selinux_file_lock
,
4779 .file_fcntl
= selinux_file_fcntl
,
4780 .file_set_fowner
= selinux_file_set_fowner
,
4781 .file_send_sigiotask
= selinux_file_send_sigiotask
,
4782 .file_receive
= selinux_file_receive
,
4784 .task_create
= selinux_task_create
,
4785 .task_alloc_security
= selinux_task_alloc_security
,
4786 .task_free_security
= selinux_task_free_security
,
4787 .task_setuid
= selinux_task_setuid
,
4788 .task_post_setuid
= selinux_task_post_setuid
,
4789 .task_setgid
= selinux_task_setgid
,
4790 .task_setpgid
= selinux_task_setpgid
,
4791 .task_getpgid
= selinux_task_getpgid
,
4792 .task_getsid
= selinux_task_getsid
,
4793 .task_getsecid
= selinux_task_getsecid
,
4794 .task_setgroups
= selinux_task_setgroups
,
4795 .task_setnice
= selinux_task_setnice
,
4796 .task_setioprio
= selinux_task_setioprio
,
4797 .task_getioprio
= selinux_task_getioprio
,
4798 .task_setrlimit
= selinux_task_setrlimit
,
4799 .task_setscheduler
= selinux_task_setscheduler
,
4800 .task_getscheduler
= selinux_task_getscheduler
,
4801 .task_movememory
= selinux_task_movememory
,
4802 .task_kill
= selinux_task_kill
,
4803 .task_wait
= selinux_task_wait
,
4804 .task_prctl
= selinux_task_prctl
,
4805 .task_reparent_to_init
= selinux_task_reparent_to_init
,
4806 .task_to_inode
= selinux_task_to_inode
,
4808 .ipc_permission
= selinux_ipc_permission
,
4810 .msg_msg_alloc_security
= selinux_msg_msg_alloc_security
,
4811 .msg_msg_free_security
= selinux_msg_msg_free_security
,
4813 .msg_queue_alloc_security
= selinux_msg_queue_alloc_security
,
4814 .msg_queue_free_security
= selinux_msg_queue_free_security
,
4815 .msg_queue_associate
= selinux_msg_queue_associate
,
4816 .msg_queue_msgctl
= selinux_msg_queue_msgctl
,
4817 .msg_queue_msgsnd
= selinux_msg_queue_msgsnd
,
4818 .msg_queue_msgrcv
= selinux_msg_queue_msgrcv
,
4820 .shm_alloc_security
= selinux_shm_alloc_security
,
4821 .shm_free_security
= selinux_shm_free_security
,
4822 .shm_associate
= selinux_shm_associate
,
4823 .shm_shmctl
= selinux_shm_shmctl
,
4824 .shm_shmat
= selinux_shm_shmat
,
4826 .sem_alloc_security
= selinux_sem_alloc_security
,
4827 .sem_free_security
= selinux_sem_free_security
,
4828 .sem_associate
= selinux_sem_associate
,
4829 .sem_semctl
= selinux_sem_semctl
,
4830 .sem_semop
= selinux_sem_semop
,
4832 .register_security
= selinux_register_security
,
4833 .unregister_security
= selinux_unregister_security
,
4835 .d_instantiate
= selinux_d_instantiate
,
4837 .getprocattr
= selinux_getprocattr
,
4838 .setprocattr
= selinux_setprocattr
,
4840 .secid_to_secctx
= selinux_secid_to_secctx
,
4841 .release_secctx
= selinux_release_secctx
,
4843 .unix_stream_connect
= selinux_socket_unix_stream_connect
,
4844 .unix_may_send
= selinux_socket_unix_may_send
,
4846 .socket_create
= selinux_socket_create
,
4847 .socket_post_create
= selinux_socket_post_create
,
4848 .socket_bind
= selinux_socket_bind
,
4849 .socket_connect
= selinux_socket_connect
,
4850 .socket_listen
= selinux_socket_listen
,
4851 .socket_accept
= selinux_socket_accept
,
4852 .socket_sendmsg
= selinux_socket_sendmsg
,
4853 .socket_recvmsg
= selinux_socket_recvmsg
,
4854 .socket_getsockname
= selinux_socket_getsockname
,
4855 .socket_getpeername
= selinux_socket_getpeername
,
4856 .socket_getsockopt
= selinux_socket_getsockopt
,
4857 .socket_setsockopt
= selinux_socket_setsockopt
,
4858 .socket_shutdown
= selinux_socket_shutdown
,
4859 .socket_sock_rcv_skb
= selinux_socket_sock_rcv_skb
,
4860 .socket_getpeersec_stream
= selinux_socket_getpeersec_stream
,
4861 .socket_getpeersec_dgram
= selinux_socket_getpeersec_dgram
,
4862 .sk_alloc_security
= selinux_sk_alloc_security
,
4863 .sk_free_security
= selinux_sk_free_security
,
4864 .sk_clone_security
= selinux_sk_clone_security
,
4865 .sk_getsecid
= selinux_sk_getsecid
,
4866 .sock_graft
= selinux_sock_graft
,
4867 .inet_conn_request
= selinux_inet_conn_request
,
4868 .inet_csk_clone
= selinux_inet_csk_clone
,
4869 .inet_conn_established
= selinux_inet_conn_established
,
4870 .req_classify_flow
= selinux_req_classify_flow
,
4872 #ifdef CONFIG_SECURITY_NETWORK_XFRM
4873 .xfrm_policy_alloc_security
= selinux_xfrm_policy_alloc
,
4874 .xfrm_policy_clone_security
= selinux_xfrm_policy_clone
,
4875 .xfrm_policy_free_security
= selinux_xfrm_policy_free
,
4876 .xfrm_policy_delete_security
= selinux_xfrm_policy_delete
,
4877 .xfrm_state_alloc_security
= selinux_xfrm_state_alloc
,
4878 .xfrm_state_free_security
= selinux_xfrm_state_free
,
4879 .xfrm_state_delete_security
= selinux_xfrm_state_delete
,
4880 .xfrm_policy_lookup
= selinux_xfrm_policy_lookup
,
4881 .xfrm_state_pol_flow_match
= selinux_xfrm_state_pol_flow_match
,
4882 .xfrm_decode_session
= selinux_xfrm_decode_session
,
4886 .key_alloc
= selinux_key_alloc
,
4887 .key_free
= selinux_key_free
,
4888 .key_permission
= selinux_key_permission
,
4892 static __init
int selinux_init(void)
4894 struct task_security_struct
*tsec
;
4896 if (!selinux_enabled
) {
4897 printk(KERN_INFO
"SELinux: Disabled at boot.\n");
4901 printk(KERN_INFO
"SELinux: Initializing.\n");
4903 /* Set the security state for the initial task. */
4904 if (task_alloc_security(current
))
4905 panic("SELinux: Failed to initialize initial task.\n");
4906 tsec
= current
->security
;
4907 tsec
->osid
= tsec
->sid
= SECINITSID_KERNEL
;
4909 sel_inode_cache
= kmem_cache_create("selinux_inode_security",
4910 sizeof(struct inode_security_struct
),
4911 0, SLAB_PANIC
, NULL
, NULL
);
4914 original_ops
= secondary_ops
= security_ops
;
4916 panic ("SELinux: No initial security operations\n");
4917 if (register_security (&selinux_ops
))
4918 panic("SELinux: Unable to register with kernel.\n");
4920 if (selinux_enforcing
) {
4921 printk(KERN_DEBUG
"SELinux: Starting in enforcing mode\n");
4923 printk(KERN_DEBUG
"SELinux: Starting in permissive mode\n");
4927 /* Add security information to initial keyrings */
4928 selinux_key_alloc(&root_user_keyring
, current
,
4929 KEY_ALLOC_NOT_IN_QUOTA
);
4930 selinux_key_alloc(&root_session_keyring
, current
,
4931 KEY_ALLOC_NOT_IN_QUOTA
);
4937 void selinux_complete_init(void)
4939 printk(KERN_DEBUG
"SELinux: Completing initialization.\n");
4941 /* Set up any superblocks initialized prior to the policy load. */
4942 printk(KERN_DEBUG
"SELinux: Setting up existing superblocks.\n");
4943 spin_lock(&sb_lock
);
4944 spin_lock(&sb_security_lock
);
4946 if (!list_empty(&superblock_security_head
)) {
4947 struct superblock_security_struct
*sbsec
=
4948 list_entry(superblock_security_head
.next
,
4949 struct superblock_security_struct
,
4951 struct super_block
*sb
= sbsec
->sb
;
4953 spin_unlock(&sb_security_lock
);
4954 spin_unlock(&sb_lock
);
4955 down_read(&sb
->s_umount
);
4957 superblock_doinit(sb
, NULL
);
4959 spin_lock(&sb_lock
);
4960 spin_lock(&sb_security_lock
);
4961 list_del_init(&sbsec
->list
);
4964 spin_unlock(&sb_security_lock
);
4965 spin_unlock(&sb_lock
);
4968 /* SELinux requires early initialization in order to label
4969 all processes and objects when they are created. */
4970 security_initcall(selinux_init
);
4972 #if defined(CONFIG_NETFILTER)
4974 static struct nf_hook_ops selinux_ipv4_op
= {
4975 .hook
= selinux_ipv4_postroute_last
,
4976 .owner
= THIS_MODULE
,
4978 .hooknum
= NF_IP_POST_ROUTING
,
4979 .priority
= NF_IP_PRI_SELINUX_LAST
,
4982 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
4984 static struct nf_hook_ops selinux_ipv6_op
= {
4985 .hook
= selinux_ipv6_postroute_last
,
4986 .owner
= THIS_MODULE
,
4988 .hooknum
= NF_IP6_POST_ROUTING
,
4989 .priority
= NF_IP6_PRI_SELINUX_LAST
,
4994 static int __init
selinux_nf_ip_init(void)
4998 if (!selinux_enabled
)
5001 printk(KERN_DEBUG
"SELinux: Registering netfilter hooks\n");
5003 err
= nf_register_hook(&selinux_ipv4_op
);
5005 panic("SELinux: nf_register_hook for IPv4: error %d\n", err
);
5007 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
5009 err
= nf_register_hook(&selinux_ipv6_op
);
5011 panic("SELinux: nf_register_hook for IPv6: error %d\n", err
);
5019 __initcall(selinux_nf_ip_init
);
5021 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
5022 static void selinux_nf_ip_exit(void)
5024 printk(KERN_DEBUG
"SELinux: Unregistering netfilter hooks\n");
5026 nf_unregister_hook(&selinux_ipv4_op
);
5027 #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
5028 nf_unregister_hook(&selinux_ipv6_op
);
5033 #else /* CONFIG_NETFILTER */
5035 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
5036 #define selinux_nf_ip_exit()
5039 #endif /* CONFIG_NETFILTER */
5041 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
5042 int selinux_disable(void)
5044 extern void exit_sel_fs(void);
5045 static int selinux_disabled
= 0;
5047 if (ss_initialized
) {
5048 /* Not permitted after initial policy load. */
5052 if (selinux_disabled
) {
5053 /* Only do this once. */
5057 printk(KERN_INFO
"SELinux: Disabled at runtime.\n");
5059 selinux_disabled
= 1;
5060 selinux_enabled
= 0;
5062 /* Reset security_ops to the secondary module, dummy or capability. */
5063 security_ops
= secondary_ops
;
5065 /* Unregister netfilter hooks. */
5066 selinux_nf_ip_exit();
5068 /* Unregister selinuxfs. */