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