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