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