]> Git Repo - linux.git/blob - security/selinux/hooks.c
kconfig: show compiler version text in the top comment
[linux.git] / security / selinux / hooks.c
1 /*
2  *  NSA Security-Enhanced Linux (SELinux) security module
3  *
4  *  This file contains the SELinux hook function implementations.
5  *
6  *  Authors:  Stephen Smalley, <[email protected]>
7  *            Chris Vance, <[email protected]>
8  *            Wayne Salamon, <[email protected]>
9  *            James Morris <[email protected]>
10  *
11  *  Copyright (C) 2001,2002 Networks Associates Technology, Inc.
12  *  Copyright (C) 2003-2008 Red Hat, Inc., James Morris <[email protected]>
13  *                                         Eric Paris <[email protected]>
14  *  Copyright (C) 2004-2005 Trusted Computer Solutions, Inc.
15  *                          <[email protected]>
16  *  Copyright (C) 2006, 2007, 2009 Hewlett-Packard Development Company, L.P.
17  *      Paul Moore <[email protected]>
18  *  Copyright (C) 2007 Hitachi Software Engineering Co., Ltd.
19  *                     Yuichi Nakamura <[email protected]>
20  *  Copyright (C) 2016 Mellanox Technologies
21  *
22  *      This program is free software; you can redistribute it and/or modify
23  *      it under the terms of the GNU General Public License version 2,
24  *      as published by the Free Software Foundation.
25  */
26
27 #include <linux/init.h>
28 #include <linux/kd.h>
29 #include <linux/kernel.h>
30 #include <linux/tracehook.h>
31 #include <linux/errno.h>
32 #include <linux/sched/signal.h>
33 #include <linux/sched/task.h>
34 #include <linux/lsm_hooks.h>
35 #include <linux/xattr.h>
36 #include <linux/capability.h>
37 #include <linux/unistd.h>
38 #include <linux/mm.h>
39 #include <linux/mman.h>
40 #include <linux/slab.h>
41 #include <linux/pagemap.h>
42 #include <linux/proc_fs.h>
43 #include <linux/swap.h>
44 #include <linux/spinlock.h>
45 #include <linux/syscalls.h>
46 #include <linux/dcache.h>
47 #include <linux/file.h>
48 #include <linux/fdtable.h>
49 #include <linux/namei.h>
50 #include <linux/mount.h>
51 #include <linux/netfilter_ipv4.h>
52 #include <linux/netfilter_ipv6.h>
53 #include <linux/tty.h>
54 #include <net/icmp.h>
55 #include <net/ip.h>             /* for local_port_range[] */
56 #include <net/tcp.h>            /* struct or_callable used in sock_rcv_skb */
57 #include <net/inet_connection_sock.h>
58 #include <net/net_namespace.h>
59 #include <net/netlabel.h>
60 #include <linux/uaccess.h>
61 #include <asm/ioctls.h>
62 #include <linux/atomic.h>
63 #include <linux/bitops.h>
64 #include <linux/interrupt.h>
65 #include <linux/netdevice.h>    /* for network interface checks */
66 #include <net/netlink.h>
67 #include <linux/tcp.h>
68 #include <linux/udp.h>
69 #include <linux/dccp.h>
70 #include <linux/sctp.h>
71 #include <net/sctp/structs.h>
72 #include <linux/quota.h>
73 #include <linux/un.h>           /* for Unix socket types */
74 #include <net/af_unix.h>        /* for Unix socket types */
75 #include <linux/parser.h>
76 #include <linux/nfs_mount.h>
77 #include <net/ipv6.h>
78 #include <linux/hugetlb.h>
79 #include <linux/personality.h>
80 #include <linux/audit.h>
81 #include <linux/string.h>
82 #include <linux/selinux.h>
83 #include <linux/mutex.h>
84 #include <linux/posix-timers.h>
85 #include <linux/syslog.h>
86 #include <linux/user_namespace.h>
87 #include <linux/export.h>
88 #include <linux/msg.h>
89 #include <linux/shm.h>
90 #include <linux/bpf.h>
91
92 #include "avc.h"
93 #include "objsec.h"
94 #include "netif.h"
95 #include "netnode.h"
96 #include "netport.h"
97 #include "ibpkey.h"
98 #include "xfrm.h"
99 #include "netlabel.h"
100 #include "audit.h"
101 #include "avc_ss.h"
102
103 struct selinux_state selinux_state;
104
105 /* SECMARK reference count */
106 static atomic_t selinux_secmark_refcount = ATOMIC_INIT(0);
107
108 #ifdef CONFIG_SECURITY_SELINUX_DEVELOP
109 static int selinux_enforcing_boot;
110
111 static int __init enforcing_setup(char *str)
112 {
113         unsigned long enforcing;
114         if (!kstrtoul(str, 0, &enforcing))
115                 selinux_enforcing_boot = enforcing ? 1 : 0;
116         return 1;
117 }
118 __setup("enforcing=", enforcing_setup);
119 #else
120 #define selinux_enforcing_boot 1
121 #endif
122
123 #ifdef CONFIG_SECURITY_SELINUX_BOOTPARAM
124 int selinux_enabled = CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE;
125
126 static int __init selinux_enabled_setup(char *str)
127 {
128         unsigned long enabled;
129         if (!kstrtoul(str, 0, &enabled))
130                 selinux_enabled = enabled ? 1 : 0;
131         return 1;
132 }
133 __setup("selinux=", selinux_enabled_setup);
134 #else
135 int selinux_enabled = 1;
136 #endif
137
138 static unsigned int selinux_checkreqprot_boot =
139         CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE;
140
141 static int __init checkreqprot_setup(char *str)
142 {
143         unsigned long checkreqprot;
144
145         if (!kstrtoul(str, 0, &checkreqprot))
146                 selinux_checkreqprot_boot = checkreqprot ? 1 : 0;
147         return 1;
148 }
149 __setup("checkreqprot=", checkreqprot_setup);
150
151 static struct kmem_cache *sel_inode_cache;
152 static struct kmem_cache *file_security_cache;
153
154 /**
155  * selinux_secmark_enabled - Check to see if SECMARK is currently enabled
156  *
157  * Description:
158  * This function checks the SECMARK reference counter to see if any SECMARK
159  * targets are currently configured, if the reference counter is greater than
160  * zero SECMARK is considered to be enabled.  Returns true (1) if SECMARK is
161  * enabled, false (0) if SECMARK is disabled.  If the always_check_network
162  * policy capability is enabled, SECMARK is always considered enabled.
163  *
164  */
165 static int selinux_secmark_enabled(void)
166 {
167         return (selinux_policycap_alwaysnetwork() ||
168                 atomic_read(&selinux_secmark_refcount));
169 }
170
171 /**
172  * selinux_peerlbl_enabled - Check to see if peer labeling is currently enabled
173  *
174  * Description:
175  * This function checks if NetLabel or labeled IPSEC is enabled.  Returns true
176  * (1) if any are enabled or false (0) if neither are enabled.  If the
177  * always_check_network policy capability is enabled, peer labeling
178  * is always considered enabled.
179  *
180  */
181 static int selinux_peerlbl_enabled(void)
182 {
183         return (selinux_policycap_alwaysnetwork() ||
184                 netlbl_enabled() || selinux_xfrm_enabled());
185 }
186
187 static int selinux_netcache_avc_callback(u32 event)
188 {
189         if (event == AVC_CALLBACK_RESET) {
190                 sel_netif_flush();
191                 sel_netnode_flush();
192                 sel_netport_flush();
193                 synchronize_net();
194         }
195         return 0;
196 }
197
198 static int selinux_lsm_notifier_avc_callback(u32 event)
199 {
200         if (event == AVC_CALLBACK_RESET) {
201                 sel_ib_pkey_flush();
202                 call_lsm_notifier(LSM_POLICY_CHANGE, NULL);
203         }
204
205         return 0;
206 }
207
208 /*
209  * initialise the security for the init task
210  */
211 static void cred_init_security(void)
212 {
213         struct cred *cred = (struct cred *) current->real_cred;
214         struct task_security_struct *tsec;
215
216         tsec = kzalloc(sizeof(struct task_security_struct), GFP_KERNEL);
217         if (!tsec)
218                 panic("SELinux:  Failed to initialize initial task.\n");
219
220         tsec->osid = tsec->sid = SECINITSID_KERNEL;
221         cred->security = tsec;
222 }
223
224 /*
225  * get the security ID of a set of credentials
226  */
227 static inline u32 cred_sid(const struct cred *cred)
228 {
229         const struct task_security_struct *tsec;
230
231         tsec = cred->security;
232         return tsec->sid;
233 }
234
235 /*
236  * get the objective security ID of a task
237  */
238 static inline u32 task_sid(const struct task_struct *task)
239 {
240         u32 sid;
241
242         rcu_read_lock();
243         sid = cred_sid(__task_cred(task));
244         rcu_read_unlock();
245         return sid;
246 }
247
248 /* Allocate and free functions for each kind of security blob. */
249
250 static int inode_alloc_security(struct inode *inode)
251 {
252         struct inode_security_struct *isec;
253         u32 sid = current_sid();
254
255         isec = kmem_cache_zalloc(sel_inode_cache, GFP_NOFS);
256         if (!isec)
257                 return -ENOMEM;
258
259         spin_lock_init(&isec->lock);
260         INIT_LIST_HEAD(&isec->list);
261         isec->inode = inode;
262         isec->sid = SECINITSID_UNLABELED;
263         isec->sclass = SECCLASS_FILE;
264         isec->task_sid = sid;
265         isec->initialized = LABEL_INVALID;
266         inode->i_security = isec;
267
268         return 0;
269 }
270
271 static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry);
272
273 /*
274  * Try reloading inode security labels that have been marked as invalid.  The
275  * @may_sleep parameter indicates when sleeping and thus reloading labels is
276  * allowed; when set to false, returns -ECHILD when the label is
277  * invalid.  The @opt_dentry parameter should be set to a dentry of the inode;
278  * when no dentry is available, set it to NULL instead.
279  */
280 static int __inode_security_revalidate(struct inode *inode,
281                                        struct dentry *opt_dentry,
282                                        bool may_sleep)
283 {
284         struct inode_security_struct *isec = inode->i_security;
285
286         might_sleep_if(may_sleep);
287
288         if (selinux_state.initialized &&
289             isec->initialized != LABEL_INITIALIZED) {
290                 if (!may_sleep)
291                         return -ECHILD;
292
293                 /*
294                  * Try reloading the inode security label.  This will fail if
295                  * @opt_dentry is NULL and no dentry for this inode can be
296                  * found; in that case, continue using the old label.
297                  */
298                 inode_doinit_with_dentry(inode, opt_dentry);
299         }
300         return 0;
301 }
302
303 static struct inode_security_struct *inode_security_novalidate(struct inode *inode)
304 {
305         return inode->i_security;
306 }
307
308 static struct inode_security_struct *inode_security_rcu(struct inode *inode, bool rcu)
309 {
310         int error;
311
312         error = __inode_security_revalidate(inode, NULL, !rcu);
313         if (error)
314                 return ERR_PTR(error);
315         return inode->i_security;
316 }
317
318 /*
319  * Get the security label of an inode.
320  */
321 static struct inode_security_struct *inode_security(struct inode *inode)
322 {
323         __inode_security_revalidate(inode, NULL, true);
324         return inode->i_security;
325 }
326
327 static struct inode_security_struct *backing_inode_security_novalidate(struct dentry *dentry)
328 {
329         struct inode *inode = d_backing_inode(dentry);
330
331         return inode->i_security;
332 }
333
334 /*
335  * Get the security label of a dentry's backing inode.
336  */
337 static struct inode_security_struct *backing_inode_security(struct dentry *dentry)
338 {
339         struct inode *inode = d_backing_inode(dentry);
340
341         __inode_security_revalidate(inode, dentry, true);
342         return inode->i_security;
343 }
344
345 static void inode_free_rcu(struct rcu_head *head)
346 {
347         struct inode_security_struct *isec;
348
349         isec = container_of(head, struct inode_security_struct, rcu);
350         kmem_cache_free(sel_inode_cache, isec);
351 }
352
353 static void inode_free_security(struct inode *inode)
354 {
355         struct inode_security_struct *isec = inode->i_security;
356         struct superblock_security_struct *sbsec = inode->i_sb->s_security;
357
358         /*
359          * As not all inode security structures are in a list, we check for
360          * empty list outside of the lock to make sure that we won't waste
361          * time taking a lock doing nothing.
362          *
363          * The list_del_init() function can be safely called more than once.
364          * It should not be possible for this function to be called with
365          * concurrent list_add(), but for better safety against future changes
366          * in the code, we use list_empty_careful() here.
367          */
368         if (!list_empty_careful(&isec->list)) {
369                 spin_lock(&sbsec->isec_lock);
370                 list_del_init(&isec->list);
371                 spin_unlock(&sbsec->isec_lock);
372         }
373
374         /*
375          * The inode may still be referenced in a path walk and
376          * a call to selinux_inode_permission() can be made
377          * after inode_free_security() is called. Ideally, the VFS
378          * wouldn't do this, but fixing that is a much harder
379          * job. For now, simply free the i_security via RCU, and
380          * leave the current inode->i_security pointer intact.
381          * The inode will be freed after the RCU grace period too.
382          */
383         call_rcu(&isec->rcu, inode_free_rcu);
384 }
385
386 static int file_alloc_security(struct file *file)
387 {
388         struct file_security_struct *fsec;
389         u32 sid = current_sid();
390
391         fsec = kmem_cache_zalloc(file_security_cache, GFP_KERNEL);
392         if (!fsec)
393                 return -ENOMEM;
394
395         fsec->sid = sid;
396         fsec->fown_sid = sid;
397         file->f_security = fsec;
398
399         return 0;
400 }
401
402 static void file_free_security(struct file *file)
403 {
404         struct file_security_struct *fsec = file->f_security;
405         file->f_security = NULL;
406         kmem_cache_free(file_security_cache, fsec);
407 }
408
409 static int superblock_alloc_security(struct super_block *sb)
410 {
411         struct superblock_security_struct *sbsec;
412
413         sbsec = kzalloc(sizeof(struct superblock_security_struct), GFP_KERNEL);
414         if (!sbsec)
415                 return -ENOMEM;
416
417         mutex_init(&sbsec->lock);
418         INIT_LIST_HEAD(&sbsec->isec_head);
419         spin_lock_init(&sbsec->isec_lock);
420         sbsec->sb = sb;
421         sbsec->sid = SECINITSID_UNLABELED;
422         sbsec->def_sid = SECINITSID_FILE;
423         sbsec->mntpoint_sid = SECINITSID_UNLABELED;
424         sb->s_security = sbsec;
425
426         return 0;
427 }
428
429 static void superblock_free_security(struct super_block *sb)
430 {
431         struct superblock_security_struct *sbsec = sb->s_security;
432         sb->s_security = NULL;
433         kfree(sbsec);
434 }
435
436 static inline int inode_doinit(struct inode *inode)
437 {
438         return inode_doinit_with_dentry(inode, NULL);
439 }
440
441 enum {
442         Opt_error = -1,
443         Opt_context = 1,
444         Opt_fscontext = 2,
445         Opt_defcontext = 3,
446         Opt_rootcontext = 4,
447         Opt_labelsupport = 5,
448         Opt_nextmntopt = 6,
449 };
450
451 #define NUM_SEL_MNT_OPTS        (Opt_nextmntopt - 1)
452
453 static const match_table_t tokens = {
454         {Opt_context, CONTEXT_STR "%s"},
455         {Opt_fscontext, FSCONTEXT_STR "%s"},
456         {Opt_defcontext, DEFCONTEXT_STR "%s"},
457         {Opt_rootcontext, ROOTCONTEXT_STR "%s"},
458         {Opt_labelsupport, LABELSUPP_STR},
459         {Opt_error, NULL},
460 };
461
462 #define SEL_MOUNT_FAIL_MSG "SELinux:  duplicate or incompatible mount options\n"
463
464 static int may_context_mount_sb_relabel(u32 sid,
465                         struct superblock_security_struct *sbsec,
466                         const struct cred *cred)
467 {
468         const struct task_security_struct *tsec = cred->security;
469         int rc;
470
471         rc = avc_has_perm(&selinux_state,
472                           tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
473                           FILESYSTEM__RELABELFROM, NULL);
474         if (rc)
475                 return rc;
476
477         rc = avc_has_perm(&selinux_state,
478                           tsec->sid, sid, SECCLASS_FILESYSTEM,
479                           FILESYSTEM__RELABELTO, NULL);
480         return rc;
481 }
482
483 static int may_context_mount_inode_relabel(u32 sid,
484                         struct superblock_security_struct *sbsec,
485                         const struct cred *cred)
486 {
487         const struct task_security_struct *tsec = cred->security;
488         int rc;
489         rc = avc_has_perm(&selinux_state,
490                           tsec->sid, sbsec->sid, SECCLASS_FILESYSTEM,
491                           FILESYSTEM__RELABELFROM, NULL);
492         if (rc)
493                 return rc;
494
495         rc = avc_has_perm(&selinux_state,
496                           sid, sbsec->sid, SECCLASS_FILESYSTEM,
497                           FILESYSTEM__ASSOCIATE, NULL);
498         return rc;
499 }
500
501 static int selinux_is_sblabel_mnt(struct super_block *sb)
502 {
503         struct superblock_security_struct *sbsec = sb->s_security;
504
505         return sbsec->behavior == SECURITY_FS_USE_XATTR ||
506                 sbsec->behavior == SECURITY_FS_USE_TRANS ||
507                 sbsec->behavior == SECURITY_FS_USE_TASK ||
508                 sbsec->behavior == SECURITY_FS_USE_NATIVE ||
509                 /* Special handling. Genfs but also in-core setxattr handler */
510                 !strcmp(sb->s_type->name, "sysfs") ||
511                 !strcmp(sb->s_type->name, "pstore") ||
512                 !strcmp(sb->s_type->name, "debugfs") ||
513                 !strcmp(sb->s_type->name, "tracefs") ||
514                 !strcmp(sb->s_type->name, "rootfs") ||
515                 (selinux_policycap_cgroupseclabel() &&
516                  (!strcmp(sb->s_type->name, "cgroup") ||
517                   !strcmp(sb->s_type->name, "cgroup2")));
518 }
519
520 static int sb_finish_set_opts(struct super_block *sb)
521 {
522         struct superblock_security_struct *sbsec = sb->s_security;
523         struct dentry *root = sb->s_root;
524         struct inode *root_inode = d_backing_inode(root);
525         int rc = 0;
526
527         if (sbsec->behavior == SECURITY_FS_USE_XATTR) {
528                 /* Make sure that the xattr handler exists and that no
529                    error other than -ENODATA is returned by getxattr on
530                    the root directory.  -ENODATA is ok, as this may be
531                    the first boot of the SELinux kernel before we have
532                    assigned xattr values to the filesystem. */
533                 if (!(root_inode->i_opflags & IOP_XATTR)) {
534                         printk(KERN_WARNING "SELinux: (dev %s, type %s) has no "
535                                "xattr support\n", sb->s_id, sb->s_type->name);
536                         rc = -EOPNOTSUPP;
537                         goto out;
538                 }
539
540                 rc = __vfs_getxattr(root, root_inode, XATTR_NAME_SELINUX, NULL, 0);
541                 if (rc < 0 && rc != -ENODATA) {
542                         if (rc == -EOPNOTSUPP)
543                                 printk(KERN_WARNING "SELinux: (dev %s, type "
544                                        "%s) has no security xattr handler\n",
545                                        sb->s_id, sb->s_type->name);
546                         else
547                                 printk(KERN_WARNING "SELinux: (dev %s, type "
548                                        "%s) getxattr errno %d\n", sb->s_id,
549                                        sb->s_type->name, -rc);
550                         goto out;
551                 }
552         }
553
554         sbsec->flags |= SE_SBINITIALIZED;
555
556         /*
557          * Explicitly set or clear SBLABEL_MNT.  It's not sufficient to simply
558          * leave the flag untouched because sb_clone_mnt_opts might be handing
559          * us a superblock that needs the flag to be cleared.
560          */
561         if (selinux_is_sblabel_mnt(sb))
562                 sbsec->flags |= SBLABEL_MNT;
563         else
564                 sbsec->flags &= ~SBLABEL_MNT;
565
566         /* Initialize the root inode. */
567         rc = inode_doinit_with_dentry(root_inode, root);
568
569         /* Initialize any other inodes associated with the superblock, e.g.
570            inodes created prior to initial policy load or inodes created
571            during get_sb by a pseudo filesystem that directly
572            populates itself. */
573         spin_lock(&sbsec->isec_lock);
574 next_inode:
575         if (!list_empty(&sbsec->isec_head)) {
576                 struct inode_security_struct *isec =
577                                 list_entry(sbsec->isec_head.next,
578                                            struct inode_security_struct, list);
579                 struct inode *inode = isec->inode;
580                 list_del_init(&isec->list);
581                 spin_unlock(&sbsec->isec_lock);
582                 inode = igrab(inode);
583                 if (inode) {
584                         if (!IS_PRIVATE(inode))
585                                 inode_doinit(inode);
586                         iput(inode);
587                 }
588                 spin_lock(&sbsec->isec_lock);
589                 goto next_inode;
590         }
591         spin_unlock(&sbsec->isec_lock);
592 out:
593         return rc;
594 }
595
596 /*
597  * This function should allow an FS to ask what it's mount security
598  * options were so it can use those later for submounts, displaying
599  * mount options, or whatever.
600  */
601 static int selinux_get_mnt_opts(const struct super_block *sb,
602                                 struct security_mnt_opts *opts)
603 {
604         int rc = 0, i;
605         struct superblock_security_struct *sbsec = sb->s_security;
606         char *context = NULL;
607         u32 len;
608         char tmp;
609
610         security_init_mnt_opts(opts);
611
612         if (!(sbsec->flags & SE_SBINITIALIZED))
613                 return -EINVAL;
614
615         if (!selinux_state.initialized)
616                 return -EINVAL;
617
618         /* make sure we always check enough bits to cover the mask */
619         BUILD_BUG_ON(SE_MNTMASK >= (1 << NUM_SEL_MNT_OPTS));
620
621         tmp = sbsec->flags & SE_MNTMASK;
622         /* count the number of mount options for this sb */
623         for (i = 0; i < NUM_SEL_MNT_OPTS; i++) {
624                 if (tmp & 0x01)
625                         opts->num_mnt_opts++;
626                 tmp >>= 1;
627         }
628         /* Check if the Label support flag is set */
629         if (sbsec->flags & SBLABEL_MNT)
630                 opts->num_mnt_opts++;
631
632         opts->mnt_opts = kcalloc(opts->num_mnt_opts, sizeof(char *), GFP_ATOMIC);
633         if (!opts->mnt_opts) {
634                 rc = -ENOMEM;
635                 goto out_free;
636         }
637
638         opts->mnt_opts_flags = kcalloc(opts->num_mnt_opts, sizeof(int), GFP_ATOMIC);
639         if (!opts->mnt_opts_flags) {
640                 rc = -ENOMEM;
641                 goto out_free;
642         }
643
644         i = 0;
645         if (sbsec->flags & FSCONTEXT_MNT) {
646                 rc = security_sid_to_context(&selinux_state, sbsec->sid,
647                                              &context, &len);
648                 if (rc)
649                         goto out_free;
650                 opts->mnt_opts[i] = context;
651                 opts->mnt_opts_flags[i++] = FSCONTEXT_MNT;
652         }
653         if (sbsec->flags & CONTEXT_MNT) {
654                 rc = security_sid_to_context(&selinux_state,
655                                              sbsec->mntpoint_sid,
656                                              &context, &len);
657                 if (rc)
658                         goto out_free;
659                 opts->mnt_opts[i] = context;
660                 opts->mnt_opts_flags[i++] = CONTEXT_MNT;
661         }
662         if (sbsec->flags & DEFCONTEXT_MNT) {
663                 rc = security_sid_to_context(&selinux_state, sbsec->def_sid,
664                                              &context, &len);
665                 if (rc)
666                         goto out_free;
667                 opts->mnt_opts[i] = context;
668                 opts->mnt_opts_flags[i++] = DEFCONTEXT_MNT;
669         }
670         if (sbsec->flags & ROOTCONTEXT_MNT) {
671                 struct dentry *root = sbsec->sb->s_root;
672                 struct inode_security_struct *isec = backing_inode_security(root);
673
674                 rc = security_sid_to_context(&selinux_state, isec->sid,
675                                              &context, &len);
676                 if (rc)
677                         goto out_free;
678                 opts->mnt_opts[i] = context;
679                 opts->mnt_opts_flags[i++] = ROOTCONTEXT_MNT;
680         }
681         if (sbsec->flags & SBLABEL_MNT) {
682                 opts->mnt_opts[i] = NULL;
683                 opts->mnt_opts_flags[i++] = SBLABEL_MNT;
684         }
685
686         BUG_ON(i != opts->num_mnt_opts);
687
688         return 0;
689
690 out_free:
691         security_free_mnt_opts(opts);
692         return rc;
693 }
694
695 static int bad_option(struct superblock_security_struct *sbsec, char flag,
696                       u32 old_sid, u32 new_sid)
697 {
698         char mnt_flags = sbsec->flags & SE_MNTMASK;
699
700         /* check if the old mount command had the same options */
701         if (sbsec->flags & SE_SBINITIALIZED)
702                 if (!(sbsec->flags & flag) ||
703                     (old_sid != new_sid))
704                         return 1;
705
706         /* check if we were passed the same options twice,
707          * aka someone passed context=a,context=b
708          */
709         if (!(sbsec->flags & SE_SBINITIALIZED))
710                 if (mnt_flags & flag)
711                         return 1;
712         return 0;
713 }
714
715 /*
716  * Allow filesystems with binary mount data to explicitly set mount point
717  * labeling information.
718  */
719 static int selinux_set_mnt_opts(struct super_block *sb,
720                                 struct security_mnt_opts *opts,
721                                 unsigned long kern_flags,
722                                 unsigned long *set_kern_flags)
723 {
724         const struct cred *cred = current_cred();
725         int rc = 0, i;
726         struct superblock_security_struct *sbsec = sb->s_security;
727         const char *name = sb->s_type->name;
728         struct dentry *root = sbsec->sb->s_root;
729         struct inode_security_struct *root_isec;
730         u32 fscontext_sid = 0, context_sid = 0, rootcontext_sid = 0;
731         u32 defcontext_sid = 0;
732         char **mount_options = opts->mnt_opts;
733         int *flags = opts->mnt_opts_flags;
734         int num_opts = opts->num_mnt_opts;
735
736         mutex_lock(&sbsec->lock);
737
738         if (!selinux_state.initialized) {
739                 if (!num_opts) {
740                         /* Defer initialization until selinux_complete_init,
741                            after the initial policy is loaded and the security
742                            server is ready to handle calls. */
743                         goto out;
744                 }
745                 rc = -EINVAL;
746                 printk(KERN_WARNING "SELinux: Unable to set superblock options "
747                         "before the security server is initialized\n");
748                 goto out;
749         }
750         if (kern_flags && !set_kern_flags) {
751                 /* Specifying internal flags without providing a place to
752                  * place the results is not allowed */
753                 rc = -EINVAL;
754                 goto out;
755         }
756
757         /*
758          * Binary mount data FS will come through this function twice.  Once
759          * from an explicit call and once from the generic calls from the vfs.
760          * Since the generic VFS calls will not contain any security mount data
761          * we need to skip the double mount verification.
762          *
763          * This does open a hole in which we will not notice if the first
764          * mount using this sb set explict options and a second mount using
765          * this sb does not set any security options.  (The first options
766          * will be used for both mounts)
767          */
768         if ((sbsec->flags & SE_SBINITIALIZED) && (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA)
769             && (num_opts == 0))
770                 goto out;
771
772         root_isec = backing_inode_security_novalidate(root);
773
774         /*
775          * parse the mount options, check if they are valid sids.
776          * also check if someone is trying to mount the same sb more
777          * than once with different security options.
778          */
779         for (i = 0; i < num_opts; i++) {
780                 u32 sid;
781
782                 if (flags[i] == SBLABEL_MNT)
783                         continue;
784                 rc = security_context_str_to_sid(&selinux_state,
785                                                  mount_options[i], &sid,
786                                                  GFP_KERNEL);
787                 if (rc) {
788                         printk(KERN_WARNING "SELinux: security_context_str_to_sid"
789                                "(%s) failed for (dev %s, type %s) errno=%d\n",
790                                mount_options[i], sb->s_id, name, rc);
791                         goto out;
792                 }
793                 switch (flags[i]) {
794                 case FSCONTEXT_MNT:
795                         fscontext_sid = sid;
796
797                         if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid,
798                                         fscontext_sid))
799                                 goto out_double_mount;
800
801                         sbsec->flags |= FSCONTEXT_MNT;
802                         break;
803                 case CONTEXT_MNT:
804                         context_sid = sid;
805
806                         if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid,
807                                         context_sid))
808                                 goto out_double_mount;
809
810                         sbsec->flags |= CONTEXT_MNT;
811                         break;
812                 case ROOTCONTEXT_MNT:
813                         rootcontext_sid = sid;
814
815                         if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid,
816                                         rootcontext_sid))
817                                 goto out_double_mount;
818
819                         sbsec->flags |= ROOTCONTEXT_MNT;
820
821                         break;
822                 case DEFCONTEXT_MNT:
823                         defcontext_sid = sid;
824
825                         if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid,
826                                         defcontext_sid))
827                                 goto out_double_mount;
828
829                         sbsec->flags |= DEFCONTEXT_MNT;
830
831                         break;
832                 default:
833                         rc = -EINVAL;
834                         goto out;
835                 }
836         }
837
838         if (sbsec->flags & SE_SBINITIALIZED) {
839                 /* previously mounted with options, but not on this attempt? */
840                 if ((sbsec->flags & SE_MNTMASK) && !num_opts)
841                         goto out_double_mount;
842                 rc = 0;
843                 goto out;
844         }
845
846         if (strcmp(sb->s_type->name, "proc") == 0)
847                 sbsec->flags |= SE_SBPROC | SE_SBGENFS;
848
849         if (!strcmp(sb->s_type->name, "debugfs") ||
850             !strcmp(sb->s_type->name, "tracefs") ||
851             !strcmp(sb->s_type->name, "sysfs") ||
852             !strcmp(sb->s_type->name, "pstore") ||
853             !strcmp(sb->s_type->name, "cgroup") ||
854             !strcmp(sb->s_type->name, "cgroup2"))
855                 sbsec->flags |= SE_SBGENFS;
856
857         if (!sbsec->behavior) {
858                 /*
859                  * Determine the labeling behavior to use for this
860                  * filesystem type.
861                  */
862                 rc = security_fs_use(&selinux_state, sb);
863                 if (rc) {
864                         printk(KERN_WARNING
865                                 "%s: security_fs_use(%s) returned %d\n",
866                                         __func__, sb->s_type->name, rc);
867                         goto out;
868                 }
869         }
870
871         /*
872          * If this is a user namespace mount and the filesystem type is not
873          * explicitly whitelisted, then no contexts are allowed on the command
874          * line and security labels must be ignored.
875          */
876         if (sb->s_user_ns != &init_user_ns &&
877             strcmp(sb->s_type->name, "tmpfs") &&
878             strcmp(sb->s_type->name, "ramfs") &&
879             strcmp(sb->s_type->name, "devpts")) {
880                 if (context_sid || fscontext_sid || rootcontext_sid ||
881                     defcontext_sid) {
882                         rc = -EACCES;
883                         goto out;
884                 }
885                 if (sbsec->behavior == SECURITY_FS_USE_XATTR) {
886                         sbsec->behavior = SECURITY_FS_USE_MNTPOINT;
887                         rc = security_transition_sid(&selinux_state,
888                                                      current_sid(),
889                                                      current_sid(),
890                                                      SECCLASS_FILE, NULL,
891                                                      &sbsec->mntpoint_sid);
892                         if (rc)
893                                 goto out;
894                 }
895                 goto out_set_opts;
896         }
897
898         /* sets the context of the superblock for the fs being mounted. */
899         if (fscontext_sid) {
900                 rc = may_context_mount_sb_relabel(fscontext_sid, sbsec, cred);
901                 if (rc)
902                         goto out;
903
904                 sbsec->sid = fscontext_sid;
905         }
906
907         /*
908          * Switch to using mount point labeling behavior.
909          * sets the label used on all file below the mountpoint, and will set
910          * the superblock context if not already set.
911          */
912         if (kern_flags & SECURITY_LSM_NATIVE_LABELS && !context_sid) {
913                 sbsec->behavior = SECURITY_FS_USE_NATIVE;
914                 *set_kern_flags |= SECURITY_LSM_NATIVE_LABELS;
915         }
916
917         if (context_sid) {
918                 if (!fscontext_sid) {
919                         rc = may_context_mount_sb_relabel(context_sid, sbsec,
920                                                           cred);
921                         if (rc)
922                                 goto out;
923                         sbsec->sid = context_sid;
924                 } else {
925                         rc = may_context_mount_inode_relabel(context_sid, sbsec,
926                                                              cred);
927                         if (rc)
928                                 goto out;
929                 }
930                 if (!rootcontext_sid)
931                         rootcontext_sid = context_sid;
932
933                 sbsec->mntpoint_sid = context_sid;
934                 sbsec->behavior = SECURITY_FS_USE_MNTPOINT;
935         }
936
937         if (rootcontext_sid) {
938                 rc = may_context_mount_inode_relabel(rootcontext_sid, sbsec,
939                                                      cred);
940                 if (rc)
941                         goto out;
942
943                 root_isec->sid = rootcontext_sid;
944                 root_isec->initialized = LABEL_INITIALIZED;
945         }
946
947         if (defcontext_sid) {
948                 if (sbsec->behavior != SECURITY_FS_USE_XATTR &&
949                         sbsec->behavior != SECURITY_FS_USE_NATIVE) {
950                         rc = -EINVAL;
951                         printk(KERN_WARNING "SELinux: defcontext option is "
952                                "invalid for this filesystem type\n");
953                         goto out;
954                 }
955
956                 if (defcontext_sid != sbsec->def_sid) {
957                         rc = may_context_mount_inode_relabel(defcontext_sid,
958                                                              sbsec, cred);
959                         if (rc)
960                                 goto out;
961                 }
962
963                 sbsec->def_sid = defcontext_sid;
964         }
965
966 out_set_opts:
967         rc = sb_finish_set_opts(sb);
968 out:
969         mutex_unlock(&sbsec->lock);
970         return rc;
971 out_double_mount:
972         rc = -EINVAL;
973         printk(KERN_WARNING "SELinux: mount invalid.  Same superblock, different "
974                "security settings for (dev %s, type %s)\n", sb->s_id, name);
975         goto out;
976 }
977
978 static int selinux_cmp_sb_context(const struct super_block *oldsb,
979                                     const struct super_block *newsb)
980 {
981         struct superblock_security_struct *old = oldsb->s_security;
982         struct superblock_security_struct *new = newsb->s_security;
983         char oldflags = old->flags & SE_MNTMASK;
984         char newflags = new->flags & SE_MNTMASK;
985
986         if (oldflags != newflags)
987                 goto mismatch;
988         if ((oldflags & FSCONTEXT_MNT) && old->sid != new->sid)
989                 goto mismatch;
990         if ((oldflags & CONTEXT_MNT) && old->mntpoint_sid != new->mntpoint_sid)
991                 goto mismatch;
992         if ((oldflags & DEFCONTEXT_MNT) && old->def_sid != new->def_sid)
993                 goto mismatch;
994         if (oldflags & ROOTCONTEXT_MNT) {
995                 struct inode_security_struct *oldroot = backing_inode_security(oldsb->s_root);
996                 struct inode_security_struct *newroot = backing_inode_security(newsb->s_root);
997                 if (oldroot->sid != newroot->sid)
998                         goto mismatch;
999         }
1000         return 0;
1001 mismatch:
1002         printk(KERN_WARNING "SELinux: mount invalid.  Same superblock, "
1003                             "different security settings for (dev %s, "
1004                             "type %s)\n", newsb->s_id, newsb->s_type->name);
1005         return -EBUSY;
1006 }
1007
1008 static int selinux_sb_clone_mnt_opts(const struct super_block *oldsb,
1009                                         struct super_block *newsb,
1010                                         unsigned long kern_flags,
1011                                         unsigned long *set_kern_flags)
1012 {
1013         int rc = 0;
1014         const struct superblock_security_struct *oldsbsec = oldsb->s_security;
1015         struct superblock_security_struct *newsbsec = newsb->s_security;
1016
1017         int set_fscontext =     (oldsbsec->flags & FSCONTEXT_MNT);
1018         int set_context =       (oldsbsec->flags & CONTEXT_MNT);
1019         int set_rootcontext =   (oldsbsec->flags & ROOTCONTEXT_MNT);
1020
1021         /*
1022          * if the parent was able to be mounted it clearly had no special lsm
1023          * mount options.  thus we can safely deal with this superblock later
1024          */
1025         if (!selinux_state.initialized)
1026                 return 0;
1027
1028         /*
1029          * Specifying internal flags without providing a place to
1030          * place the results is not allowed.
1031          */
1032         if (kern_flags && !set_kern_flags)
1033                 return -EINVAL;
1034
1035         /* how can we clone if the old one wasn't set up?? */
1036         BUG_ON(!(oldsbsec->flags & SE_SBINITIALIZED));
1037
1038         /* if fs is reusing a sb, make sure that the contexts match */
1039         if (newsbsec->flags & SE_SBINITIALIZED)
1040                 return selinux_cmp_sb_context(oldsb, newsb);
1041
1042         mutex_lock(&newsbsec->lock);
1043
1044         newsbsec->flags = oldsbsec->flags;
1045
1046         newsbsec->sid = oldsbsec->sid;
1047         newsbsec->def_sid = oldsbsec->def_sid;
1048         newsbsec->behavior = oldsbsec->behavior;
1049
1050         if (newsbsec->behavior == SECURITY_FS_USE_NATIVE &&
1051                 !(kern_flags & SECURITY_LSM_NATIVE_LABELS) && !set_context) {
1052                 rc = security_fs_use(&selinux_state, newsb);
1053                 if (rc)
1054                         goto out;
1055         }
1056
1057         if (kern_flags & SECURITY_LSM_NATIVE_LABELS && !set_context) {
1058                 newsbsec->behavior = SECURITY_FS_USE_NATIVE;
1059                 *set_kern_flags |= SECURITY_LSM_NATIVE_LABELS;
1060         }
1061
1062         if (set_context) {
1063                 u32 sid = oldsbsec->mntpoint_sid;
1064
1065                 if (!set_fscontext)
1066                         newsbsec->sid = sid;
1067                 if (!set_rootcontext) {
1068                         struct inode_security_struct *newisec = backing_inode_security(newsb->s_root);
1069                         newisec->sid = sid;
1070                 }
1071                 newsbsec->mntpoint_sid = sid;
1072         }
1073         if (set_rootcontext) {
1074                 const struct inode_security_struct *oldisec = backing_inode_security(oldsb->s_root);
1075                 struct inode_security_struct *newisec = backing_inode_security(newsb->s_root);
1076
1077                 newisec->sid = oldisec->sid;
1078         }
1079
1080         sb_finish_set_opts(newsb);
1081 out:
1082         mutex_unlock(&newsbsec->lock);
1083         return rc;
1084 }
1085
1086 static int selinux_parse_opts_str(char *options,
1087                                   struct security_mnt_opts *opts)
1088 {
1089         char *p;
1090         char *context = NULL, *defcontext = NULL;
1091         char *fscontext = NULL, *rootcontext = NULL;
1092         int rc, num_mnt_opts = 0;
1093
1094         opts->num_mnt_opts = 0;
1095
1096         /* Standard string-based options. */
1097         while ((p = strsep(&options, "|")) != NULL) {
1098                 int token;
1099                 substring_t args[MAX_OPT_ARGS];
1100
1101                 if (!*p)
1102                         continue;
1103
1104                 token = match_token(p, tokens, args);
1105
1106                 switch (token) {
1107                 case Opt_context:
1108                         if (context || defcontext) {
1109                                 rc = -EINVAL;
1110                                 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
1111                                 goto out_err;
1112                         }
1113                         context = match_strdup(&args[0]);
1114                         if (!context) {
1115                                 rc = -ENOMEM;
1116                                 goto out_err;
1117                         }
1118                         break;
1119
1120                 case Opt_fscontext:
1121                         if (fscontext) {
1122                                 rc = -EINVAL;
1123                                 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
1124                                 goto out_err;
1125                         }
1126                         fscontext = match_strdup(&args[0]);
1127                         if (!fscontext) {
1128                                 rc = -ENOMEM;
1129                                 goto out_err;
1130                         }
1131                         break;
1132
1133                 case Opt_rootcontext:
1134                         if (rootcontext) {
1135                                 rc = -EINVAL;
1136                                 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
1137                                 goto out_err;
1138                         }
1139                         rootcontext = match_strdup(&args[0]);
1140                         if (!rootcontext) {
1141                                 rc = -ENOMEM;
1142                                 goto out_err;
1143                         }
1144                         break;
1145
1146                 case Opt_defcontext:
1147                         if (context || defcontext) {
1148                                 rc = -EINVAL;
1149                                 printk(KERN_WARNING SEL_MOUNT_FAIL_MSG);
1150                                 goto out_err;
1151                         }
1152                         defcontext = match_strdup(&args[0]);
1153                         if (!defcontext) {
1154                                 rc = -ENOMEM;
1155                                 goto out_err;
1156                         }
1157                         break;
1158                 case Opt_labelsupport:
1159                         break;
1160                 default:
1161                         rc = -EINVAL;
1162                         printk(KERN_WARNING "SELinux:  unknown mount option\n");
1163                         goto out_err;
1164
1165                 }
1166         }
1167
1168         rc = -ENOMEM;
1169         opts->mnt_opts = kcalloc(NUM_SEL_MNT_OPTS, sizeof(char *), GFP_KERNEL);
1170         if (!opts->mnt_opts)
1171                 goto out_err;
1172
1173         opts->mnt_opts_flags = kcalloc(NUM_SEL_MNT_OPTS, sizeof(int),
1174                                        GFP_KERNEL);
1175         if (!opts->mnt_opts_flags)
1176                 goto out_err;
1177
1178         if (fscontext) {
1179                 opts->mnt_opts[num_mnt_opts] = fscontext;
1180                 opts->mnt_opts_flags[num_mnt_opts++] = FSCONTEXT_MNT;
1181         }
1182         if (context) {
1183                 opts->mnt_opts[num_mnt_opts] = context;
1184                 opts->mnt_opts_flags[num_mnt_opts++] = CONTEXT_MNT;
1185         }
1186         if (rootcontext) {
1187                 opts->mnt_opts[num_mnt_opts] = rootcontext;
1188                 opts->mnt_opts_flags[num_mnt_opts++] = ROOTCONTEXT_MNT;
1189         }
1190         if (defcontext) {
1191                 opts->mnt_opts[num_mnt_opts] = defcontext;
1192                 opts->mnt_opts_flags[num_mnt_opts++] = DEFCONTEXT_MNT;
1193         }
1194
1195         opts->num_mnt_opts = num_mnt_opts;
1196         return 0;
1197
1198 out_err:
1199         security_free_mnt_opts(opts);
1200         kfree(context);
1201         kfree(defcontext);
1202         kfree(fscontext);
1203         kfree(rootcontext);
1204         return rc;
1205 }
1206 /*
1207  * string mount options parsing and call set the sbsec
1208  */
1209 static int superblock_doinit(struct super_block *sb, void *data)
1210 {
1211         int rc = 0;
1212         char *options = data;
1213         struct security_mnt_opts opts;
1214
1215         security_init_mnt_opts(&opts);
1216
1217         if (!data)
1218                 goto out;
1219
1220         BUG_ON(sb->s_type->fs_flags & FS_BINARY_MOUNTDATA);
1221
1222         rc = selinux_parse_opts_str(options, &opts);
1223         if (rc)
1224                 goto out_err;
1225
1226 out:
1227         rc = selinux_set_mnt_opts(sb, &opts, 0, NULL);
1228
1229 out_err:
1230         security_free_mnt_opts(&opts);
1231         return rc;
1232 }
1233
1234 static void selinux_write_opts(struct seq_file *m,
1235                                struct security_mnt_opts *opts)
1236 {
1237         int i;
1238         char *prefix;
1239
1240         for (i = 0; i < opts->num_mnt_opts; i++) {
1241                 char *has_comma;
1242
1243                 if (opts->mnt_opts[i])
1244                         has_comma = strchr(opts->mnt_opts[i], ',');
1245                 else
1246                         has_comma = NULL;
1247
1248                 switch (opts->mnt_opts_flags[i]) {
1249                 case CONTEXT_MNT:
1250                         prefix = CONTEXT_STR;
1251                         break;
1252                 case FSCONTEXT_MNT:
1253                         prefix = FSCONTEXT_STR;
1254                         break;
1255                 case ROOTCONTEXT_MNT:
1256                         prefix = ROOTCONTEXT_STR;
1257                         break;
1258                 case DEFCONTEXT_MNT:
1259                         prefix = DEFCONTEXT_STR;
1260                         break;
1261                 case SBLABEL_MNT:
1262                         seq_putc(m, ',');
1263                         seq_puts(m, LABELSUPP_STR);
1264                         continue;
1265                 default:
1266                         BUG();
1267                         return;
1268                 };
1269                 /* we need a comma before each option */
1270                 seq_putc(m, ',');
1271                 seq_puts(m, prefix);
1272                 if (has_comma)
1273                         seq_putc(m, '\"');
1274                 seq_escape(m, opts->mnt_opts[i], "\"\n\\");
1275                 if (has_comma)
1276                         seq_putc(m, '\"');
1277         }
1278 }
1279
1280 static int selinux_sb_show_options(struct seq_file *m, struct super_block *sb)
1281 {
1282         struct security_mnt_opts opts;
1283         int rc;
1284
1285         rc = selinux_get_mnt_opts(sb, &opts);
1286         if (rc) {
1287                 /* before policy load we may get EINVAL, don't show anything */
1288                 if (rc == -EINVAL)
1289                         rc = 0;
1290                 return rc;
1291         }
1292
1293         selinux_write_opts(m, &opts);
1294
1295         security_free_mnt_opts(&opts);
1296
1297         return rc;
1298 }
1299
1300 static inline u16 inode_mode_to_security_class(umode_t mode)
1301 {
1302         switch (mode & S_IFMT) {
1303         case S_IFSOCK:
1304                 return SECCLASS_SOCK_FILE;
1305         case S_IFLNK:
1306                 return SECCLASS_LNK_FILE;
1307         case S_IFREG:
1308                 return SECCLASS_FILE;
1309         case S_IFBLK:
1310                 return SECCLASS_BLK_FILE;
1311         case S_IFDIR:
1312                 return SECCLASS_DIR;
1313         case S_IFCHR:
1314                 return SECCLASS_CHR_FILE;
1315         case S_IFIFO:
1316                 return SECCLASS_FIFO_FILE;
1317
1318         }
1319
1320         return SECCLASS_FILE;
1321 }
1322
1323 static inline int default_protocol_stream(int protocol)
1324 {
1325         return (protocol == IPPROTO_IP || protocol == IPPROTO_TCP);
1326 }
1327
1328 static inline int default_protocol_dgram(int protocol)
1329 {
1330         return (protocol == IPPROTO_IP || protocol == IPPROTO_UDP);
1331 }
1332
1333 static inline u16 socket_type_to_security_class(int family, int type, int protocol)
1334 {
1335         int extsockclass = selinux_policycap_extsockclass();
1336
1337         switch (family) {
1338         case PF_UNIX:
1339                 switch (type) {
1340                 case SOCK_STREAM:
1341                 case SOCK_SEQPACKET:
1342                         return SECCLASS_UNIX_STREAM_SOCKET;
1343                 case SOCK_DGRAM:
1344                 case SOCK_RAW:
1345                         return SECCLASS_UNIX_DGRAM_SOCKET;
1346                 }
1347                 break;
1348         case PF_INET:
1349         case PF_INET6:
1350                 switch (type) {
1351                 case SOCK_STREAM:
1352                 case SOCK_SEQPACKET:
1353                         if (default_protocol_stream(protocol))
1354                                 return SECCLASS_TCP_SOCKET;
1355                         else if (extsockclass && protocol == IPPROTO_SCTP)
1356                                 return SECCLASS_SCTP_SOCKET;
1357                         else
1358                                 return SECCLASS_RAWIP_SOCKET;
1359                 case SOCK_DGRAM:
1360                         if (default_protocol_dgram(protocol))
1361                                 return SECCLASS_UDP_SOCKET;
1362                         else if (extsockclass && (protocol == IPPROTO_ICMP ||
1363                                                   protocol == IPPROTO_ICMPV6))
1364                                 return SECCLASS_ICMP_SOCKET;
1365                         else
1366                                 return SECCLASS_RAWIP_SOCKET;
1367                 case SOCK_DCCP:
1368                         return SECCLASS_DCCP_SOCKET;
1369                 default:
1370                         return SECCLASS_RAWIP_SOCKET;
1371                 }
1372                 break;
1373         case PF_NETLINK:
1374                 switch (protocol) {
1375                 case NETLINK_ROUTE:
1376                         return SECCLASS_NETLINK_ROUTE_SOCKET;
1377                 case NETLINK_SOCK_DIAG:
1378                         return SECCLASS_NETLINK_TCPDIAG_SOCKET;
1379                 case NETLINK_NFLOG:
1380                         return SECCLASS_NETLINK_NFLOG_SOCKET;
1381                 case NETLINK_XFRM:
1382                         return SECCLASS_NETLINK_XFRM_SOCKET;
1383                 case NETLINK_SELINUX:
1384                         return SECCLASS_NETLINK_SELINUX_SOCKET;
1385                 case NETLINK_ISCSI:
1386                         return SECCLASS_NETLINK_ISCSI_SOCKET;
1387                 case NETLINK_AUDIT:
1388                         return SECCLASS_NETLINK_AUDIT_SOCKET;
1389                 case NETLINK_FIB_LOOKUP:
1390                         return SECCLASS_NETLINK_FIB_LOOKUP_SOCKET;
1391                 case NETLINK_CONNECTOR:
1392                         return SECCLASS_NETLINK_CONNECTOR_SOCKET;
1393                 case NETLINK_NETFILTER:
1394                         return SECCLASS_NETLINK_NETFILTER_SOCKET;
1395                 case NETLINK_DNRTMSG:
1396                         return SECCLASS_NETLINK_DNRT_SOCKET;
1397                 case NETLINK_KOBJECT_UEVENT:
1398                         return SECCLASS_NETLINK_KOBJECT_UEVENT_SOCKET;
1399                 case NETLINK_GENERIC:
1400                         return SECCLASS_NETLINK_GENERIC_SOCKET;
1401                 case NETLINK_SCSITRANSPORT:
1402                         return SECCLASS_NETLINK_SCSITRANSPORT_SOCKET;
1403                 case NETLINK_RDMA:
1404                         return SECCLASS_NETLINK_RDMA_SOCKET;
1405                 case NETLINK_CRYPTO:
1406                         return SECCLASS_NETLINK_CRYPTO_SOCKET;
1407                 default:
1408                         return SECCLASS_NETLINK_SOCKET;
1409                 }
1410         case PF_PACKET:
1411                 return SECCLASS_PACKET_SOCKET;
1412         case PF_KEY:
1413                 return SECCLASS_KEY_SOCKET;
1414         case PF_APPLETALK:
1415                 return SECCLASS_APPLETALK_SOCKET;
1416         }
1417
1418         if (extsockclass) {
1419                 switch (family) {
1420                 case PF_AX25:
1421                         return SECCLASS_AX25_SOCKET;
1422                 case PF_IPX:
1423                         return SECCLASS_IPX_SOCKET;
1424                 case PF_NETROM:
1425                         return SECCLASS_NETROM_SOCKET;
1426                 case PF_ATMPVC:
1427                         return SECCLASS_ATMPVC_SOCKET;
1428                 case PF_X25:
1429                         return SECCLASS_X25_SOCKET;
1430                 case PF_ROSE:
1431                         return SECCLASS_ROSE_SOCKET;
1432                 case PF_DECnet:
1433                         return SECCLASS_DECNET_SOCKET;
1434                 case PF_ATMSVC:
1435                         return SECCLASS_ATMSVC_SOCKET;
1436                 case PF_RDS:
1437                         return SECCLASS_RDS_SOCKET;
1438                 case PF_IRDA:
1439                         return SECCLASS_IRDA_SOCKET;
1440                 case PF_PPPOX:
1441                         return SECCLASS_PPPOX_SOCKET;
1442                 case PF_LLC:
1443                         return SECCLASS_LLC_SOCKET;
1444                 case PF_CAN:
1445                         return SECCLASS_CAN_SOCKET;
1446                 case PF_TIPC:
1447                         return SECCLASS_TIPC_SOCKET;
1448                 case PF_BLUETOOTH:
1449                         return SECCLASS_BLUETOOTH_SOCKET;
1450                 case PF_IUCV:
1451                         return SECCLASS_IUCV_SOCKET;
1452                 case PF_RXRPC:
1453                         return SECCLASS_RXRPC_SOCKET;
1454                 case PF_ISDN:
1455                         return SECCLASS_ISDN_SOCKET;
1456                 case PF_PHONET:
1457                         return SECCLASS_PHONET_SOCKET;
1458                 case PF_IEEE802154:
1459                         return SECCLASS_IEEE802154_SOCKET;
1460                 case PF_CAIF:
1461                         return SECCLASS_CAIF_SOCKET;
1462                 case PF_ALG:
1463                         return SECCLASS_ALG_SOCKET;
1464                 case PF_NFC:
1465                         return SECCLASS_NFC_SOCKET;
1466                 case PF_VSOCK:
1467                         return SECCLASS_VSOCK_SOCKET;
1468                 case PF_KCM:
1469                         return SECCLASS_KCM_SOCKET;
1470                 case PF_QIPCRTR:
1471                         return SECCLASS_QIPCRTR_SOCKET;
1472                 case PF_SMC:
1473                         return SECCLASS_SMC_SOCKET;
1474 #if PF_MAX > 44
1475 #error New address family defined, please update this function.
1476 #endif
1477                 }
1478         }
1479
1480         return SECCLASS_SOCKET;
1481 }
1482
1483 static int selinux_genfs_get_sid(struct dentry *dentry,
1484                                  u16 tclass,
1485                                  u16 flags,
1486                                  u32 *sid)
1487 {
1488         int rc;
1489         struct super_block *sb = dentry->d_sb;
1490         char *buffer, *path;
1491
1492         buffer = (char *)__get_free_page(GFP_KERNEL);
1493         if (!buffer)
1494                 return -ENOMEM;
1495
1496         path = dentry_path_raw(dentry, buffer, PAGE_SIZE);
1497         if (IS_ERR(path))
1498                 rc = PTR_ERR(path);
1499         else {
1500                 if (flags & SE_SBPROC) {
1501                         /* each process gets a /proc/PID/ entry. Strip off the
1502                          * PID part to get a valid selinux labeling.
1503                          * e.g. /proc/1/net/rpc/nfs -> /net/rpc/nfs */
1504                         while (path[1] >= '0' && path[1] <= '9') {
1505                                 path[1] = '/';
1506                                 path++;
1507                         }
1508                 }
1509                 rc = security_genfs_sid(&selinux_state, sb->s_type->name,
1510                                         path, tclass, sid);
1511         }
1512         free_page((unsigned long)buffer);
1513         return rc;
1514 }
1515
1516 /* The inode's security attributes must be initialized before first use. */
1517 static int inode_doinit_with_dentry(struct inode *inode, struct dentry *opt_dentry)
1518 {
1519         struct superblock_security_struct *sbsec = NULL;
1520         struct inode_security_struct *isec = inode->i_security;
1521         u32 task_sid, sid = 0;
1522         u16 sclass;
1523         struct dentry *dentry;
1524 #define INITCONTEXTLEN 255
1525         char *context = NULL;
1526         unsigned len = 0;
1527         int rc = 0;
1528
1529         if (isec->initialized == LABEL_INITIALIZED)
1530                 return 0;
1531
1532         spin_lock(&isec->lock);
1533         if (isec->initialized == LABEL_INITIALIZED)
1534                 goto out_unlock;
1535
1536         if (isec->sclass == SECCLASS_FILE)
1537                 isec->sclass = inode_mode_to_security_class(inode->i_mode);
1538
1539         sbsec = inode->i_sb->s_security;
1540         if (!(sbsec->flags & SE_SBINITIALIZED)) {
1541                 /* Defer initialization until selinux_complete_init,
1542                    after the initial policy is loaded and the security
1543                    server is ready to handle calls. */
1544                 spin_lock(&sbsec->isec_lock);
1545                 if (list_empty(&isec->list))
1546                         list_add(&isec->list, &sbsec->isec_head);
1547                 spin_unlock(&sbsec->isec_lock);
1548                 goto out_unlock;
1549         }
1550
1551         sclass = isec->sclass;
1552         task_sid = isec->task_sid;
1553         sid = isec->sid;
1554         isec->initialized = LABEL_PENDING;
1555         spin_unlock(&isec->lock);
1556
1557         switch (sbsec->behavior) {
1558         case SECURITY_FS_USE_NATIVE:
1559                 break;
1560         case SECURITY_FS_USE_XATTR:
1561                 if (!(inode->i_opflags & IOP_XATTR)) {
1562                         sid = sbsec->def_sid;
1563                         break;
1564                 }
1565                 /* Need a dentry, since the xattr API requires one.
1566                    Life would be simpler if we could just pass the inode. */
1567                 if (opt_dentry) {
1568                         /* Called from d_instantiate or d_splice_alias. */
1569                         dentry = dget(opt_dentry);
1570                 } else {
1571                         /*
1572                          * Called from selinux_complete_init, try to find a dentry.
1573                          * Some filesystems really want a connected one, so try
1574                          * that first.  We could split SECURITY_FS_USE_XATTR in
1575                          * two, depending upon that...
1576                          */
1577                         dentry = d_find_alias(inode);
1578                         if (!dentry)
1579                                 dentry = d_find_any_alias(inode);
1580                 }
1581                 if (!dentry) {
1582                         /*
1583                          * this is can be hit on boot when a file is accessed
1584                          * before the policy is loaded.  When we load policy we
1585                          * may find inodes that have no dentry on the
1586                          * sbsec->isec_head list.  No reason to complain as these
1587                          * will get fixed up the next time we go through
1588                          * inode_doinit with a dentry, before these inodes could
1589                          * be used again by userspace.
1590                          */
1591                         goto out;
1592                 }
1593
1594                 len = INITCONTEXTLEN;
1595                 context = kmalloc(len+1, GFP_NOFS);
1596                 if (!context) {
1597                         rc = -ENOMEM;
1598                         dput(dentry);
1599                         goto out;
1600                 }
1601                 context[len] = '\0';
1602                 rc = __vfs_getxattr(dentry, inode, XATTR_NAME_SELINUX, context, len);
1603                 if (rc == -ERANGE) {
1604                         kfree(context);
1605
1606                         /* Need a larger buffer.  Query for the right size. */
1607                         rc = __vfs_getxattr(dentry, inode, XATTR_NAME_SELINUX, NULL, 0);
1608                         if (rc < 0) {
1609                                 dput(dentry);
1610                                 goto out;
1611                         }
1612                         len = rc;
1613                         context = kmalloc(len+1, GFP_NOFS);
1614                         if (!context) {
1615                                 rc = -ENOMEM;
1616                                 dput(dentry);
1617                                 goto out;
1618                         }
1619                         context[len] = '\0';
1620                         rc = __vfs_getxattr(dentry, inode, XATTR_NAME_SELINUX, context, len);
1621                 }
1622                 dput(dentry);
1623                 if (rc < 0) {
1624                         if (rc != -ENODATA) {
1625                                 printk(KERN_WARNING "SELinux: %s:  getxattr returned "
1626                                        "%d for dev=%s ino=%ld\n", __func__,
1627                                        -rc, inode->i_sb->s_id, inode->i_ino);
1628                                 kfree(context);
1629                                 goto out;
1630                         }
1631                         /* Map ENODATA to the default file SID */
1632                         sid = sbsec->def_sid;
1633                         rc = 0;
1634                 } else {
1635                         rc = security_context_to_sid_default(&selinux_state,
1636                                                              context, rc, &sid,
1637                                                              sbsec->def_sid,
1638                                                              GFP_NOFS);
1639                         if (rc) {
1640                                 char *dev = inode->i_sb->s_id;
1641                                 unsigned long ino = inode->i_ino;
1642
1643                                 if (rc == -EINVAL) {
1644                                         if (printk_ratelimit())
1645                                                 printk(KERN_NOTICE "SELinux: inode=%lu on dev=%s was found to have an invalid "
1646                                                         "context=%s.  This indicates you may need to relabel the inode or the "
1647                                                         "filesystem in question.\n", ino, dev, context);
1648                                 } else {
1649                                         printk(KERN_WARNING "SELinux: %s:  context_to_sid(%s) "
1650                                                "returned %d for dev=%s ino=%ld\n",
1651                                                __func__, context, -rc, dev, ino);
1652                                 }
1653                                 kfree(context);
1654                                 /* Leave with the unlabeled SID */
1655                                 rc = 0;
1656                                 break;
1657                         }
1658                 }
1659                 kfree(context);
1660                 break;
1661         case SECURITY_FS_USE_TASK:
1662                 sid = task_sid;
1663                 break;
1664         case SECURITY_FS_USE_TRANS:
1665                 /* Default to the fs SID. */
1666                 sid = sbsec->sid;
1667
1668                 /* Try to obtain a transition SID. */
1669                 rc = security_transition_sid(&selinux_state, task_sid, sid,
1670                                              sclass, NULL, &sid);
1671                 if (rc)
1672                         goto out;
1673                 break;
1674         case SECURITY_FS_USE_MNTPOINT:
1675                 sid = sbsec->mntpoint_sid;
1676                 break;
1677         default:
1678                 /* Default to the fs superblock SID. */
1679                 sid = sbsec->sid;
1680
1681                 if ((sbsec->flags & SE_SBGENFS) && !S_ISLNK(inode->i_mode)) {
1682                         /* We must have a dentry to determine the label on
1683                          * procfs inodes */
1684                         if (opt_dentry) {
1685                                 /* Called from d_instantiate or
1686                                  * d_splice_alias. */
1687                                 dentry = dget(opt_dentry);
1688                         } else {
1689                                 /* Called from selinux_complete_init, try to
1690                                  * find a dentry.  Some filesystems really want
1691                                  * a connected one, so try that first.
1692                                  */
1693                                 dentry = d_find_alias(inode);
1694                                 if (!dentry)
1695                                         dentry = d_find_any_alias(inode);
1696                         }
1697                         /*
1698                          * This can be hit on boot when a file is accessed
1699                          * before the policy is loaded.  When we load policy we
1700                          * may find inodes that have no dentry on the
1701                          * sbsec->isec_head list.  No reason to complain as
1702                          * these will get fixed up the next time we go through
1703                          * inode_doinit() with a dentry, before these inodes
1704                          * could be used again by userspace.
1705                          */
1706                         if (!dentry)
1707                                 goto out;
1708                         rc = selinux_genfs_get_sid(dentry, sclass,
1709                                                    sbsec->flags, &sid);
1710                         dput(dentry);
1711                         if (rc)
1712                                 goto out;
1713                 }
1714                 break;
1715         }
1716
1717 out:
1718         spin_lock(&isec->lock);
1719         if (isec->initialized == LABEL_PENDING) {
1720                 if (!sid || rc) {
1721                         isec->initialized = LABEL_INVALID;
1722                         goto out_unlock;
1723                 }
1724
1725                 isec->initialized = LABEL_INITIALIZED;
1726                 isec->sid = sid;
1727         }
1728
1729 out_unlock:
1730         spin_unlock(&isec->lock);
1731         return rc;
1732 }
1733
1734 /* Convert a Linux signal to an access vector. */
1735 static inline u32 signal_to_av(int sig)
1736 {
1737         u32 perm = 0;
1738
1739         switch (sig) {
1740         case SIGCHLD:
1741                 /* Commonly granted from child to parent. */
1742                 perm = PROCESS__SIGCHLD;
1743                 break;
1744         case SIGKILL:
1745                 /* Cannot be caught or ignored */
1746                 perm = PROCESS__SIGKILL;
1747                 break;
1748         case SIGSTOP:
1749                 /* Cannot be caught or ignored */
1750                 perm = PROCESS__SIGSTOP;
1751                 break;
1752         default:
1753                 /* All other signals. */
1754                 perm = PROCESS__SIGNAL;
1755                 break;
1756         }
1757
1758         return perm;
1759 }
1760
1761 #if CAP_LAST_CAP > 63
1762 #error Fix SELinux to handle capabilities > 63.
1763 #endif
1764
1765 /* Check whether a task is allowed to use a capability. */
1766 static int cred_has_capability(const struct cred *cred,
1767                                int cap, int audit, bool initns)
1768 {
1769         struct common_audit_data ad;
1770         struct av_decision avd;
1771         u16 sclass;
1772         u32 sid = cred_sid(cred);
1773         u32 av = CAP_TO_MASK(cap);
1774         int rc;
1775
1776         ad.type = LSM_AUDIT_DATA_CAP;
1777         ad.u.cap = cap;
1778
1779         switch (CAP_TO_INDEX(cap)) {
1780         case 0:
1781                 sclass = initns ? SECCLASS_CAPABILITY : SECCLASS_CAP_USERNS;
1782                 break;
1783         case 1:
1784                 sclass = initns ? SECCLASS_CAPABILITY2 : SECCLASS_CAP2_USERNS;
1785                 break;
1786         default:
1787                 printk(KERN_ERR
1788                        "SELinux:  out of range capability %d\n", cap);
1789                 BUG();
1790                 return -EINVAL;
1791         }
1792
1793         rc = avc_has_perm_noaudit(&selinux_state,
1794                                   sid, sid, sclass, av, 0, &avd);
1795         if (audit == SECURITY_CAP_AUDIT) {
1796                 int rc2 = avc_audit(&selinux_state,
1797                                     sid, sid, sclass, av, &avd, rc, &ad, 0);
1798                 if (rc2)
1799                         return rc2;
1800         }
1801         return rc;
1802 }
1803
1804 /* Check whether a task has a particular permission to an inode.
1805    The 'adp' parameter is optional and allows other audit
1806    data to be passed (e.g. the dentry). */
1807 static int inode_has_perm(const struct cred *cred,
1808                           struct inode *inode,
1809                           u32 perms,
1810                           struct common_audit_data *adp)
1811 {
1812         struct inode_security_struct *isec;
1813         u32 sid;
1814
1815         validate_creds(cred);
1816
1817         if (unlikely(IS_PRIVATE(inode)))
1818                 return 0;
1819
1820         sid = cred_sid(cred);
1821         isec = inode->i_security;
1822
1823         return avc_has_perm(&selinux_state,
1824                             sid, isec->sid, isec->sclass, perms, adp);
1825 }
1826
1827 /* Same as inode_has_perm, but pass explicit audit data containing
1828    the dentry to help the auditing code to more easily generate the
1829    pathname if needed. */
1830 static inline int dentry_has_perm(const struct cred *cred,
1831                                   struct dentry *dentry,
1832                                   u32 av)
1833 {
1834         struct inode *inode = d_backing_inode(dentry);
1835         struct common_audit_data ad;
1836
1837         ad.type = LSM_AUDIT_DATA_DENTRY;
1838         ad.u.dentry = dentry;
1839         __inode_security_revalidate(inode, dentry, true);
1840         return inode_has_perm(cred, inode, av, &ad);
1841 }
1842
1843 /* Same as inode_has_perm, but pass explicit audit data containing
1844    the path to help the auditing code to more easily generate the
1845    pathname if needed. */
1846 static inline int path_has_perm(const struct cred *cred,
1847                                 const struct path *path,
1848                                 u32 av)
1849 {
1850         struct inode *inode = d_backing_inode(path->dentry);
1851         struct common_audit_data ad;
1852
1853         ad.type = LSM_AUDIT_DATA_PATH;
1854         ad.u.path = *path;
1855         __inode_security_revalidate(inode, path->dentry, true);
1856         return inode_has_perm(cred, inode, av, &ad);
1857 }
1858
1859 /* Same as path_has_perm, but uses the inode from the file struct. */
1860 static inline int file_path_has_perm(const struct cred *cred,
1861                                      struct file *file,
1862                                      u32 av)
1863 {
1864         struct common_audit_data ad;
1865
1866         ad.type = LSM_AUDIT_DATA_FILE;
1867         ad.u.file = file;
1868         return inode_has_perm(cred, file_inode(file), av, &ad);
1869 }
1870
1871 #ifdef CONFIG_BPF_SYSCALL
1872 static int bpf_fd_pass(struct file *file, u32 sid);
1873 #endif
1874
1875 /* Check whether a task can use an open file descriptor to
1876    access an inode in a given way.  Check access to the
1877    descriptor itself, and then use dentry_has_perm to
1878    check a particular permission to the file.
1879    Access to the descriptor is implicitly granted if it
1880    has the same SID as the process.  If av is zero, then
1881    access to the file is not checked, e.g. for cases
1882    where only the descriptor is affected like seek. */
1883 static int file_has_perm(const struct cred *cred,
1884                          struct file *file,
1885                          u32 av)
1886 {
1887         struct file_security_struct *fsec = file->f_security;
1888         struct inode *inode = file_inode(file);
1889         struct common_audit_data ad;
1890         u32 sid = cred_sid(cred);
1891         int rc;
1892
1893         ad.type = LSM_AUDIT_DATA_FILE;
1894         ad.u.file = file;
1895
1896         if (sid != fsec->sid) {
1897                 rc = avc_has_perm(&selinux_state,
1898                                   sid, fsec->sid,
1899                                   SECCLASS_FD,
1900                                   FD__USE,
1901                                   &ad);
1902                 if (rc)
1903                         goto out;
1904         }
1905
1906 #ifdef CONFIG_BPF_SYSCALL
1907         rc = bpf_fd_pass(file, cred_sid(cred));
1908         if (rc)
1909                 return rc;
1910 #endif
1911
1912         /* av is zero if only checking access to the descriptor. */
1913         rc = 0;
1914         if (av)
1915                 rc = inode_has_perm(cred, inode, av, &ad);
1916
1917 out:
1918         return rc;
1919 }
1920
1921 /*
1922  * Determine the label for an inode that might be unioned.
1923  */
1924 static int
1925 selinux_determine_inode_label(const struct task_security_struct *tsec,
1926                                  struct inode *dir,
1927                                  const struct qstr *name, u16 tclass,
1928                                  u32 *_new_isid)
1929 {
1930         const struct superblock_security_struct *sbsec = dir->i_sb->s_security;
1931
1932         if ((sbsec->flags & SE_SBINITIALIZED) &&
1933             (sbsec->behavior == SECURITY_FS_USE_MNTPOINT)) {
1934                 *_new_isid = sbsec->mntpoint_sid;
1935         } else if ((sbsec->flags & SBLABEL_MNT) &&
1936                    tsec->create_sid) {
1937                 *_new_isid = tsec->create_sid;
1938         } else {
1939                 const struct inode_security_struct *dsec = inode_security(dir);
1940                 return security_transition_sid(&selinux_state, tsec->sid,
1941                                                dsec->sid, tclass,
1942                                                name, _new_isid);
1943         }
1944
1945         return 0;
1946 }
1947
1948 /* Check whether a task can create a file. */
1949 static int may_create(struct inode *dir,
1950                       struct dentry *dentry,
1951                       u16 tclass)
1952 {
1953         const struct task_security_struct *tsec = current_security();
1954         struct inode_security_struct *dsec;
1955         struct superblock_security_struct *sbsec;
1956         u32 sid, newsid;
1957         struct common_audit_data ad;
1958         int rc;
1959
1960         dsec = inode_security(dir);
1961         sbsec = dir->i_sb->s_security;
1962
1963         sid = tsec->sid;
1964
1965         ad.type = LSM_AUDIT_DATA_DENTRY;
1966         ad.u.dentry = dentry;
1967
1968         rc = avc_has_perm(&selinux_state,
1969                           sid, dsec->sid, SECCLASS_DIR,
1970                           DIR__ADD_NAME | DIR__SEARCH,
1971                           &ad);
1972         if (rc)
1973                 return rc;
1974
1975         rc = selinux_determine_inode_label(current_security(), dir,
1976                                            &dentry->d_name, tclass, &newsid);
1977         if (rc)
1978                 return rc;
1979
1980         rc = avc_has_perm(&selinux_state,
1981                           sid, newsid, tclass, FILE__CREATE, &ad);
1982         if (rc)
1983                 return rc;
1984
1985         return avc_has_perm(&selinux_state,
1986                             newsid, sbsec->sid,
1987                             SECCLASS_FILESYSTEM,
1988                             FILESYSTEM__ASSOCIATE, &ad);
1989 }
1990
1991 #define MAY_LINK        0
1992 #define MAY_UNLINK      1
1993 #define MAY_RMDIR       2
1994
1995 /* Check whether a task can link, unlink, or rmdir a file/directory. */
1996 static int may_link(struct inode *dir,
1997                     struct dentry *dentry,
1998                     int kind)
1999
2000 {
2001         struct inode_security_struct *dsec, *isec;
2002         struct common_audit_data ad;
2003         u32 sid = current_sid();
2004         u32 av;
2005         int rc;
2006
2007         dsec = inode_security(dir);
2008         isec = backing_inode_security(dentry);
2009
2010         ad.type = LSM_AUDIT_DATA_DENTRY;
2011         ad.u.dentry = dentry;
2012
2013         av = DIR__SEARCH;
2014         av |= (kind ? DIR__REMOVE_NAME : DIR__ADD_NAME);
2015         rc = avc_has_perm(&selinux_state,
2016                           sid, dsec->sid, SECCLASS_DIR, av, &ad);
2017         if (rc)
2018                 return rc;
2019
2020         switch (kind) {
2021         case MAY_LINK:
2022                 av = FILE__LINK;
2023                 break;
2024         case MAY_UNLINK:
2025                 av = FILE__UNLINK;
2026                 break;
2027         case MAY_RMDIR:
2028                 av = DIR__RMDIR;
2029                 break;
2030         default:
2031                 printk(KERN_WARNING "SELinux: %s:  unrecognized kind %d\n",
2032                         __func__, kind);
2033                 return 0;
2034         }
2035
2036         rc = avc_has_perm(&selinux_state,
2037                           sid, isec->sid, isec->sclass, av, &ad);
2038         return rc;
2039 }
2040
2041 static inline int may_rename(struct inode *old_dir,
2042                              struct dentry *old_dentry,
2043                              struct inode *new_dir,
2044                              struct dentry *new_dentry)
2045 {
2046         struct inode_security_struct *old_dsec, *new_dsec, *old_isec, *new_isec;
2047         struct common_audit_data ad;
2048         u32 sid = current_sid();
2049         u32 av;
2050         int old_is_dir, new_is_dir;
2051         int rc;
2052
2053         old_dsec = inode_security(old_dir);
2054         old_isec = backing_inode_security(old_dentry);
2055         old_is_dir = d_is_dir(old_dentry);
2056         new_dsec = inode_security(new_dir);
2057
2058         ad.type = LSM_AUDIT_DATA_DENTRY;
2059
2060         ad.u.dentry = old_dentry;
2061         rc = avc_has_perm(&selinux_state,
2062                           sid, old_dsec->sid, SECCLASS_DIR,
2063                           DIR__REMOVE_NAME | DIR__SEARCH, &ad);
2064         if (rc)
2065                 return rc;
2066         rc = avc_has_perm(&selinux_state,
2067                           sid, old_isec->sid,
2068                           old_isec->sclass, FILE__RENAME, &ad);
2069         if (rc)
2070                 return rc;
2071         if (old_is_dir && new_dir != old_dir) {
2072                 rc = avc_has_perm(&selinux_state,
2073                                   sid, old_isec->sid,
2074                                   old_isec->sclass, DIR__REPARENT, &ad);
2075                 if (rc)
2076                         return rc;
2077         }
2078
2079         ad.u.dentry = new_dentry;
2080         av = DIR__ADD_NAME | DIR__SEARCH;
2081         if (d_is_positive(new_dentry))
2082                 av |= DIR__REMOVE_NAME;
2083         rc = avc_has_perm(&selinux_state,
2084                           sid, new_dsec->sid, SECCLASS_DIR, av, &ad);
2085         if (rc)
2086                 return rc;
2087         if (d_is_positive(new_dentry)) {
2088                 new_isec = backing_inode_security(new_dentry);
2089                 new_is_dir = d_is_dir(new_dentry);
2090                 rc = avc_has_perm(&selinux_state,
2091                                   sid, new_isec->sid,
2092                                   new_isec->sclass,
2093                                   (new_is_dir ? DIR__RMDIR : FILE__UNLINK), &ad);
2094                 if (rc)
2095                         return rc;
2096         }
2097
2098         return 0;
2099 }
2100
2101 /* Check whether a task can perform a filesystem operation. */
2102 static int superblock_has_perm(const struct cred *cred,
2103                                struct super_block *sb,
2104                                u32 perms,
2105                                struct common_audit_data *ad)
2106 {
2107         struct superblock_security_struct *sbsec;
2108         u32 sid = cred_sid(cred);
2109
2110         sbsec = sb->s_security;
2111         return avc_has_perm(&selinux_state,
2112                             sid, sbsec->sid, SECCLASS_FILESYSTEM, perms, ad);
2113 }
2114
2115 /* Convert a Linux mode and permission mask to an access vector. */
2116 static inline u32 file_mask_to_av(int mode, int mask)
2117 {
2118         u32 av = 0;
2119
2120         if (!S_ISDIR(mode)) {
2121                 if (mask & MAY_EXEC)
2122                         av |= FILE__EXECUTE;
2123                 if (mask & MAY_READ)
2124                         av |= FILE__READ;
2125
2126                 if (mask & MAY_APPEND)
2127                         av |= FILE__APPEND;
2128                 else if (mask & MAY_WRITE)
2129                         av |= FILE__WRITE;
2130
2131         } else {
2132                 if (mask & MAY_EXEC)
2133                         av |= DIR__SEARCH;
2134                 if (mask & MAY_WRITE)
2135                         av |= DIR__WRITE;
2136                 if (mask & MAY_READ)
2137                         av |= DIR__READ;
2138         }
2139
2140         return av;
2141 }
2142
2143 /* Convert a Linux file to an access vector. */
2144 static inline u32 file_to_av(struct file *file)
2145 {
2146         u32 av = 0;
2147
2148         if (file->f_mode & FMODE_READ)
2149                 av |= FILE__READ;
2150         if (file->f_mode & FMODE_WRITE) {
2151                 if (file->f_flags & O_APPEND)
2152                         av |= FILE__APPEND;
2153                 else
2154                         av |= FILE__WRITE;
2155         }
2156         if (!av) {
2157                 /*
2158                  * Special file opened with flags 3 for ioctl-only use.
2159                  */
2160                 av = FILE__IOCTL;
2161         }
2162
2163         return av;
2164 }
2165
2166 /*
2167  * Convert a file to an access vector and include the correct open
2168  * open permission.
2169  */
2170 static inline u32 open_file_to_av(struct file *file)
2171 {
2172         u32 av = file_to_av(file);
2173         struct inode *inode = file_inode(file);
2174
2175         if (selinux_policycap_openperm() &&
2176             inode->i_sb->s_magic != SOCKFS_MAGIC)
2177                 av |= FILE__OPEN;
2178
2179         return av;
2180 }
2181
2182 /* Hook functions begin here. */
2183
2184 static int selinux_binder_set_context_mgr(struct task_struct *mgr)
2185 {
2186         u32 mysid = current_sid();
2187         u32 mgrsid = task_sid(mgr);
2188
2189         return avc_has_perm(&selinux_state,
2190                             mysid, mgrsid, SECCLASS_BINDER,
2191                             BINDER__SET_CONTEXT_MGR, NULL);
2192 }
2193
2194 static int selinux_binder_transaction(struct task_struct *from,
2195                                       struct task_struct *to)
2196 {
2197         u32 mysid = current_sid();
2198         u32 fromsid = task_sid(from);
2199         u32 tosid = task_sid(to);
2200         int rc;
2201
2202         if (mysid != fromsid) {
2203                 rc = avc_has_perm(&selinux_state,
2204                                   mysid, fromsid, SECCLASS_BINDER,
2205                                   BINDER__IMPERSONATE, NULL);
2206                 if (rc)
2207                         return rc;
2208         }
2209
2210         return avc_has_perm(&selinux_state,
2211                             fromsid, tosid, SECCLASS_BINDER, BINDER__CALL,
2212                             NULL);
2213 }
2214
2215 static int selinux_binder_transfer_binder(struct task_struct *from,
2216                                           struct task_struct *to)
2217 {
2218         u32 fromsid = task_sid(from);
2219         u32 tosid = task_sid(to);
2220
2221         return avc_has_perm(&selinux_state,
2222                             fromsid, tosid, SECCLASS_BINDER, BINDER__TRANSFER,
2223                             NULL);
2224 }
2225
2226 static int selinux_binder_transfer_file(struct task_struct *from,
2227                                         struct task_struct *to,
2228                                         struct file *file)
2229 {
2230         u32 sid = task_sid(to);
2231         struct file_security_struct *fsec = file->f_security;
2232         struct dentry *dentry = file->f_path.dentry;
2233         struct inode_security_struct *isec;
2234         struct common_audit_data ad;
2235         int rc;
2236
2237         ad.type = LSM_AUDIT_DATA_PATH;
2238         ad.u.path = file->f_path;
2239
2240         if (sid != fsec->sid) {
2241                 rc = avc_has_perm(&selinux_state,
2242                                   sid, fsec->sid,
2243                                   SECCLASS_FD,
2244                                   FD__USE,
2245                                   &ad);
2246                 if (rc)
2247                         return rc;
2248         }
2249
2250 #ifdef CONFIG_BPF_SYSCALL
2251         rc = bpf_fd_pass(file, sid);
2252         if (rc)
2253                 return rc;
2254 #endif
2255
2256         if (unlikely(IS_PRIVATE(d_backing_inode(dentry))))
2257                 return 0;
2258
2259         isec = backing_inode_security(dentry);
2260         return avc_has_perm(&selinux_state,
2261                             sid, isec->sid, isec->sclass, file_to_av(file),
2262                             &ad);
2263 }
2264
2265 static int selinux_ptrace_access_check(struct task_struct *child,
2266                                      unsigned int mode)
2267 {
2268         u32 sid = current_sid();
2269         u32 csid = task_sid(child);
2270
2271         if (mode & PTRACE_MODE_READ)
2272                 return avc_has_perm(&selinux_state,
2273                                     sid, csid, SECCLASS_FILE, FILE__READ, NULL);
2274
2275         return avc_has_perm(&selinux_state,
2276                             sid, csid, SECCLASS_PROCESS, PROCESS__PTRACE, NULL);
2277 }
2278
2279 static int selinux_ptrace_traceme(struct task_struct *parent)
2280 {
2281         return avc_has_perm(&selinux_state,
2282                             task_sid(parent), current_sid(), SECCLASS_PROCESS,
2283                             PROCESS__PTRACE, NULL);
2284 }
2285
2286 static int selinux_capget(struct task_struct *target, kernel_cap_t *effective,
2287                           kernel_cap_t *inheritable, kernel_cap_t *permitted)
2288 {
2289         return avc_has_perm(&selinux_state,
2290                             current_sid(), task_sid(target), SECCLASS_PROCESS,
2291                             PROCESS__GETCAP, NULL);
2292 }
2293
2294 static int selinux_capset(struct cred *new, const struct cred *old,
2295                           const kernel_cap_t *effective,
2296                           const kernel_cap_t *inheritable,
2297                           const kernel_cap_t *permitted)
2298 {
2299         return avc_has_perm(&selinux_state,
2300                             cred_sid(old), cred_sid(new), SECCLASS_PROCESS,
2301                             PROCESS__SETCAP, NULL);
2302 }
2303
2304 /*
2305  * (This comment used to live with the selinux_task_setuid hook,
2306  * which was removed).
2307  *
2308  * Since setuid only affects the current process, and since the SELinux
2309  * controls are not based on the Linux identity attributes, SELinux does not
2310  * need to control this operation.  However, SELinux does control the use of
2311  * the CAP_SETUID and CAP_SETGID capabilities using the capable hook.
2312  */
2313
2314 static int selinux_capable(const struct cred *cred, struct user_namespace *ns,
2315                            int cap, int audit)
2316 {
2317         return cred_has_capability(cred, cap, audit, ns == &init_user_ns);
2318 }
2319
2320 static int selinux_quotactl(int cmds, int type, int id, struct super_block *sb)
2321 {
2322         const struct cred *cred = current_cred();
2323         int rc = 0;
2324
2325         if (!sb)
2326                 return 0;
2327
2328         switch (cmds) {
2329         case Q_SYNC:
2330         case Q_QUOTAON:
2331         case Q_QUOTAOFF:
2332         case Q_SETINFO:
2333         case Q_SETQUOTA:
2334                 rc = superblock_has_perm(cred, sb, FILESYSTEM__QUOTAMOD, NULL);
2335                 break;
2336         case Q_GETFMT:
2337         case Q_GETINFO:
2338         case Q_GETQUOTA:
2339                 rc = superblock_has_perm(cred, sb, FILESYSTEM__QUOTAGET, NULL);
2340                 break;
2341         default:
2342                 rc = 0;  /* let the kernel handle invalid cmds */
2343                 break;
2344         }
2345         return rc;
2346 }
2347
2348 static int selinux_quota_on(struct dentry *dentry)
2349 {
2350         const struct cred *cred = current_cred();
2351
2352         return dentry_has_perm(cred, dentry, FILE__QUOTAON);
2353 }
2354
2355 static int selinux_syslog(int type)
2356 {
2357         switch (type) {
2358         case SYSLOG_ACTION_READ_ALL:    /* Read last kernel messages */
2359         case SYSLOG_ACTION_SIZE_BUFFER: /* Return size of the log buffer */
2360                 return avc_has_perm(&selinux_state,
2361                                     current_sid(), SECINITSID_KERNEL,
2362                                     SECCLASS_SYSTEM, SYSTEM__SYSLOG_READ, NULL);
2363         case SYSLOG_ACTION_CONSOLE_OFF: /* Disable logging to console */
2364         case SYSLOG_ACTION_CONSOLE_ON:  /* Enable logging to console */
2365         /* Set level of messages printed to console */
2366         case SYSLOG_ACTION_CONSOLE_LEVEL:
2367                 return avc_has_perm(&selinux_state,
2368                                     current_sid(), SECINITSID_KERNEL,
2369                                     SECCLASS_SYSTEM, SYSTEM__SYSLOG_CONSOLE,
2370                                     NULL);
2371         }
2372         /* All other syslog types */
2373         return avc_has_perm(&selinux_state,
2374                             current_sid(), SECINITSID_KERNEL,
2375                             SECCLASS_SYSTEM, SYSTEM__SYSLOG_MOD, NULL);
2376 }
2377
2378 /*
2379  * Check that a process has enough memory to allocate a new virtual
2380  * mapping. 0 means there is enough memory for the allocation to
2381  * succeed and -ENOMEM implies there is not.
2382  *
2383  * Do not audit the selinux permission check, as this is applied to all
2384  * processes that allocate mappings.
2385  */
2386 static int selinux_vm_enough_memory(struct mm_struct *mm, long pages)
2387 {
2388         int rc, cap_sys_admin = 0;
2389
2390         rc = cred_has_capability(current_cred(), CAP_SYS_ADMIN,
2391                                  SECURITY_CAP_NOAUDIT, true);
2392         if (rc == 0)
2393                 cap_sys_admin = 1;
2394
2395         return cap_sys_admin;
2396 }
2397
2398 /* binprm security operations */
2399
2400 static u32 ptrace_parent_sid(void)
2401 {
2402         u32 sid = 0;
2403         struct task_struct *tracer;
2404
2405         rcu_read_lock();
2406         tracer = ptrace_parent(current);
2407         if (tracer)
2408                 sid = task_sid(tracer);
2409         rcu_read_unlock();
2410
2411         return sid;
2412 }
2413
2414 static int check_nnp_nosuid(const struct linux_binprm *bprm,
2415                             const struct task_security_struct *old_tsec,
2416                             const struct task_security_struct *new_tsec)
2417 {
2418         int nnp = (bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS);
2419         int nosuid = !mnt_may_suid(bprm->file->f_path.mnt);
2420         int rc;
2421         u32 av;
2422
2423         if (!nnp && !nosuid)
2424                 return 0; /* neither NNP nor nosuid */
2425
2426         if (new_tsec->sid == old_tsec->sid)
2427                 return 0; /* No change in credentials */
2428
2429         /*
2430          * If the policy enables the nnp_nosuid_transition policy capability,
2431          * then we permit transitions under NNP or nosuid if the
2432          * policy allows the corresponding permission between
2433          * the old and new contexts.
2434          */
2435         if (selinux_policycap_nnp_nosuid_transition()) {
2436                 av = 0;
2437                 if (nnp)
2438                         av |= PROCESS2__NNP_TRANSITION;
2439                 if (nosuid)
2440                         av |= PROCESS2__NOSUID_TRANSITION;
2441                 rc = avc_has_perm(&selinux_state,
2442                                   old_tsec->sid, new_tsec->sid,
2443                                   SECCLASS_PROCESS2, av, NULL);
2444                 if (!rc)
2445                         return 0;
2446         }
2447
2448         /*
2449          * We also permit NNP or nosuid transitions to bounded SIDs,
2450          * i.e. SIDs that are guaranteed to only be allowed a subset
2451          * of the permissions of the current SID.
2452          */
2453         rc = security_bounded_transition(&selinux_state, old_tsec->sid,
2454                                          new_tsec->sid);
2455         if (!rc)
2456                 return 0;
2457
2458         /*
2459          * On failure, preserve the errno values for NNP vs nosuid.
2460          * NNP:  Operation not permitted for caller.
2461          * nosuid:  Permission denied to file.
2462          */
2463         if (nnp)
2464                 return -EPERM;
2465         return -EACCES;
2466 }
2467
2468 static int selinux_bprm_set_creds(struct linux_binprm *bprm)
2469 {
2470         const struct task_security_struct *old_tsec;
2471         struct task_security_struct *new_tsec;
2472         struct inode_security_struct *isec;
2473         struct common_audit_data ad;
2474         struct inode *inode = file_inode(bprm->file);
2475         int rc;
2476
2477         /* SELinux context only depends on initial program or script and not
2478          * the script interpreter */
2479         if (bprm->called_set_creds)
2480                 return 0;
2481
2482         old_tsec = current_security();
2483         new_tsec = bprm->cred->security;
2484         isec = inode_security(inode);
2485
2486         /* Default to the current task SID. */
2487         new_tsec->sid = old_tsec->sid;
2488         new_tsec->osid = old_tsec->sid;
2489
2490         /* Reset fs, key, and sock SIDs on execve. */
2491         new_tsec->create_sid = 0;
2492         new_tsec->keycreate_sid = 0;
2493         new_tsec->sockcreate_sid = 0;
2494
2495         if (old_tsec->exec_sid) {
2496                 new_tsec->sid = old_tsec->exec_sid;
2497                 /* Reset exec SID on execve. */
2498                 new_tsec->exec_sid = 0;
2499
2500                 /* Fail on NNP or nosuid if not an allowed transition. */
2501                 rc = check_nnp_nosuid(bprm, old_tsec, new_tsec);
2502                 if (rc)
2503                         return rc;
2504         } else {
2505                 /* Check for a default transition on this program. */
2506                 rc = security_transition_sid(&selinux_state, old_tsec->sid,
2507                                              isec->sid, SECCLASS_PROCESS, NULL,
2508                                              &new_tsec->sid);
2509                 if (rc)
2510                         return rc;
2511
2512                 /*
2513                  * Fallback to old SID on NNP or nosuid if not an allowed
2514                  * transition.
2515                  */
2516                 rc = check_nnp_nosuid(bprm, old_tsec, new_tsec);
2517                 if (rc)
2518                         new_tsec->sid = old_tsec->sid;
2519         }
2520
2521         ad.type = LSM_AUDIT_DATA_FILE;
2522         ad.u.file = bprm->file;
2523
2524         if (new_tsec->sid == old_tsec->sid) {
2525                 rc = avc_has_perm(&selinux_state,
2526                                   old_tsec->sid, isec->sid,
2527                                   SECCLASS_FILE, FILE__EXECUTE_NO_TRANS, &ad);
2528                 if (rc)
2529                         return rc;
2530         } else {
2531                 /* Check permissions for the transition. */
2532                 rc = avc_has_perm(&selinux_state,
2533                                   old_tsec->sid, new_tsec->sid,
2534                                   SECCLASS_PROCESS, PROCESS__TRANSITION, &ad);
2535                 if (rc)
2536                         return rc;
2537
2538                 rc = avc_has_perm(&selinux_state,
2539                                   new_tsec->sid, isec->sid,
2540                                   SECCLASS_FILE, FILE__ENTRYPOINT, &ad);
2541                 if (rc)
2542                         return rc;
2543
2544                 /* Check for shared state */
2545                 if (bprm->unsafe & LSM_UNSAFE_SHARE) {
2546                         rc = avc_has_perm(&selinux_state,
2547                                           old_tsec->sid, new_tsec->sid,
2548                                           SECCLASS_PROCESS, PROCESS__SHARE,
2549                                           NULL);
2550                         if (rc)
2551                                 return -EPERM;
2552                 }
2553
2554                 /* Make sure that anyone attempting to ptrace over a task that
2555                  * changes its SID has the appropriate permit */
2556                 if (bprm->unsafe & LSM_UNSAFE_PTRACE) {
2557                         u32 ptsid = ptrace_parent_sid();
2558                         if (ptsid != 0) {
2559                                 rc = avc_has_perm(&selinux_state,
2560                                                   ptsid, new_tsec->sid,
2561                                                   SECCLASS_PROCESS,
2562                                                   PROCESS__PTRACE, NULL);
2563                                 if (rc)
2564                                         return -EPERM;
2565                         }
2566                 }
2567
2568                 /* Clear any possibly unsafe personality bits on exec: */
2569                 bprm->per_clear |= PER_CLEAR_ON_SETID;
2570
2571                 /* Enable secure mode for SIDs transitions unless
2572                    the noatsecure permission is granted between
2573                    the two SIDs, i.e. ahp returns 0. */
2574                 rc = avc_has_perm(&selinux_state,
2575                                   old_tsec->sid, new_tsec->sid,
2576                                   SECCLASS_PROCESS, PROCESS__NOATSECURE,
2577                                   NULL);
2578                 bprm->secureexec |= !!rc;
2579         }
2580
2581         return 0;
2582 }
2583
2584 static int match_file(const void *p, struct file *file, unsigned fd)
2585 {
2586         return file_has_perm(p, file, file_to_av(file)) ? fd + 1 : 0;
2587 }
2588
2589 /* Derived from fs/exec.c:flush_old_files. */
2590 static inline void flush_unauthorized_files(const struct cred *cred,
2591                                             struct files_struct *files)
2592 {
2593         struct file *file, *devnull = NULL;
2594         struct tty_struct *tty;
2595         int drop_tty = 0;
2596         unsigned n;
2597
2598         tty = get_current_tty();
2599         if (tty) {
2600                 spin_lock(&tty->files_lock);
2601                 if (!list_empty(&tty->tty_files)) {
2602                         struct tty_file_private *file_priv;
2603
2604                         /* Revalidate access to controlling tty.
2605                            Use file_path_has_perm on the tty path directly
2606                            rather than using file_has_perm, as this particular
2607                            open file may belong to another process and we are
2608                            only interested in the inode-based check here. */
2609                         file_priv = list_first_entry(&tty->tty_files,
2610                                                 struct tty_file_private, list);
2611                         file = file_priv->file;
2612                         if (file_path_has_perm(cred, file, FILE__READ | FILE__WRITE))
2613                                 drop_tty = 1;
2614                 }
2615                 spin_unlock(&tty->files_lock);
2616                 tty_kref_put(tty);
2617         }
2618         /* Reset controlling tty. */
2619         if (drop_tty)
2620                 no_tty();
2621
2622         /* Revalidate access to inherited open files. */
2623         n = iterate_fd(files, 0, match_file, cred);
2624         if (!n) /* none found? */
2625                 return;
2626
2627         devnull = dentry_open(&selinux_null, O_RDWR, cred);
2628         if (IS_ERR(devnull))
2629                 devnull = NULL;
2630         /* replace all the matching ones with this */
2631         do {
2632                 replace_fd(n - 1, devnull, 0);
2633         } while ((n = iterate_fd(files, n, match_file, cred)) != 0);
2634         if (devnull)
2635                 fput(devnull);
2636 }
2637
2638 /*
2639  * Prepare a process for imminent new credential changes due to exec
2640  */
2641 static void selinux_bprm_committing_creds(struct linux_binprm *bprm)
2642 {
2643         struct task_security_struct *new_tsec;
2644         struct rlimit *rlim, *initrlim;
2645         int rc, i;
2646
2647         new_tsec = bprm->cred->security;
2648         if (new_tsec->sid == new_tsec->osid)
2649                 return;
2650
2651         /* Close files for which the new task SID is not authorized. */
2652         flush_unauthorized_files(bprm->cred, current->files);
2653
2654         /* Always clear parent death signal on SID transitions. */
2655         current->pdeath_signal = 0;
2656
2657         /* Check whether the new SID can inherit resource limits from the old
2658          * SID.  If not, reset all soft limits to the lower of the current
2659          * task's hard limit and the init task's soft limit.
2660          *
2661          * Note that the setting of hard limits (even to lower them) can be
2662          * controlled by the setrlimit check.  The inclusion of the init task's
2663          * soft limit into the computation is to avoid resetting soft limits
2664          * higher than the default soft limit for cases where the default is
2665          * lower than the hard limit, e.g. RLIMIT_CORE or RLIMIT_STACK.
2666          */
2667         rc = avc_has_perm(&selinux_state,
2668                           new_tsec->osid, new_tsec->sid, SECCLASS_PROCESS,
2669                           PROCESS__RLIMITINH, NULL);
2670         if (rc) {
2671                 /* protect against do_prlimit() */
2672                 task_lock(current);
2673                 for (i = 0; i < RLIM_NLIMITS; i++) {
2674                         rlim = current->signal->rlim + i;
2675                         initrlim = init_task.signal->rlim + i;
2676                         rlim->rlim_cur = min(rlim->rlim_max, initrlim->rlim_cur);
2677                 }
2678                 task_unlock(current);
2679                 if (IS_ENABLED(CONFIG_POSIX_TIMERS))
2680                         update_rlimit_cpu(current, rlimit(RLIMIT_CPU));
2681         }
2682 }
2683
2684 /*
2685  * Clean up the process immediately after the installation of new credentials
2686  * due to exec
2687  */
2688 static void selinux_bprm_committed_creds(struct linux_binprm *bprm)
2689 {
2690         const struct task_security_struct *tsec = current_security();
2691         struct itimerval itimer;
2692         u32 osid, sid;
2693         int rc, i;
2694
2695         osid = tsec->osid;
2696         sid = tsec->sid;
2697
2698         if (sid == osid)
2699                 return;
2700
2701         /* Check whether the new SID can inherit signal state from the old SID.
2702          * If not, clear itimers to avoid subsequent signal generation and
2703          * flush and unblock signals.
2704          *
2705          * This must occur _after_ the task SID has been updated so that any
2706          * kill done after the flush will be checked against the new SID.
2707          */
2708         rc = avc_has_perm(&selinux_state,
2709                           osid, sid, SECCLASS_PROCESS, PROCESS__SIGINH, NULL);
2710         if (rc) {
2711                 if (IS_ENABLED(CONFIG_POSIX_TIMERS)) {
2712                         memset(&itimer, 0, sizeof itimer);
2713                         for (i = 0; i < 3; i++)
2714                                 do_setitimer(i, &itimer, NULL);
2715                 }
2716                 spin_lock_irq(&current->sighand->siglock);
2717                 if (!fatal_signal_pending(current)) {
2718                         flush_sigqueue(&current->pending);
2719                         flush_sigqueue(&current->signal->shared_pending);
2720                         flush_signal_handlers(current, 1);
2721                         sigemptyset(&current->blocked);
2722                         recalc_sigpending();
2723                 }
2724                 spin_unlock_irq(&current->sighand->siglock);
2725         }
2726
2727         /* Wake up the parent if it is waiting so that it can recheck
2728          * wait permission to the new task SID. */
2729         read_lock(&tasklist_lock);
2730         __wake_up_parent(current, current->real_parent);
2731         read_unlock(&tasklist_lock);
2732 }
2733
2734 /* superblock security operations */
2735
2736 static int selinux_sb_alloc_security(struct super_block *sb)
2737 {
2738         return superblock_alloc_security(sb);
2739 }
2740
2741 static void selinux_sb_free_security(struct super_block *sb)
2742 {
2743         superblock_free_security(sb);
2744 }
2745
2746 static inline int match_prefix(char *prefix, int plen, char *option, int olen)
2747 {
2748         if (plen > olen)
2749                 return 0;
2750
2751         return !memcmp(prefix, option, plen);
2752 }
2753
2754 static inline int selinux_option(char *option, int len)
2755 {
2756         return (match_prefix(CONTEXT_STR, sizeof(CONTEXT_STR)-1, option, len) ||
2757                 match_prefix(FSCONTEXT_STR, sizeof(FSCONTEXT_STR)-1, option, len) ||
2758                 match_prefix(DEFCONTEXT_STR, sizeof(DEFCONTEXT_STR)-1, option, len) ||
2759                 match_prefix(ROOTCONTEXT_STR, sizeof(ROOTCONTEXT_STR)-1, option, len) ||
2760                 match_prefix(LABELSUPP_STR, sizeof(LABELSUPP_STR)-1, option, len));
2761 }
2762
2763 static inline void take_option(char **to, char *from, int *first, int len)
2764 {
2765         if (!*first) {
2766                 **to = ',';
2767                 *to += 1;
2768         } else
2769                 *first = 0;
2770         memcpy(*to, from, len);
2771         *to += len;
2772 }
2773
2774 static inline void take_selinux_option(char **to, char *from, int *first,
2775                                        int len)
2776 {
2777         int current_size = 0;
2778
2779         if (!*first) {
2780                 **to = '|';
2781                 *to += 1;
2782         } else
2783                 *first = 0;
2784
2785         while (current_size < len) {
2786                 if (*from != '"') {
2787                         **to = *from;
2788                         *to += 1;
2789                 }
2790                 from += 1;
2791                 current_size += 1;
2792         }
2793 }
2794
2795 static int selinux_sb_copy_data(char *orig, char *copy)
2796 {
2797         int fnosec, fsec, rc = 0;
2798         char *in_save, *in_curr, *in_end;
2799         char *sec_curr, *nosec_save, *nosec;
2800         int open_quote = 0;
2801
2802         in_curr = orig;
2803         sec_curr = copy;
2804
2805         nosec = (char *)get_zeroed_page(GFP_KERNEL);
2806         if (!nosec) {
2807                 rc = -ENOMEM;
2808                 goto out;
2809         }
2810
2811         nosec_save = nosec;
2812         fnosec = fsec = 1;
2813         in_save = in_end = orig;
2814
2815         do {
2816                 if (*in_end == '"')
2817                         open_quote = !open_quote;
2818                 if ((*in_end == ',' && open_quote == 0) ||
2819                                 *in_end == '\0') {
2820                         int len = in_end - in_curr;
2821
2822                         if (selinux_option(in_curr, len))
2823                                 take_selinux_option(&sec_curr, in_curr, &fsec, len);
2824                         else
2825                                 take_option(&nosec, in_curr, &fnosec, len);
2826
2827                         in_curr = in_end + 1;
2828                 }
2829         } while (*in_end++);
2830
2831         strcpy(in_save, nosec_save);
2832         free_page((unsigned long)nosec_save);
2833 out:
2834         return rc;
2835 }
2836
2837 static int selinux_sb_remount(struct super_block *sb, void *data)
2838 {
2839         int rc, i, *flags;
2840         struct security_mnt_opts opts;
2841         char *secdata, **mount_options;
2842         struct superblock_security_struct *sbsec = sb->s_security;
2843
2844         if (!(sbsec->flags & SE_SBINITIALIZED))
2845                 return 0;
2846
2847         if (!data)
2848                 return 0;
2849
2850         if (sb->s_type->fs_flags & FS_BINARY_MOUNTDATA)
2851                 return 0;
2852
2853         security_init_mnt_opts(&opts);
2854         secdata = alloc_secdata();
2855         if (!secdata)
2856                 return -ENOMEM;
2857         rc = selinux_sb_copy_data(data, secdata);
2858         if (rc)
2859                 goto out_free_secdata;
2860
2861         rc = selinux_parse_opts_str(secdata, &opts);
2862         if (rc)
2863                 goto out_free_secdata;
2864
2865         mount_options = opts.mnt_opts;
2866         flags = opts.mnt_opts_flags;
2867
2868         for (i = 0; i < opts.num_mnt_opts; i++) {
2869                 u32 sid;
2870
2871                 if (flags[i] == SBLABEL_MNT)
2872                         continue;
2873                 rc = security_context_str_to_sid(&selinux_state,
2874                                                  mount_options[i], &sid,
2875                                                  GFP_KERNEL);
2876                 if (rc) {
2877                         printk(KERN_WARNING "SELinux: security_context_str_to_sid"
2878                                "(%s) failed for (dev %s, type %s) errno=%d\n",
2879                                mount_options[i], sb->s_id, sb->s_type->name, rc);
2880                         goto out_free_opts;
2881                 }
2882                 rc = -EINVAL;
2883                 switch (flags[i]) {
2884                 case FSCONTEXT_MNT:
2885                         if (bad_option(sbsec, FSCONTEXT_MNT, sbsec->sid, sid))
2886                                 goto out_bad_option;
2887                         break;
2888                 case CONTEXT_MNT:
2889                         if (bad_option(sbsec, CONTEXT_MNT, sbsec->mntpoint_sid, sid))
2890                                 goto out_bad_option;
2891                         break;
2892                 case ROOTCONTEXT_MNT: {
2893                         struct inode_security_struct *root_isec;
2894                         root_isec = backing_inode_security(sb->s_root);
2895
2896                         if (bad_option(sbsec, ROOTCONTEXT_MNT, root_isec->sid, sid))
2897                                 goto out_bad_option;
2898                         break;
2899                 }
2900                 case DEFCONTEXT_MNT:
2901                         if (bad_option(sbsec, DEFCONTEXT_MNT, sbsec->def_sid, sid))
2902                                 goto out_bad_option;
2903                         break;
2904                 default:
2905                         goto out_free_opts;
2906                 }
2907         }
2908
2909         rc = 0;
2910 out_free_opts:
2911         security_free_mnt_opts(&opts);
2912 out_free_secdata:
2913         free_secdata(secdata);
2914         return rc;
2915 out_bad_option:
2916         printk(KERN_WARNING "SELinux: unable to change security options "
2917                "during remount (dev %s, type=%s)\n", sb->s_id,
2918                sb->s_type->name);
2919         goto out_free_opts;
2920 }
2921
2922 static int selinux_sb_kern_mount(struct super_block *sb, int flags, void *data)
2923 {
2924         const struct cred *cred = current_cred();
2925         struct common_audit_data ad;
2926         int rc;
2927
2928         rc = superblock_doinit(sb, data);
2929         if (rc)
2930                 return rc;
2931
2932         /* Allow all mounts performed by the kernel */
2933         if (flags & MS_KERNMOUNT)
2934                 return 0;
2935
2936         ad.type = LSM_AUDIT_DATA_DENTRY;
2937         ad.u.dentry = sb->s_root;
2938         return superblock_has_perm(cred, sb, FILESYSTEM__MOUNT, &ad);
2939 }
2940
2941 static int selinux_sb_statfs(struct dentry *dentry)
2942 {
2943         const struct cred *cred = current_cred();
2944         struct common_audit_data ad;
2945
2946         ad.type = LSM_AUDIT_DATA_DENTRY;
2947         ad.u.dentry = dentry->d_sb->s_root;
2948         return superblock_has_perm(cred, dentry->d_sb, FILESYSTEM__GETATTR, &ad);
2949 }
2950
2951 static int selinux_mount(const char *dev_name,
2952                          const struct path *path,
2953                          const char *type,
2954                          unsigned long flags,
2955                          void *data)
2956 {
2957         const struct cred *cred = current_cred();
2958
2959         if (flags & MS_REMOUNT)
2960                 return superblock_has_perm(cred, path->dentry->d_sb,
2961                                            FILESYSTEM__REMOUNT, NULL);
2962         else
2963                 return path_has_perm(cred, path, FILE__MOUNTON);
2964 }
2965
2966 static int selinux_umount(struct vfsmount *mnt, int flags)
2967 {
2968         const struct cred *cred = current_cred();
2969
2970         return superblock_has_perm(cred, mnt->mnt_sb,
2971                                    FILESYSTEM__UNMOUNT, NULL);
2972 }
2973
2974 /* inode security operations */
2975
2976 static int selinux_inode_alloc_security(struct inode *inode)
2977 {
2978         return inode_alloc_security(inode);
2979 }
2980
2981 static void selinux_inode_free_security(struct inode *inode)
2982 {
2983         inode_free_security(inode);
2984 }
2985
2986 static int selinux_dentry_init_security(struct dentry *dentry, int mode,
2987                                         const struct qstr *name, void **ctx,
2988                                         u32 *ctxlen)
2989 {
2990         u32 newsid;
2991         int rc;
2992
2993         rc = selinux_determine_inode_label(current_security(),
2994                                            d_inode(dentry->d_parent), name,
2995                                            inode_mode_to_security_class(mode),
2996                                            &newsid);
2997         if (rc)
2998                 return rc;
2999
3000         return security_sid_to_context(&selinux_state, newsid, (char **)ctx,
3001                                        ctxlen);
3002 }
3003
3004 static int selinux_dentry_create_files_as(struct dentry *dentry, int mode,
3005                                           struct qstr *name,
3006                                           const struct cred *old,
3007                                           struct cred *new)
3008 {
3009         u32 newsid;
3010         int rc;
3011         struct task_security_struct *tsec;
3012
3013         rc = selinux_determine_inode_label(old->security,
3014                                            d_inode(dentry->d_parent), name,
3015                                            inode_mode_to_security_class(mode),
3016                                            &newsid);
3017         if (rc)
3018                 return rc;
3019
3020         tsec = new->security;
3021         tsec->create_sid = newsid;
3022         return 0;
3023 }
3024
3025 static int selinux_inode_init_security(struct inode *inode, struct inode *dir,
3026                                        const struct qstr *qstr,
3027                                        const char **name,
3028                                        void **value, size_t *len)
3029 {
3030         const struct task_security_struct *tsec = current_security();
3031         struct superblock_security_struct *sbsec;
3032         u32 newsid, clen;
3033         int rc;
3034         char *context;
3035
3036         sbsec = dir->i_sb->s_security;
3037
3038         newsid = tsec->create_sid;
3039
3040         rc = selinux_determine_inode_label(current_security(),
3041                 dir, qstr,
3042                 inode_mode_to_security_class(inode->i_mode),
3043                 &newsid);
3044         if (rc)
3045                 return rc;
3046
3047         /* Possibly defer initialization to selinux_complete_init. */
3048         if (sbsec->flags & SE_SBINITIALIZED) {
3049                 struct inode_security_struct *isec = inode->i_security;
3050                 isec->sclass = inode_mode_to_security_class(inode->i_mode);
3051                 isec->sid = newsid;
3052                 isec->initialized = LABEL_INITIALIZED;
3053         }
3054
3055         if (!selinux_state.initialized || !(sbsec->flags & SBLABEL_MNT))
3056                 return -EOPNOTSUPP;
3057
3058         if (name)
3059                 *name = XATTR_SELINUX_SUFFIX;
3060
3061         if (value && len) {
3062                 rc = security_sid_to_context_force(&selinux_state, newsid,
3063                                                    &context, &clen);
3064                 if (rc)
3065                         return rc;
3066                 *value = context;
3067                 *len = clen;
3068         }
3069
3070         return 0;
3071 }
3072
3073 static int selinux_inode_create(struct inode *dir, struct dentry *dentry, umode_t mode)
3074 {
3075         return may_create(dir, dentry, SECCLASS_FILE);
3076 }
3077
3078 static int selinux_inode_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
3079 {
3080         return may_link(dir, old_dentry, MAY_LINK);
3081 }
3082
3083 static int selinux_inode_unlink(struct inode *dir, struct dentry *dentry)
3084 {
3085         return may_link(dir, dentry, MAY_UNLINK);
3086 }
3087
3088 static int selinux_inode_symlink(struct inode *dir, struct dentry *dentry, const char *name)
3089 {
3090         return may_create(dir, dentry, SECCLASS_LNK_FILE);
3091 }
3092
3093 static int selinux_inode_mkdir(struct inode *dir, struct dentry *dentry, umode_t mask)
3094 {
3095         return may_create(dir, dentry, SECCLASS_DIR);
3096 }
3097
3098 static int selinux_inode_rmdir(struct inode *dir, struct dentry *dentry)
3099 {
3100         return may_link(dir, dentry, MAY_RMDIR);
3101 }
3102
3103 static int selinux_inode_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
3104 {
3105         return may_create(dir, dentry, inode_mode_to_security_class(mode));
3106 }
3107
3108 static int selinux_inode_rename(struct inode *old_inode, struct dentry *old_dentry,
3109                                 struct inode *new_inode, struct dentry *new_dentry)
3110 {
3111         return may_rename(old_inode, old_dentry, new_inode, new_dentry);
3112 }
3113
3114 static int selinux_inode_readlink(struct dentry *dentry)
3115 {
3116         const struct cred *cred = current_cred();
3117
3118         return dentry_has_perm(cred, dentry, FILE__READ);
3119 }
3120
3121 static int selinux_inode_follow_link(struct dentry *dentry, struct inode *inode,
3122                                      bool rcu)
3123 {
3124         const struct cred *cred = current_cred();
3125         struct common_audit_data ad;
3126         struct inode_security_struct *isec;
3127         u32 sid;
3128
3129         validate_creds(cred);
3130
3131         ad.type = LSM_AUDIT_DATA_DENTRY;
3132         ad.u.dentry = dentry;
3133         sid = cred_sid(cred);
3134         isec = inode_security_rcu(inode, rcu);
3135         if (IS_ERR(isec))
3136                 return PTR_ERR(isec);
3137
3138         return avc_has_perm_flags(&selinux_state,
3139                                   sid, isec->sid, isec->sclass, FILE__READ, &ad,
3140                                   rcu ? MAY_NOT_BLOCK : 0);
3141 }
3142
3143 static noinline int audit_inode_permission(struct inode *inode,
3144                                            u32 perms, u32 audited, u32 denied,
3145                                            int result,
3146                                            unsigned flags)
3147 {
3148         struct common_audit_data ad;
3149         struct inode_security_struct *isec = inode->i_security;
3150         int rc;
3151
3152         ad.type = LSM_AUDIT_DATA_INODE;
3153         ad.u.inode = inode;
3154
3155         rc = slow_avc_audit(&selinux_state,
3156                             current_sid(), isec->sid, isec->sclass, perms,
3157                             audited, denied, result, &ad, flags);
3158         if (rc)
3159                 return rc;
3160         return 0;
3161 }
3162
3163 static int selinux_inode_permission(struct inode *inode, int mask)
3164 {
3165         const struct cred *cred = current_cred();
3166         u32 perms;
3167         bool from_access;
3168         unsigned flags = mask & MAY_NOT_BLOCK;
3169         struct inode_security_struct *isec;
3170         u32 sid;
3171         struct av_decision avd;
3172         int rc, rc2;
3173         u32 audited, denied;
3174
3175         from_access = mask & MAY_ACCESS;
3176         mask &= (MAY_READ|MAY_WRITE|MAY_EXEC|MAY_APPEND);
3177
3178         /* No permission to check.  Existence test. */
3179         if (!mask)
3180                 return 0;
3181
3182         validate_creds(cred);
3183
3184         if (unlikely(IS_PRIVATE(inode)))
3185                 return 0;
3186
3187         perms = file_mask_to_av(inode->i_mode, mask);
3188
3189         sid = cred_sid(cred);
3190         isec = inode_security_rcu(inode, flags & MAY_NOT_BLOCK);
3191         if (IS_ERR(isec))
3192                 return PTR_ERR(isec);
3193
3194         rc = avc_has_perm_noaudit(&selinux_state,
3195                                   sid, isec->sid, isec->sclass, perms, 0, &avd);
3196         audited = avc_audit_required(perms, &avd, rc,
3197                                      from_access ? FILE__AUDIT_ACCESS : 0,
3198                                      &denied);
3199         if (likely(!audited))
3200                 return rc;
3201
3202         rc2 = audit_inode_permission(inode, perms, audited, denied, rc, flags);
3203         if (rc2)
3204                 return rc2;
3205         return rc;
3206 }
3207
3208 static int selinux_inode_setattr(struct dentry *dentry, struct iattr *iattr)
3209 {
3210         const struct cred *cred = current_cred();
3211         struct inode *inode = d_backing_inode(dentry);
3212         unsigned int ia_valid = iattr->ia_valid;
3213         __u32 av = FILE__WRITE;
3214
3215         /* ATTR_FORCE is just used for ATTR_KILL_S[UG]ID. */
3216         if (ia_valid & ATTR_FORCE) {
3217                 ia_valid &= ~(ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_MODE |
3218                               ATTR_FORCE);
3219                 if (!ia_valid)
3220                         return 0;
3221         }
3222
3223         if (ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID |
3224                         ATTR_ATIME_SET | ATTR_MTIME_SET | ATTR_TIMES_SET))
3225                 return dentry_has_perm(cred, dentry, FILE__SETATTR);
3226
3227         if (selinux_policycap_openperm() &&
3228             inode->i_sb->s_magic != SOCKFS_MAGIC &&
3229             (ia_valid & ATTR_SIZE) &&
3230             !(ia_valid & ATTR_FILE))
3231                 av |= FILE__OPEN;
3232
3233         return dentry_has_perm(cred, dentry, av);
3234 }
3235
3236 static int selinux_inode_getattr(const struct path *path)
3237 {
3238         return path_has_perm(current_cred(), path, FILE__GETATTR);
3239 }
3240
3241 static bool has_cap_mac_admin(bool audit)
3242 {
3243         const struct cred *cred = current_cred();
3244         int cap_audit = audit ? SECURITY_CAP_AUDIT : SECURITY_CAP_NOAUDIT;
3245
3246         if (cap_capable(cred, &init_user_ns, CAP_MAC_ADMIN, cap_audit))
3247                 return false;
3248         if (cred_has_capability(cred, CAP_MAC_ADMIN, cap_audit, true))
3249                 return false;
3250         return true;
3251 }
3252
3253 static int selinux_inode_setxattr(struct dentry *dentry, const char *name,
3254                                   const void *value, size_t size, int flags)
3255 {
3256         struct inode *inode = d_backing_inode(dentry);
3257         struct inode_security_struct *isec;
3258         struct superblock_security_struct *sbsec;
3259         struct common_audit_data ad;
3260         u32 newsid, sid = current_sid();
3261         int rc = 0;
3262
3263         if (strcmp(name, XATTR_NAME_SELINUX)) {
3264                 rc = cap_inode_setxattr(dentry, name, value, size, flags);
3265                 if (rc)
3266                         return rc;
3267
3268                 /* Not an attribute we recognize, so just check the
3269                    ordinary setattr permission. */
3270                 return dentry_has_perm(current_cred(), dentry, FILE__SETATTR);
3271         }
3272
3273         sbsec = inode->i_sb->s_security;
3274         if (!(sbsec->flags & SBLABEL_MNT))
3275                 return -EOPNOTSUPP;
3276
3277         if (!inode_owner_or_capable(inode))
3278                 return -EPERM;
3279
3280         ad.type = LSM_AUDIT_DATA_DENTRY;
3281         ad.u.dentry = dentry;
3282
3283         isec = backing_inode_security(dentry);
3284         rc = avc_has_perm(&selinux_state,
3285                           sid, isec->sid, isec->sclass,
3286                           FILE__RELABELFROM, &ad);
3287         if (rc)
3288                 return rc;
3289
3290         rc = security_context_to_sid(&selinux_state, value, size, &newsid,
3291                                      GFP_KERNEL);
3292         if (rc == -EINVAL) {
3293                 if (!has_cap_mac_admin(true)) {
3294                         struct audit_buffer *ab;
3295                         size_t audit_size;
3296
3297                         /* We strip a nul only if it is at the end, otherwise the
3298                          * context contains a nul and we should audit that */
3299                         if (value) {
3300                                 const char *str = value;
3301
3302                                 if (str[size - 1] == '\0')
3303                                         audit_size = size - 1;
3304                                 else
3305                                         audit_size = size;
3306                         } else {
3307                                 audit_size = 0;
3308                         }
3309                         ab = audit_log_start(current->audit_context, GFP_ATOMIC, AUDIT_SELINUX_ERR);
3310                         audit_log_format(ab, "op=setxattr invalid_context=");
3311                         audit_log_n_untrustedstring(ab, value, audit_size);
3312                         audit_log_end(ab);
3313
3314                         return rc;
3315                 }
3316                 rc = security_context_to_sid_force(&selinux_state, value,
3317                                                    size, &newsid);
3318         }
3319         if (rc)
3320                 return rc;
3321
3322         rc = avc_has_perm(&selinux_state,
3323                           sid, newsid, isec->sclass,
3324                           FILE__RELABELTO, &ad);
3325         if (rc)
3326                 return rc;
3327
3328         rc = security_validate_transition(&selinux_state, isec->sid, newsid,
3329                                           sid, isec->sclass);
3330         if (rc)
3331                 return rc;
3332
3333         return avc_has_perm(&selinux_state,
3334                             newsid,
3335                             sbsec->sid,
3336                             SECCLASS_FILESYSTEM,
3337                             FILESYSTEM__ASSOCIATE,
3338                             &ad);
3339 }
3340
3341 static void selinux_inode_post_setxattr(struct dentry *dentry, const char *name,
3342                                         const void *value, size_t size,
3343                                         int flags)
3344 {
3345         struct inode *inode = d_backing_inode(dentry);
3346         struct inode_security_struct *isec;
3347         u32 newsid;
3348         int rc;
3349
3350         if (strcmp(name, XATTR_NAME_SELINUX)) {
3351                 /* Not an attribute we recognize, so nothing to do. */
3352                 return;
3353         }
3354
3355         rc = security_context_to_sid_force(&selinux_state, value, size,
3356                                            &newsid);
3357         if (rc) {
3358                 printk(KERN_ERR "SELinux:  unable to map context to SID"
3359                        "for (%s, %lu), rc=%d\n",
3360                        inode->i_sb->s_id, inode->i_ino, -rc);
3361                 return;
3362         }
3363
3364         isec = backing_inode_security(dentry);
3365         spin_lock(&isec->lock);
3366         isec->sclass = inode_mode_to_security_class(inode->i_mode);
3367         isec->sid = newsid;
3368         isec->initialized = LABEL_INITIALIZED;
3369         spin_unlock(&isec->lock);
3370
3371         return;
3372 }
3373
3374 static int selinux_inode_getxattr(struct dentry *dentry, const char *name)
3375 {
3376         const struct cred *cred = current_cred();
3377
3378         return dentry_has_perm(cred, dentry, FILE__GETATTR);
3379 }
3380
3381 static int selinux_inode_listxattr(struct dentry *dentry)
3382 {
3383         const struct cred *cred = current_cred();
3384
3385         return dentry_has_perm(cred, dentry, FILE__GETATTR);
3386 }
3387
3388 static int selinux_inode_removexattr(struct dentry *dentry, const char *name)
3389 {
3390         if (strcmp(name, XATTR_NAME_SELINUX)) {
3391                 int rc = cap_inode_removexattr(dentry, name);
3392                 if (rc)
3393                         return rc;
3394
3395                 /* Not an attribute we recognize, so just check the
3396                    ordinary setattr permission. */
3397                 return dentry_has_perm(current_cred(), dentry, FILE__SETATTR);
3398         }
3399
3400         /* No one is allowed to remove a SELinux security label.
3401            You can change the label, but all data must be labeled. */
3402         return -EACCES;
3403 }
3404
3405 /*
3406  * Copy the inode security context value to the user.
3407  *
3408  * Permission check is handled by selinux_inode_getxattr hook.
3409  */
3410 static int selinux_inode_getsecurity(struct inode *inode, const char *name, void **buffer, bool alloc)
3411 {
3412         u32 size;
3413         int error;
3414         char *context = NULL;
3415         struct inode_security_struct *isec;
3416
3417         if (strcmp(name, XATTR_SELINUX_SUFFIX))
3418                 return -EOPNOTSUPP;
3419
3420         /*
3421          * If the caller has CAP_MAC_ADMIN, then get the raw context
3422          * value even if it is not defined by current policy; otherwise,
3423          * use the in-core value under current policy.
3424          * Use the non-auditing forms of the permission checks since
3425          * getxattr may be called by unprivileged processes commonly
3426          * and lack of permission just means that we fall back to the
3427          * in-core context value, not a denial.
3428          */
3429         isec = inode_security(inode);
3430         if (has_cap_mac_admin(false))
3431                 error = security_sid_to_context_force(&selinux_state,
3432                                                       isec->sid, &context,
3433                                                       &size);
3434         else
3435                 error = security_sid_to_context(&selinux_state, isec->sid,
3436                                                 &context, &size);
3437         if (error)
3438                 return error;
3439         error = size;
3440         if (alloc) {
3441                 *buffer = context;
3442                 goto out_nofree;
3443         }
3444         kfree(context);
3445 out_nofree:
3446         return error;
3447 }
3448
3449 static int selinux_inode_setsecurity(struct inode *inode, const char *name,
3450                                      const void *value, size_t size, int flags)
3451 {
3452         struct inode_security_struct *isec = inode_security_novalidate(inode);
3453         u32 newsid;
3454         int rc;
3455
3456         if (strcmp(name, XATTR_SELINUX_SUFFIX))
3457                 return -EOPNOTSUPP;
3458
3459         if (!value || !size)
3460                 return -EACCES;
3461
3462         rc = security_context_to_sid(&selinux_state, value, size, &newsid,
3463                                      GFP_KERNEL);
3464         if (rc)
3465                 return rc;
3466
3467         spin_lock(&isec->lock);
3468         isec->sclass = inode_mode_to_security_class(inode->i_mode);
3469         isec->sid = newsid;
3470         isec->initialized = LABEL_INITIALIZED;
3471         spin_unlock(&isec->lock);
3472         return 0;
3473 }
3474
3475 static int selinux_inode_listsecurity(struct inode *inode, char *buffer, size_t buffer_size)
3476 {
3477         const int len = sizeof(XATTR_NAME_SELINUX);
3478         if (buffer && len <= buffer_size)
3479                 memcpy(buffer, XATTR_NAME_SELINUX, len);
3480         return len;
3481 }
3482
3483 static void selinux_inode_getsecid(struct inode *inode, u32 *secid)
3484 {
3485         struct inode_security_struct *isec = inode_security_novalidate(inode);
3486         *secid = isec->sid;
3487 }
3488
3489 static int selinux_inode_copy_up(struct dentry *src, struct cred **new)
3490 {
3491         u32 sid;
3492         struct task_security_struct *tsec;
3493         struct cred *new_creds = *new;
3494
3495         if (new_creds == NULL) {
3496                 new_creds = prepare_creds();
3497                 if (!new_creds)
3498                         return -ENOMEM;
3499         }
3500
3501         tsec = new_creds->security;
3502         /* Get label from overlay inode and set it in create_sid */
3503         selinux_inode_getsecid(d_inode(src), &sid);
3504         tsec->create_sid = sid;
3505         *new = new_creds;
3506         return 0;
3507 }
3508
3509 static int selinux_inode_copy_up_xattr(const char *name)
3510 {
3511         /* The copy_up hook above sets the initial context on an inode, but we
3512          * don't then want to overwrite it by blindly copying all the lower
3513          * xattrs up.  Instead, we have to filter out SELinux-related xattrs.
3514          */
3515         if (strcmp(name, XATTR_NAME_SELINUX) == 0)
3516                 return 1; /* Discard */
3517         /*
3518          * Any other attribute apart from SELINUX is not claimed, supported
3519          * by selinux.
3520          */
3521         return -EOPNOTSUPP;
3522 }
3523
3524 /* file security operations */
3525
3526 static int selinux_revalidate_file_permission(struct file *file, int mask)
3527 {
3528         const struct cred *cred = current_cred();
3529         struct inode *inode = file_inode(file);
3530
3531         /* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */
3532         if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE))
3533                 mask |= MAY_APPEND;
3534
3535         return file_has_perm(cred, file,
3536                              file_mask_to_av(inode->i_mode, mask));
3537 }
3538
3539 static int selinux_file_permission(struct file *file, int mask)
3540 {
3541         struct inode *inode = file_inode(file);
3542         struct file_security_struct *fsec = file->f_security;
3543         struct inode_security_struct *isec;
3544         u32 sid = current_sid();
3545
3546         if (!mask)
3547                 /* No permission to check.  Existence test. */
3548                 return 0;
3549
3550         isec = inode_security(inode);
3551         if (sid == fsec->sid && fsec->isid == isec->sid &&
3552             fsec->pseqno == avc_policy_seqno(&selinux_state))
3553                 /* No change since file_open check. */
3554                 return 0;
3555
3556         return selinux_revalidate_file_permission(file, mask);
3557 }
3558
3559 static int selinux_file_alloc_security(struct file *file)
3560 {
3561         return file_alloc_security(file);
3562 }
3563
3564 static void selinux_file_free_security(struct file *file)
3565 {
3566         file_free_security(file);
3567 }
3568
3569 /*
3570  * Check whether a task has the ioctl permission and cmd
3571  * operation to an inode.
3572  */
3573 static int ioctl_has_perm(const struct cred *cred, struct file *file,
3574                 u32 requested, u16 cmd)
3575 {
3576         struct common_audit_data ad;
3577         struct file_security_struct *fsec = file->f_security;
3578         struct inode *inode = file_inode(file);
3579         struct inode_security_struct *isec;
3580         struct lsm_ioctlop_audit ioctl;
3581         u32 ssid = cred_sid(cred);
3582         int rc;
3583         u8 driver = cmd >> 8;
3584         u8 xperm = cmd & 0xff;
3585
3586         ad.type = LSM_AUDIT_DATA_IOCTL_OP;
3587         ad.u.op = &ioctl;
3588         ad.u.op->cmd = cmd;
3589         ad.u.op->path = file->f_path;
3590
3591         if (ssid != fsec->sid) {
3592                 rc = avc_has_perm(&selinux_state,
3593                                   ssid, fsec->sid,
3594                                 SECCLASS_FD,
3595                                 FD__USE,
3596                                 &ad);
3597                 if (rc)
3598                         goto out;
3599         }
3600
3601         if (unlikely(IS_PRIVATE(inode)))
3602                 return 0;
3603
3604         isec = inode_security(inode);
3605         rc = avc_has_extended_perms(&selinux_state,
3606                                     ssid, isec->sid, isec->sclass,
3607                                     requested, driver, xperm, &ad);
3608 out:
3609         return rc;
3610 }
3611
3612 static int selinux_file_ioctl(struct file *file, unsigned int cmd,
3613                               unsigned long arg)
3614 {
3615         const struct cred *cred = current_cred();
3616         int error = 0;
3617
3618         switch (cmd) {
3619         case FIONREAD:
3620         /* fall through */
3621         case FIBMAP:
3622         /* fall through */
3623         case FIGETBSZ:
3624         /* fall through */
3625         case FS_IOC_GETFLAGS:
3626         /* fall through */
3627         case FS_IOC_GETVERSION:
3628                 error = file_has_perm(cred, file, FILE__GETATTR);
3629                 break;
3630
3631         case FS_IOC_SETFLAGS:
3632         /* fall through */
3633         case FS_IOC_SETVERSION:
3634                 error = file_has_perm(cred, file, FILE__SETATTR);
3635                 break;
3636
3637         /* sys_ioctl() checks */
3638         case FIONBIO:
3639         /* fall through */
3640         case FIOASYNC:
3641                 error = file_has_perm(cred, file, 0);
3642                 break;
3643
3644         case KDSKBENT:
3645         case KDSKBSENT:
3646                 error = cred_has_capability(cred, CAP_SYS_TTY_CONFIG,
3647                                             SECURITY_CAP_AUDIT, true);
3648                 break;
3649
3650         /* default case assumes that the command will go
3651          * to the file's ioctl() function.
3652          */
3653         default:
3654                 error = ioctl_has_perm(cred, file, FILE__IOCTL, (u16) cmd);
3655         }
3656         return error;
3657 }
3658
3659 static int default_noexec;
3660
3661 static int file_map_prot_check(struct file *file, unsigned long prot, int shared)
3662 {
3663         const struct cred *cred = current_cred();
3664         u32 sid = cred_sid(cred);
3665         int rc = 0;
3666
3667         if (default_noexec &&
3668             (prot & PROT_EXEC) && (!file || IS_PRIVATE(file_inode(file)) ||
3669                                    (!shared && (prot & PROT_WRITE)))) {
3670                 /*
3671                  * We are making executable an anonymous mapping or a
3672                  * private file mapping that will also be writable.
3673                  * This has an additional check.
3674                  */
3675                 rc = avc_has_perm(&selinux_state,
3676                                   sid, sid, SECCLASS_PROCESS,
3677                                   PROCESS__EXECMEM, NULL);
3678                 if (rc)
3679                         goto error;
3680         }
3681
3682         if (file) {
3683                 /* read access is always possible with a mapping */
3684                 u32 av = FILE__READ;
3685
3686                 /* write access only matters if the mapping is shared */
3687                 if (shared && (prot & PROT_WRITE))
3688                         av |= FILE__WRITE;
3689
3690                 if (prot & PROT_EXEC)
3691                         av |= FILE__EXECUTE;
3692
3693                 return file_has_perm(cred, file, av);
3694         }
3695
3696 error:
3697         return rc;
3698 }
3699
3700 static int selinux_mmap_addr(unsigned long addr)
3701 {
3702         int rc = 0;
3703
3704         if (addr < CONFIG_LSM_MMAP_MIN_ADDR) {
3705                 u32 sid = current_sid();
3706                 rc = avc_has_perm(&selinux_state,
3707                                   sid, sid, SECCLASS_MEMPROTECT,
3708                                   MEMPROTECT__MMAP_ZERO, NULL);
3709         }
3710
3711         return rc;
3712 }
3713
3714 static int selinux_mmap_file(struct file *file, unsigned long reqprot,
3715                              unsigned long prot, unsigned long flags)
3716 {
3717         struct common_audit_data ad;
3718         int rc;
3719
3720         if (file) {
3721                 ad.type = LSM_AUDIT_DATA_FILE;
3722                 ad.u.file = file;
3723                 rc = inode_has_perm(current_cred(), file_inode(file),
3724                                     FILE__MAP, &ad);
3725                 if (rc)
3726                         return rc;
3727         }
3728
3729         if (selinux_state.checkreqprot)
3730                 prot = reqprot;
3731
3732         return file_map_prot_check(file, prot,
3733                                    (flags & MAP_TYPE) == MAP_SHARED);
3734 }
3735
3736 static int selinux_file_mprotect(struct vm_area_struct *vma,
3737                                  unsigned long reqprot,
3738                                  unsigned long prot)
3739 {
3740         const struct cred *cred = current_cred();
3741         u32 sid = cred_sid(cred);
3742
3743         if (selinux_state.checkreqprot)
3744                 prot = reqprot;
3745
3746         if (default_noexec &&
3747             (prot & PROT_EXEC) && !(vma->vm_flags & VM_EXEC)) {
3748                 int rc = 0;
3749                 if (vma->vm_start >= vma->vm_mm->start_brk &&
3750                     vma->vm_end <= vma->vm_mm->brk) {
3751                         rc = avc_has_perm(&selinux_state,
3752                                           sid, sid, SECCLASS_PROCESS,
3753                                           PROCESS__EXECHEAP, NULL);
3754                 } else if (!vma->vm_file &&
3755                            ((vma->vm_start <= vma->vm_mm->start_stack &&
3756                              vma->vm_end >= vma->vm_mm->start_stack) ||
3757                             vma_is_stack_for_current(vma))) {
3758                         rc = avc_has_perm(&selinux_state,
3759                                           sid, sid, SECCLASS_PROCESS,
3760                                           PROCESS__EXECSTACK, NULL);
3761                 } else if (vma->vm_file && vma->anon_vma) {
3762                         /*
3763                          * We are making executable a file mapping that has
3764                          * had some COW done. Since pages might have been
3765                          * written, check ability to execute the possibly
3766                          * modified content.  This typically should only
3767                          * occur for text relocations.
3768                          */
3769                         rc = file_has_perm(cred, vma->vm_file, FILE__EXECMOD);
3770                 }
3771                 if (rc)
3772                         return rc;
3773         }
3774
3775         return file_map_prot_check(vma->vm_file, prot, vma->vm_flags&VM_SHARED);
3776 }
3777
3778 static int selinux_file_lock(struct file *file, unsigned int cmd)
3779 {
3780         const struct cred *cred = current_cred();
3781
3782         return file_has_perm(cred, file, FILE__LOCK);
3783 }
3784
3785 static int selinux_file_fcntl(struct file *file, unsigned int cmd,
3786                               unsigned long arg)
3787 {
3788         const struct cred *cred = current_cred();
3789         int err = 0;
3790
3791         switch (cmd) {
3792         case F_SETFL:
3793                 if ((file->f_flags & O_APPEND) && !(arg & O_APPEND)) {
3794                         err = file_has_perm(cred, file, FILE__WRITE);
3795                         break;
3796                 }
3797                 /* fall through */
3798         case F_SETOWN:
3799         case F_SETSIG:
3800         case F_GETFL:
3801         case F_GETOWN:
3802         case F_GETSIG:
3803         case F_GETOWNER_UIDS:
3804                 /* Just check FD__USE permission */
3805                 err = file_has_perm(cred, file, 0);
3806                 break;
3807         case F_GETLK:
3808         case F_SETLK:
3809         case F_SETLKW:
3810         case F_OFD_GETLK:
3811         case F_OFD_SETLK:
3812         case F_OFD_SETLKW:
3813 #if BITS_PER_LONG == 32
3814         case F_GETLK64:
3815         case F_SETLK64:
3816         case F_SETLKW64:
3817 #endif
3818                 err = file_has_perm(cred, file, FILE__LOCK);
3819                 break;
3820         }
3821
3822         return err;
3823 }
3824
3825 static void selinux_file_set_fowner(struct file *file)
3826 {
3827         struct file_security_struct *fsec;
3828
3829         fsec = file->f_security;
3830         fsec->fown_sid = current_sid();
3831 }
3832
3833 static int selinux_file_send_sigiotask(struct task_struct *tsk,
3834                                        struct fown_struct *fown, int signum)
3835 {
3836         struct file *file;
3837         u32 sid = task_sid(tsk);
3838         u32 perm;
3839         struct file_security_struct *fsec;
3840
3841         /* struct fown_struct is never outside the context of a struct file */
3842         file = container_of(fown, struct file, f_owner);
3843
3844         fsec = file->f_security;
3845
3846         if (!signum)
3847                 perm = signal_to_av(SIGIO); /* as per send_sigio_to_task */
3848         else
3849                 perm = signal_to_av(signum);
3850
3851         return avc_has_perm(&selinux_state,
3852                             fsec->fown_sid, sid,
3853                             SECCLASS_PROCESS, perm, NULL);
3854 }
3855
3856 static int selinux_file_receive(struct file *file)
3857 {
3858         const struct cred *cred = current_cred();
3859
3860         return file_has_perm(cred, file, file_to_av(file));
3861 }
3862
3863 static int selinux_file_open(struct file *file, const struct cred *cred)
3864 {
3865         struct file_security_struct *fsec;
3866         struct inode_security_struct *isec;
3867
3868         fsec = file->f_security;
3869         isec = inode_security(file_inode(file));
3870         /*
3871          * Save inode label and policy sequence number
3872          * at open-time so that selinux_file_permission
3873          * can determine whether revalidation is necessary.
3874          * Task label is already saved in the file security
3875          * struct as its SID.
3876          */
3877         fsec->isid = isec->sid;
3878         fsec->pseqno = avc_policy_seqno(&selinux_state);
3879         /*
3880          * Since the inode label or policy seqno may have changed
3881          * between the selinux_inode_permission check and the saving
3882          * of state above, recheck that access is still permitted.
3883          * Otherwise, access might never be revalidated against the
3884          * new inode label or new policy.
3885          * This check is not redundant - do not remove.
3886          */
3887         return file_path_has_perm(cred, file, open_file_to_av(file));
3888 }
3889
3890 /* task security operations */
3891
3892 static int selinux_task_alloc(struct task_struct *task,
3893                               unsigned long clone_flags)
3894 {
3895         u32 sid = current_sid();
3896
3897         return avc_has_perm(&selinux_state,
3898                             sid, sid, SECCLASS_PROCESS, PROCESS__FORK, NULL);
3899 }
3900
3901 /*
3902  * allocate the SELinux part of blank credentials
3903  */
3904 static int selinux_cred_alloc_blank(struct cred *cred, gfp_t gfp)
3905 {
3906         struct task_security_struct *tsec;
3907
3908         tsec = kzalloc(sizeof(struct task_security_struct), gfp);
3909         if (!tsec)
3910                 return -ENOMEM;
3911
3912         cred->security = tsec;
3913         return 0;
3914 }
3915
3916 /*
3917  * detach and free the LSM part of a set of credentials
3918  */
3919 static void selinux_cred_free(struct cred *cred)
3920 {
3921         struct task_security_struct *tsec = cred->security;
3922
3923         /*
3924          * cred->security == NULL if security_cred_alloc_blank() or
3925          * security_prepare_creds() returned an error.
3926          */
3927         BUG_ON(cred->security && (unsigned long) cred->security < PAGE_SIZE);
3928         cred->security = (void *) 0x7UL;
3929         kfree(tsec);
3930 }
3931
3932 /*
3933  * prepare a new set of credentials for modification
3934  */
3935 static int selinux_cred_prepare(struct cred *new, const struct cred *old,
3936                                 gfp_t gfp)
3937 {
3938         const struct task_security_struct *old_tsec;
3939         struct task_security_struct *tsec;
3940
3941         old_tsec = old->security;
3942
3943         tsec = kmemdup(old_tsec, sizeof(struct task_security_struct), gfp);
3944         if (!tsec)
3945                 return -ENOMEM;
3946
3947         new->security = tsec;
3948         return 0;
3949 }
3950
3951 /*
3952  * transfer the SELinux data to a blank set of creds
3953  */
3954 static void selinux_cred_transfer(struct cred *new, const struct cred *old)
3955 {
3956         const struct task_security_struct *old_tsec = old->security;
3957         struct task_security_struct *tsec = new->security;
3958
3959         *tsec = *old_tsec;
3960 }
3961
3962 static void selinux_cred_getsecid(const struct cred *c, u32 *secid)
3963 {
3964         *secid = cred_sid(c);
3965 }
3966
3967 /*
3968  * set the security data for a kernel service
3969  * - all the creation contexts are set to unlabelled
3970  */
3971 static int selinux_kernel_act_as(struct cred *new, u32 secid)
3972 {
3973         struct task_security_struct *tsec = new->security;
3974         u32 sid = current_sid();
3975         int ret;
3976
3977         ret = avc_has_perm(&selinux_state,
3978                            sid, secid,
3979                            SECCLASS_KERNEL_SERVICE,
3980                            KERNEL_SERVICE__USE_AS_OVERRIDE,
3981                            NULL);
3982         if (ret == 0) {
3983                 tsec->sid = secid;
3984                 tsec->create_sid = 0;
3985                 tsec->keycreate_sid = 0;
3986                 tsec->sockcreate_sid = 0;
3987         }
3988         return ret;
3989 }
3990
3991 /*
3992  * set the file creation context in a security record to the same as the
3993  * objective context of the specified inode
3994  */
3995 static int selinux_kernel_create_files_as(struct cred *new, struct inode *inode)
3996 {
3997         struct inode_security_struct *isec = inode_security(inode);
3998         struct task_security_struct *tsec = new->security;
3999         u32 sid = current_sid();
4000         int ret;
4001
4002         ret = avc_has_perm(&selinux_state,
4003                            sid, isec->sid,
4004                            SECCLASS_KERNEL_SERVICE,
4005                            KERNEL_SERVICE__CREATE_FILES_AS,
4006                            NULL);
4007
4008         if (ret == 0)
4009                 tsec->create_sid = isec->sid;
4010         return ret;
4011 }
4012
4013 static int selinux_kernel_module_request(char *kmod_name)
4014 {
4015         struct common_audit_data ad;
4016
4017         ad.type = LSM_AUDIT_DATA_KMOD;
4018         ad.u.kmod_name = kmod_name;
4019
4020         return avc_has_perm(&selinux_state,
4021                             current_sid(), SECINITSID_KERNEL, SECCLASS_SYSTEM,
4022                             SYSTEM__MODULE_REQUEST, &ad);
4023 }
4024
4025 static int selinux_kernel_module_from_file(struct file *file)
4026 {
4027         struct common_audit_data ad;
4028         struct inode_security_struct *isec;
4029         struct file_security_struct *fsec;
4030         u32 sid = current_sid();
4031         int rc;
4032
4033         /* init_module */
4034         if (file == NULL)
4035                 return avc_has_perm(&selinux_state,
4036                                     sid, sid, SECCLASS_SYSTEM,
4037                                         SYSTEM__MODULE_LOAD, NULL);
4038
4039         /* finit_module */
4040
4041         ad.type = LSM_AUDIT_DATA_FILE;
4042         ad.u.file = file;
4043
4044         fsec = file->f_security;
4045         if (sid != fsec->sid) {
4046                 rc = avc_has_perm(&selinux_state,
4047                                   sid, fsec->sid, SECCLASS_FD, FD__USE, &ad);
4048                 if (rc)
4049                         return rc;
4050         }
4051
4052         isec = inode_security(file_inode(file));
4053         return avc_has_perm(&selinux_state,
4054                             sid, isec->sid, SECCLASS_SYSTEM,
4055                                 SYSTEM__MODULE_LOAD, &ad);
4056 }
4057
4058 static int selinux_kernel_read_file(struct file *file,
4059                                     enum kernel_read_file_id id)
4060 {
4061         int rc = 0;
4062
4063         switch (id) {
4064         case READING_MODULE:
4065                 rc = selinux_kernel_module_from_file(file);
4066                 break;
4067         default:
4068                 break;
4069         }
4070
4071         return rc;
4072 }
4073
4074 static int selinux_task_setpgid(struct task_struct *p, pid_t pgid)
4075 {
4076         return avc_has_perm(&selinux_state,
4077                             current_sid(), task_sid(p), SECCLASS_PROCESS,
4078                             PROCESS__SETPGID, NULL);
4079 }
4080
4081 static int selinux_task_getpgid(struct task_struct *p)
4082 {
4083         return avc_has_perm(&selinux_state,
4084                             current_sid(), task_sid(p), SECCLASS_PROCESS,
4085                             PROCESS__GETPGID, NULL);
4086 }
4087
4088 static int selinux_task_getsid(struct task_struct *p)
4089 {
4090         return avc_has_perm(&selinux_state,
4091                             current_sid(), task_sid(p), SECCLASS_PROCESS,
4092                             PROCESS__GETSESSION, NULL);
4093 }
4094
4095 static void selinux_task_getsecid(struct task_struct *p, u32 *secid)
4096 {
4097         *secid = task_sid(p);
4098 }
4099
4100 static int selinux_task_setnice(struct task_struct *p, int nice)
4101 {
4102         return avc_has_perm(&selinux_state,
4103                             current_sid(), task_sid(p), SECCLASS_PROCESS,
4104                             PROCESS__SETSCHED, NULL);
4105 }
4106
4107 static int selinux_task_setioprio(struct task_struct *p, int ioprio)
4108 {
4109         return avc_has_perm(&selinux_state,
4110                             current_sid(), task_sid(p), SECCLASS_PROCESS,
4111                             PROCESS__SETSCHED, NULL);
4112 }
4113
4114 static int selinux_task_getioprio(struct task_struct *p)
4115 {
4116         return avc_has_perm(&selinux_state,
4117                             current_sid(), task_sid(p), SECCLASS_PROCESS,
4118                             PROCESS__GETSCHED, NULL);
4119 }
4120
4121 static int selinux_task_prlimit(const struct cred *cred, const struct cred *tcred,
4122                                 unsigned int flags)
4123 {
4124         u32 av = 0;
4125
4126         if (!flags)
4127                 return 0;
4128         if (flags & LSM_PRLIMIT_WRITE)
4129                 av |= PROCESS__SETRLIMIT;
4130         if (flags & LSM_PRLIMIT_READ)
4131                 av |= PROCESS__GETRLIMIT;
4132         return avc_has_perm(&selinux_state,
4133                             cred_sid(cred), cred_sid(tcred),
4134                             SECCLASS_PROCESS, av, NULL);
4135 }
4136
4137 static int selinux_task_setrlimit(struct task_struct *p, unsigned int resource,
4138                 struct rlimit *new_rlim)
4139 {
4140         struct rlimit *old_rlim = p->signal->rlim + resource;
4141
4142         /* Control the ability to change the hard limit (whether
4143            lowering or raising it), so that the hard limit can
4144            later be used as a safe reset point for the soft limit
4145            upon context transitions.  See selinux_bprm_committing_creds. */
4146         if (old_rlim->rlim_max != new_rlim->rlim_max)
4147                 return avc_has_perm(&selinux_state,
4148                                     current_sid(), task_sid(p),
4149                                     SECCLASS_PROCESS, PROCESS__SETRLIMIT, NULL);
4150
4151         return 0;
4152 }
4153
4154 static int selinux_task_setscheduler(struct task_struct *p)
4155 {
4156         return avc_has_perm(&selinux_state,
4157                             current_sid(), task_sid(p), SECCLASS_PROCESS,
4158                             PROCESS__SETSCHED, NULL);
4159 }
4160
4161 static int selinux_task_getscheduler(struct task_struct *p)
4162 {
4163         return avc_has_perm(&selinux_state,
4164                             current_sid(), task_sid(p), SECCLASS_PROCESS,
4165                             PROCESS__GETSCHED, NULL);
4166 }
4167
4168 static int selinux_task_movememory(struct task_struct *p)
4169 {
4170         return avc_has_perm(&selinux_state,
4171                             current_sid(), task_sid(p), SECCLASS_PROCESS,
4172                             PROCESS__SETSCHED, NULL);
4173 }
4174
4175 static int selinux_task_kill(struct task_struct *p, struct siginfo *info,
4176                                 int sig, const struct cred *cred)
4177 {
4178         u32 secid;
4179         u32 perm;
4180
4181         if (!sig)
4182                 perm = PROCESS__SIGNULL; /* null signal; existence test */
4183         else
4184                 perm = signal_to_av(sig);
4185         if (!cred)
4186                 secid = current_sid();
4187         else
4188                 secid = cred_sid(cred);
4189         return avc_has_perm(&selinux_state,
4190                             secid, task_sid(p), SECCLASS_PROCESS, perm, NULL);
4191 }
4192
4193 static void selinux_task_to_inode(struct task_struct *p,
4194                                   struct inode *inode)
4195 {
4196         struct inode_security_struct *isec = inode->i_security;
4197         u32 sid = task_sid(p);
4198
4199         spin_lock(&isec->lock);
4200         isec->sclass = inode_mode_to_security_class(inode->i_mode);
4201         isec->sid = sid;
4202         isec->initialized = LABEL_INITIALIZED;
4203         spin_unlock(&isec->lock);
4204 }
4205
4206 /* Returns error only if unable to parse addresses */
4207 static int selinux_parse_skb_ipv4(struct sk_buff *skb,
4208                         struct common_audit_data *ad, u8 *proto)
4209 {
4210         int offset, ihlen, ret = -EINVAL;
4211         struct iphdr _iph, *ih;
4212
4213         offset = skb_network_offset(skb);
4214         ih = skb_header_pointer(skb, offset, sizeof(_iph), &_iph);
4215         if (ih == NULL)
4216                 goto out;
4217
4218         ihlen = ih->ihl * 4;
4219         if (ihlen < sizeof(_iph))
4220                 goto out;
4221
4222         ad->u.net->v4info.saddr = ih->saddr;
4223         ad->u.net->v4info.daddr = ih->daddr;
4224         ret = 0;
4225
4226         if (proto)
4227                 *proto = ih->protocol;
4228
4229         switch (ih->protocol) {
4230         case IPPROTO_TCP: {
4231                 struct tcphdr _tcph, *th;
4232
4233                 if (ntohs(ih->frag_off) & IP_OFFSET)
4234                         break;
4235
4236                 offset += ihlen;
4237                 th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
4238                 if (th == NULL)
4239                         break;
4240
4241                 ad->u.net->sport = th->source;
4242                 ad->u.net->dport = th->dest;
4243                 break;
4244         }
4245
4246         case IPPROTO_UDP: {
4247                 struct udphdr _udph, *uh;
4248
4249                 if (ntohs(ih->frag_off) & IP_OFFSET)
4250                         break;
4251
4252                 offset += ihlen;
4253                 uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
4254                 if (uh == NULL)
4255                         break;
4256
4257                 ad->u.net->sport = uh->source;
4258                 ad->u.net->dport = uh->dest;
4259                 break;
4260         }
4261
4262         case IPPROTO_DCCP: {
4263                 struct dccp_hdr _dccph, *dh;
4264
4265                 if (ntohs(ih->frag_off) & IP_OFFSET)
4266                         break;
4267
4268                 offset += ihlen;
4269                 dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph);
4270                 if (dh == NULL)
4271                         break;
4272
4273                 ad->u.net->sport = dh->dccph_sport;
4274                 ad->u.net->dport = dh->dccph_dport;
4275                 break;
4276         }
4277
4278 #if IS_ENABLED(CONFIG_IP_SCTP)
4279         case IPPROTO_SCTP: {
4280                 struct sctphdr _sctph, *sh;
4281
4282                 if (ntohs(ih->frag_off) & IP_OFFSET)
4283                         break;
4284
4285                 offset += ihlen;
4286                 sh = skb_header_pointer(skb, offset, sizeof(_sctph), &_sctph);
4287                 if (sh == NULL)
4288                         break;
4289
4290                 ad->u.net->sport = sh->source;
4291                 ad->u.net->dport = sh->dest;
4292                 break;
4293         }
4294 #endif
4295         default:
4296                 break;
4297         }
4298 out:
4299         return ret;
4300 }
4301
4302 #if IS_ENABLED(CONFIG_IPV6)
4303
4304 /* Returns error only if unable to parse addresses */
4305 static int selinux_parse_skb_ipv6(struct sk_buff *skb,
4306                         struct common_audit_data *ad, u8 *proto)
4307 {
4308         u8 nexthdr;
4309         int ret = -EINVAL, offset;
4310         struct ipv6hdr _ipv6h, *ip6;
4311         __be16 frag_off;
4312
4313         offset = skb_network_offset(skb);
4314         ip6 = skb_header_pointer(skb, offset, sizeof(_ipv6h), &_ipv6h);
4315         if (ip6 == NULL)
4316                 goto out;
4317
4318         ad->u.net->v6info.saddr = ip6->saddr;
4319         ad->u.net->v6info.daddr = ip6->daddr;
4320         ret = 0;
4321
4322         nexthdr = ip6->nexthdr;
4323         offset += sizeof(_ipv6h);
4324         offset = ipv6_skip_exthdr(skb, offset, &nexthdr, &frag_off);
4325         if (offset < 0)
4326                 goto out;
4327
4328         if (proto)
4329                 *proto = nexthdr;
4330
4331         switch (nexthdr) {
4332         case IPPROTO_TCP: {
4333                 struct tcphdr _tcph, *th;
4334
4335                 th = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
4336                 if (th == NULL)
4337                         break;
4338
4339                 ad->u.net->sport = th->source;
4340                 ad->u.net->dport = th->dest;
4341                 break;
4342         }
4343
4344         case IPPROTO_UDP: {
4345                 struct udphdr _udph, *uh;
4346
4347                 uh = skb_header_pointer(skb, offset, sizeof(_udph), &_udph);
4348                 if (uh == NULL)
4349                         break;
4350
4351                 ad->u.net->sport = uh->source;
4352                 ad->u.net->dport = uh->dest;
4353                 break;
4354         }
4355
4356         case IPPROTO_DCCP: {
4357                 struct dccp_hdr _dccph, *dh;
4358
4359                 dh = skb_header_pointer(skb, offset, sizeof(_dccph), &_dccph);
4360                 if (dh == NULL)
4361                         break;
4362
4363                 ad->u.net->sport = dh->dccph_sport;
4364                 ad->u.net->dport = dh->dccph_dport;
4365                 break;
4366         }
4367
4368 #if IS_ENABLED(CONFIG_IP_SCTP)
4369         case IPPROTO_SCTP: {
4370                 struct sctphdr _sctph, *sh;
4371
4372                 sh = skb_header_pointer(skb, offset, sizeof(_sctph), &_sctph);
4373                 if (sh == NULL)
4374                         break;
4375
4376                 ad->u.net->sport = sh->source;
4377                 ad->u.net->dport = sh->dest;
4378                 break;
4379         }
4380 #endif
4381         /* includes fragments */
4382         default:
4383                 break;
4384         }
4385 out:
4386         return ret;
4387 }
4388
4389 #endif /* IPV6 */
4390
4391 static int selinux_parse_skb(struct sk_buff *skb, struct common_audit_data *ad,
4392                              char **_addrp, int src, u8 *proto)
4393 {
4394         char *addrp;
4395         int ret;
4396
4397         switch (ad->u.net->family) {
4398         case PF_INET:
4399                 ret = selinux_parse_skb_ipv4(skb, ad, proto);
4400                 if (ret)
4401                         goto parse_error;
4402                 addrp = (char *)(src ? &ad->u.net->v4info.saddr :
4403                                        &ad->u.net->v4info.daddr);
4404                 goto okay;
4405
4406 #if IS_ENABLED(CONFIG_IPV6)
4407         case PF_INET6:
4408                 ret = selinux_parse_skb_ipv6(skb, ad, proto);
4409                 if (ret)
4410                         goto parse_error;
4411                 addrp = (char *)(src ? &ad->u.net->v6info.saddr :
4412                                        &ad->u.net->v6info.daddr);
4413                 goto okay;
4414 #endif  /* IPV6 */
4415         default:
4416                 addrp = NULL;
4417                 goto okay;
4418         }
4419
4420 parse_error:
4421         printk(KERN_WARNING
4422                "SELinux: failure in selinux_parse_skb(),"
4423                " unable to parse packet\n");
4424         return ret;
4425
4426 okay:
4427         if (_addrp)
4428                 *_addrp = addrp;
4429         return 0;
4430 }
4431
4432 /**
4433  * selinux_skb_peerlbl_sid - Determine the peer label of a packet
4434  * @skb: the packet
4435  * @family: protocol family
4436  * @sid: the packet's peer label SID
4437  *
4438  * Description:
4439  * Check the various different forms of network peer labeling and determine
4440  * the peer label/SID for the packet; most of the magic actually occurs in
4441  * the security server function security_net_peersid_cmp().  The function
4442  * returns zero if the value in @sid is valid (although it may be SECSID_NULL)
4443  * or -EACCES if @sid is invalid due to inconsistencies with the different
4444  * peer labels.
4445  *
4446  */
4447 static int selinux_skb_peerlbl_sid(struct sk_buff *skb, u16 family, u32 *sid)
4448 {
4449         int err;
4450         u32 xfrm_sid;
4451         u32 nlbl_sid;
4452         u32 nlbl_type;
4453
4454         err = selinux_xfrm_skb_sid(skb, &xfrm_sid);
4455         if (unlikely(err))
4456                 return -EACCES;
4457         err = selinux_netlbl_skbuff_getsid(skb, family, &nlbl_type, &nlbl_sid);
4458         if (unlikely(err))
4459                 return -EACCES;
4460
4461         err = security_net_peersid_resolve(&selinux_state, nlbl_sid,
4462                                            nlbl_type, xfrm_sid, sid);
4463         if (unlikely(err)) {
4464                 printk(KERN_WARNING
4465                        "SELinux: failure in selinux_skb_peerlbl_sid(),"
4466                        " unable to determine packet's peer label\n");
4467                 return -EACCES;
4468         }
4469
4470         return 0;
4471 }
4472
4473 /**
4474  * selinux_conn_sid - Determine the child socket label for a connection
4475  * @sk_sid: the parent socket's SID
4476  * @skb_sid: the packet's SID
4477  * @conn_sid: the resulting connection SID
4478  *
4479  * If @skb_sid is valid then the user:role:type information from @sk_sid is
4480  * combined with the MLS information from @skb_sid in order to create
4481  * @conn_sid.  If @skb_sid is not valid then then @conn_sid is simply a copy
4482  * of @sk_sid.  Returns zero on success, negative values on failure.
4483  *
4484  */
4485 static int selinux_conn_sid(u32 sk_sid, u32 skb_sid, u32 *conn_sid)
4486 {
4487         int err = 0;
4488
4489         if (skb_sid != SECSID_NULL)
4490                 err = security_sid_mls_copy(&selinux_state, sk_sid, skb_sid,
4491                                             conn_sid);
4492         else
4493                 *conn_sid = sk_sid;
4494
4495         return err;
4496 }
4497
4498 /* socket security operations */
4499
4500 static int socket_sockcreate_sid(const struct task_security_struct *tsec,
4501                                  u16 secclass, u32 *socksid)
4502 {
4503         if (tsec->sockcreate_sid > SECSID_NULL) {
4504                 *socksid = tsec->sockcreate_sid;
4505                 return 0;
4506         }
4507
4508         return security_transition_sid(&selinux_state, tsec->sid, tsec->sid,
4509                                        secclass, NULL, socksid);
4510 }
4511
4512 static int sock_has_perm(struct sock *sk, u32 perms)
4513 {
4514         struct sk_security_struct *sksec = sk->sk_security;
4515         struct common_audit_data ad;
4516         struct lsm_network_audit net = {0,};
4517
4518         if (sksec->sid == SECINITSID_KERNEL)
4519                 return 0;
4520
4521         ad.type = LSM_AUDIT_DATA_NET;
4522         ad.u.net = &net;
4523         ad.u.net->sk = sk;
4524
4525         return avc_has_perm(&selinux_state,
4526                             current_sid(), sksec->sid, sksec->sclass, perms,
4527                             &ad);
4528 }
4529
4530 static int selinux_socket_create(int family, int type,
4531                                  int protocol, int kern)
4532 {
4533         const struct task_security_struct *tsec = current_security();
4534         u32 newsid;
4535         u16 secclass;
4536         int rc;
4537
4538         if (kern)
4539                 return 0;
4540
4541         secclass = socket_type_to_security_class(family, type, protocol);
4542         rc = socket_sockcreate_sid(tsec, secclass, &newsid);
4543         if (rc)
4544                 return rc;
4545
4546         return avc_has_perm(&selinux_state,
4547                             tsec->sid, newsid, secclass, SOCKET__CREATE, NULL);
4548 }
4549
4550 static int selinux_socket_post_create(struct socket *sock, int family,
4551                                       int type, int protocol, int kern)
4552 {
4553         const struct task_security_struct *tsec = current_security();
4554         struct inode_security_struct *isec = inode_security_novalidate(SOCK_INODE(sock));
4555         struct sk_security_struct *sksec;
4556         u16 sclass = socket_type_to_security_class(family, type, protocol);
4557         u32 sid = SECINITSID_KERNEL;
4558         int err = 0;
4559
4560         if (!kern) {
4561                 err = socket_sockcreate_sid(tsec, sclass, &sid);
4562                 if (err)
4563                         return err;
4564         }
4565
4566         isec->sclass = sclass;
4567         isec->sid = sid;
4568         isec->initialized = LABEL_INITIALIZED;
4569
4570         if (sock->sk) {
4571                 sksec = sock->sk->sk_security;
4572                 sksec->sclass = sclass;
4573                 sksec->sid = sid;
4574                 /* Allows detection of the first association on this socket */
4575                 if (sksec->sclass == SECCLASS_SCTP_SOCKET)
4576                         sksec->sctp_assoc_state = SCTP_ASSOC_UNSET;
4577
4578                 err = selinux_netlbl_socket_post_create(sock->sk, family);
4579         }
4580
4581         return err;
4582 }
4583
4584 /* Range of port numbers used to automatically bind.
4585    Need to determine whether we should perform a name_bind
4586    permission check between the socket and the port number. */
4587
4588 static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, int addrlen)
4589 {
4590         struct sock *sk = sock->sk;
4591         struct sk_security_struct *sksec = sk->sk_security;
4592         u16 family;
4593         int err;
4594
4595         err = sock_has_perm(sk, SOCKET__BIND);
4596         if (err)
4597                 goto out;
4598
4599         /* If PF_INET or PF_INET6, check name_bind permission for the port. */
4600         family = sk->sk_family;
4601         if (family == PF_INET || family == PF_INET6) {
4602                 char *addrp;
4603                 struct common_audit_data ad;
4604                 struct lsm_network_audit net = {0,};
4605                 struct sockaddr_in *addr4 = NULL;
4606                 struct sockaddr_in6 *addr6 = NULL;
4607                 u16 family_sa = address->sa_family;
4608                 unsigned short snum;
4609                 u32 sid, node_perm;
4610
4611                 /*
4612                  * sctp_bindx(3) calls via selinux_sctp_bind_connect()
4613                  * that validates multiple binding addresses. Because of this
4614                  * need to check address->sa_family as it is possible to have
4615                  * sk->sk_family = PF_INET6 with addr->sa_family = AF_INET.
4616                  */
4617                 switch (family_sa) {
4618                 case AF_UNSPEC:
4619                 case AF_INET:
4620                         if (addrlen < sizeof(struct sockaddr_in))
4621                                 return -EINVAL;
4622                         addr4 = (struct sockaddr_in *)address;
4623                         if (family_sa == AF_UNSPEC) {
4624                                 /* see __inet_bind(), we only want to allow
4625                                  * AF_UNSPEC if the address is INADDR_ANY
4626                                  */
4627                                 if (addr4->sin_addr.s_addr != htonl(INADDR_ANY))
4628                                         goto err_af;
4629                                 family_sa = AF_INET;
4630                         }
4631                         snum = ntohs(addr4->sin_port);
4632                         addrp = (char *)&addr4->sin_addr.s_addr;
4633                         break;
4634                 case AF_INET6:
4635                         if (addrlen < SIN6_LEN_RFC2133)
4636                                 return -EINVAL;
4637                         addr6 = (struct sockaddr_in6 *)address;
4638                         snum = ntohs(addr6->sin6_port);
4639                         addrp = (char *)&addr6->sin6_addr.s6_addr;
4640                         break;
4641                 default:
4642                         goto err_af;
4643                 }
4644
4645                 ad.type = LSM_AUDIT_DATA_NET;
4646                 ad.u.net = &net;
4647                 ad.u.net->sport = htons(snum);
4648                 ad.u.net->family = family_sa;
4649
4650                 if (snum) {
4651                         int low, high;
4652
4653                         inet_get_local_port_range(sock_net(sk), &low, &high);
4654
4655                         if (snum < max(inet_prot_sock(sock_net(sk)), low) ||
4656                             snum > high) {
4657                                 err = sel_netport_sid(sk->sk_protocol,
4658                                                       snum, &sid);
4659                                 if (err)
4660                                         goto out;
4661                                 err = avc_has_perm(&selinux_state,
4662                                                    sksec->sid, sid,
4663                                                    sksec->sclass,
4664                                                    SOCKET__NAME_BIND, &ad);
4665                                 if (err)
4666                                         goto out;
4667                         }
4668                 }
4669
4670                 switch (sksec->sclass) {
4671                 case SECCLASS_TCP_SOCKET:
4672                         node_perm = TCP_SOCKET__NODE_BIND;
4673                         break;
4674
4675                 case SECCLASS_UDP_SOCKET:
4676                         node_perm = UDP_SOCKET__NODE_BIND;
4677                         break;
4678
4679                 case SECCLASS_DCCP_SOCKET:
4680                         node_perm = DCCP_SOCKET__NODE_BIND;
4681                         break;
4682
4683                 case SECCLASS_SCTP_SOCKET:
4684                         node_perm = SCTP_SOCKET__NODE_BIND;
4685                         break;
4686
4687                 default:
4688                         node_perm = RAWIP_SOCKET__NODE_BIND;
4689                         break;
4690                 }
4691
4692                 err = sel_netnode_sid(addrp, family_sa, &sid);
4693                 if (err)
4694                         goto out;
4695
4696                 if (family_sa == AF_INET)
4697                         ad.u.net->v4info.saddr = addr4->sin_addr.s_addr;
4698                 else
4699                         ad.u.net->v6info.saddr = addr6->sin6_addr;
4700
4701                 err = avc_has_perm(&selinux_state,
4702                                    sksec->sid, sid,
4703                                    sksec->sclass, node_perm, &ad);
4704                 if (err)
4705                         goto out;
4706         }
4707 out:
4708         return err;
4709 err_af:
4710         /* Note that SCTP services expect -EINVAL, others -EAFNOSUPPORT. */
4711         if (sksec->sclass == SECCLASS_SCTP_SOCKET)
4712                 return -EINVAL;
4713         return -EAFNOSUPPORT;
4714 }
4715
4716 /* This supports connect(2) and SCTP connect services such as sctp_connectx(3)
4717  * and sctp_sendmsg(3) as described in Documentation/security/LSM-sctp.txt
4718  */
4719 static int selinux_socket_connect_helper(struct socket *sock,
4720                                          struct sockaddr *address, int addrlen)
4721 {
4722         struct sock *sk = sock->sk;
4723         struct sk_security_struct *sksec = sk->sk_security;
4724         int err;
4725
4726         err = sock_has_perm(sk, SOCKET__CONNECT);
4727         if (err)
4728                 return err;
4729
4730         /*
4731          * If a TCP, DCCP or SCTP socket, check name_connect permission
4732          * for the port.
4733          */
4734         if (sksec->sclass == SECCLASS_TCP_SOCKET ||
4735             sksec->sclass == SECCLASS_DCCP_SOCKET ||
4736             sksec->sclass == SECCLASS_SCTP_SOCKET) {
4737                 struct common_audit_data ad;
4738                 struct lsm_network_audit net = {0,};
4739                 struct sockaddr_in *addr4 = NULL;
4740                 struct sockaddr_in6 *addr6 = NULL;
4741                 unsigned short snum;
4742                 u32 sid, perm;
4743
4744                 /* sctp_connectx(3) calls via selinux_sctp_bind_connect()
4745                  * that validates multiple connect addresses. Because of this
4746                  * need to check address->sa_family as it is possible to have
4747                  * sk->sk_family = PF_INET6 with addr->sa_family = AF_INET.
4748                  */
4749                 switch (address->sa_family) {
4750                 case AF_INET:
4751                         addr4 = (struct sockaddr_in *)address;
4752                         if (addrlen < sizeof(struct sockaddr_in))
4753                                 return -EINVAL;
4754                         snum = ntohs(addr4->sin_port);
4755                         break;
4756                 case AF_INET6:
4757                         addr6 = (struct sockaddr_in6 *)address;
4758                         if (addrlen < SIN6_LEN_RFC2133)
4759                                 return -EINVAL;
4760                         snum = ntohs(addr6->sin6_port);
4761                         break;
4762                 default:
4763                         /* Note that SCTP services expect -EINVAL, whereas
4764                          * others expect -EAFNOSUPPORT.
4765                          */
4766                         if (sksec->sclass == SECCLASS_SCTP_SOCKET)
4767                                 return -EINVAL;
4768                         else
4769                                 return -EAFNOSUPPORT;
4770                 }
4771
4772                 err = sel_netport_sid(sk->sk_protocol, snum, &sid);
4773                 if (err)
4774                         return err;
4775
4776                 switch (sksec->sclass) {
4777                 case SECCLASS_TCP_SOCKET:
4778                         perm = TCP_SOCKET__NAME_CONNECT;
4779                         break;
4780                 case SECCLASS_DCCP_SOCKET:
4781                         perm = DCCP_SOCKET__NAME_CONNECT;
4782                         break;
4783                 case SECCLASS_SCTP_SOCKET:
4784                         perm = SCTP_SOCKET__NAME_CONNECT;
4785                         break;
4786                 }
4787
4788                 ad.type = LSM_AUDIT_DATA_NET;
4789                 ad.u.net = &net;
4790                 ad.u.net->dport = htons(snum);
4791                 ad.u.net->family = address->sa_family;
4792                 err = avc_has_perm(&selinux_state,
4793                                    sksec->sid, sid, sksec->sclass, perm, &ad);
4794                 if (err)
4795                         return err;
4796         }
4797
4798         return 0;
4799 }
4800
4801 /* Supports connect(2), see comments in selinux_socket_connect_helper() */
4802 static int selinux_socket_connect(struct socket *sock,
4803                                   struct sockaddr *address, int addrlen)
4804 {
4805         int err;
4806         struct sock *sk = sock->sk;
4807
4808         err = selinux_socket_connect_helper(sock, address, addrlen);
4809         if (err)
4810                 return err;
4811
4812         return selinux_netlbl_socket_connect(sk, address);
4813 }
4814
4815 static int selinux_socket_listen(struct socket *sock, int backlog)
4816 {
4817         return sock_has_perm(sock->sk, SOCKET__LISTEN);
4818 }
4819
4820 static int selinux_socket_accept(struct socket *sock, struct socket *newsock)
4821 {
4822         int err;
4823         struct inode_security_struct *isec;
4824         struct inode_security_struct *newisec;
4825         u16 sclass;
4826         u32 sid;
4827
4828         err = sock_has_perm(sock->sk, SOCKET__ACCEPT);
4829         if (err)
4830                 return err;
4831
4832         isec = inode_security_novalidate(SOCK_INODE(sock));
4833         spin_lock(&isec->lock);
4834         sclass = isec->sclass;
4835         sid = isec->sid;
4836         spin_unlock(&isec->lock);
4837
4838         newisec = inode_security_novalidate(SOCK_INODE(newsock));
4839         newisec->sclass = sclass;
4840         newisec->sid = sid;
4841         newisec->initialized = LABEL_INITIALIZED;
4842
4843         return 0;
4844 }
4845
4846 static int selinux_socket_sendmsg(struct socket *sock, struct msghdr *msg,
4847                                   int size)
4848 {
4849         return sock_has_perm(sock->sk, SOCKET__WRITE);
4850 }
4851
4852 static int selinux_socket_recvmsg(struct socket *sock, struct msghdr *msg,
4853                                   int size, int flags)
4854 {
4855         return sock_has_perm(sock->sk, SOCKET__READ);
4856 }
4857
4858 static int selinux_socket_getsockname(struct socket *sock)
4859 {
4860         return sock_has_perm(sock->sk, SOCKET__GETATTR);
4861 }
4862
4863 static int selinux_socket_getpeername(struct socket *sock)
4864 {
4865         return sock_has_perm(sock->sk, SOCKET__GETATTR);
4866 }
4867
4868 static int selinux_socket_setsockopt(struct socket *sock, int level, int optname)
4869 {
4870         int err;
4871
4872         err = sock_has_perm(sock->sk, SOCKET__SETOPT);
4873         if (err)
4874                 return err;
4875
4876         return selinux_netlbl_socket_setsockopt(sock, level, optname);
4877 }
4878
4879 static int selinux_socket_getsockopt(struct socket *sock, int level,
4880                                      int optname)
4881 {
4882         return sock_has_perm(sock->sk, SOCKET__GETOPT);
4883 }
4884
4885 static int selinux_socket_shutdown(struct socket *sock, int how)
4886 {
4887         return sock_has_perm(sock->sk, SOCKET__SHUTDOWN);
4888 }
4889
4890 static int selinux_socket_unix_stream_connect(struct sock *sock,
4891                                               struct sock *other,
4892                                               struct sock *newsk)
4893 {
4894         struct sk_security_struct *sksec_sock = sock->sk_security;
4895         struct sk_security_struct *sksec_other = other->sk_security;
4896         struct sk_security_struct *sksec_new = newsk->sk_security;
4897         struct common_audit_data ad;
4898         struct lsm_network_audit net = {0,};
4899         int err;
4900
4901         ad.type = LSM_AUDIT_DATA_NET;
4902         ad.u.net = &net;
4903         ad.u.net->sk = other;
4904
4905         err = avc_has_perm(&selinux_state,
4906                            sksec_sock->sid, sksec_other->sid,
4907                            sksec_other->sclass,
4908                            UNIX_STREAM_SOCKET__CONNECTTO, &ad);
4909         if (err)
4910                 return err;
4911
4912         /* server child socket */
4913         sksec_new->peer_sid = sksec_sock->sid;
4914         err = security_sid_mls_copy(&selinux_state, sksec_other->sid,
4915                                     sksec_sock->sid, &sksec_new->sid);
4916         if (err)
4917                 return err;
4918
4919         /* connecting socket */
4920         sksec_sock->peer_sid = sksec_new->sid;
4921
4922         return 0;
4923 }
4924
4925 static int selinux_socket_unix_may_send(struct socket *sock,
4926                                         struct socket *other)
4927 {
4928         struct sk_security_struct *ssec = sock->sk->sk_security;
4929         struct sk_security_struct *osec = other->sk->sk_security;
4930         struct common_audit_data ad;
4931         struct lsm_network_audit net = {0,};
4932
4933         ad.type = LSM_AUDIT_DATA_NET;
4934         ad.u.net = &net;
4935         ad.u.net->sk = other->sk;
4936
4937         return avc_has_perm(&selinux_state,
4938                             ssec->sid, osec->sid, osec->sclass, SOCKET__SENDTO,
4939                             &ad);
4940 }
4941
4942 static int selinux_inet_sys_rcv_skb(struct net *ns, int ifindex,
4943                                     char *addrp, u16 family, u32 peer_sid,
4944                                     struct common_audit_data *ad)
4945 {
4946         int err;
4947         u32 if_sid;
4948         u32 node_sid;
4949
4950         err = sel_netif_sid(ns, ifindex, &if_sid);
4951         if (err)
4952                 return err;
4953         err = avc_has_perm(&selinux_state,
4954                            peer_sid, if_sid,
4955                            SECCLASS_NETIF, NETIF__INGRESS, ad);
4956         if (err)
4957                 return err;
4958
4959         err = sel_netnode_sid(addrp, family, &node_sid);
4960         if (err)
4961                 return err;
4962         return avc_has_perm(&selinux_state,
4963                             peer_sid, node_sid,
4964                             SECCLASS_NODE, NODE__RECVFROM, ad);
4965 }
4966
4967 static int selinux_sock_rcv_skb_compat(struct sock *sk, struct sk_buff *skb,
4968                                        u16 family)
4969 {
4970         int err = 0;
4971         struct sk_security_struct *sksec = sk->sk_security;
4972         u32 sk_sid = sksec->sid;
4973         struct common_audit_data ad;
4974         struct lsm_network_audit net = {0,};
4975         char *addrp;
4976
4977         ad.type = LSM_AUDIT_DATA_NET;
4978         ad.u.net = &net;
4979         ad.u.net->netif = skb->skb_iif;
4980         ad.u.net->family = family;
4981         err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
4982         if (err)
4983                 return err;
4984
4985         if (selinux_secmark_enabled()) {
4986                 err = avc_has_perm(&selinux_state,
4987                                    sk_sid, skb->secmark, SECCLASS_PACKET,
4988                                    PACKET__RECV, &ad);
4989                 if (err)
4990                         return err;
4991         }
4992
4993         err = selinux_netlbl_sock_rcv_skb(sksec, skb, family, &ad);
4994         if (err)
4995                 return err;
4996         err = selinux_xfrm_sock_rcv_skb(sksec->sid, skb, &ad);
4997
4998         return err;
4999 }
5000
5001 static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
5002 {
5003         int err;
5004         struct sk_security_struct *sksec = sk->sk_security;
5005         u16 family = sk->sk_family;
5006         u32 sk_sid = sksec->sid;
5007         struct common_audit_data ad;
5008         struct lsm_network_audit net = {0,};
5009         char *addrp;
5010         u8 secmark_active;
5011         u8 peerlbl_active;
5012
5013         if (family != PF_INET && family != PF_INET6)
5014                 return 0;
5015
5016         /* Handle mapped IPv4 packets arriving via IPv6 sockets */
5017         if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
5018                 family = PF_INET;
5019
5020         /* If any sort of compatibility mode is enabled then handoff processing
5021          * to the selinux_sock_rcv_skb_compat() function to deal with the
5022          * special handling.  We do this in an attempt to keep this function
5023          * as fast and as clean as possible. */
5024         if (!selinux_policycap_netpeer())
5025                 return selinux_sock_rcv_skb_compat(sk, skb, family);
5026
5027         secmark_active = selinux_secmark_enabled();
5028         peerlbl_active = selinux_peerlbl_enabled();
5029         if (!secmark_active && !peerlbl_active)
5030                 return 0;
5031
5032         ad.type = LSM_AUDIT_DATA_NET;
5033         ad.u.net = &net;
5034         ad.u.net->netif = skb->skb_iif;
5035         ad.u.net->family = family;
5036         err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
5037         if (err)
5038                 return err;
5039
5040         if (peerlbl_active) {
5041                 u32 peer_sid;
5042
5043                 err = selinux_skb_peerlbl_sid(skb, family, &peer_sid);
5044                 if (err)
5045                         return err;
5046                 err = selinux_inet_sys_rcv_skb(sock_net(sk), skb->skb_iif,
5047                                                addrp, family, peer_sid, &ad);
5048                 if (err) {
5049                         selinux_netlbl_err(skb, family, err, 0);
5050                         return err;
5051                 }
5052                 err = avc_has_perm(&selinux_state,
5053                                    sk_sid, peer_sid, SECCLASS_PEER,
5054                                    PEER__RECV, &ad);
5055                 if (err) {
5056                         selinux_netlbl_err(skb, family, err, 0);
5057                         return err;
5058                 }
5059         }
5060
5061         if (secmark_active) {
5062                 err = avc_has_perm(&selinux_state,
5063                                    sk_sid, skb->secmark, SECCLASS_PACKET,
5064                                    PACKET__RECV, &ad);
5065                 if (err)
5066                         return err;
5067         }
5068
5069         return err;
5070 }
5071
5072 static int selinux_socket_getpeersec_stream(struct socket *sock, char __user *optval,
5073                                             int __user *optlen, unsigned len)
5074 {
5075         int err = 0;
5076         char *scontext;
5077         u32 scontext_len;
5078         struct sk_security_struct *sksec = sock->sk->sk_security;
5079         u32 peer_sid = SECSID_NULL;
5080
5081         if (sksec->sclass == SECCLASS_UNIX_STREAM_SOCKET ||
5082             sksec->sclass == SECCLASS_TCP_SOCKET ||
5083             sksec->sclass == SECCLASS_SCTP_SOCKET)
5084                 peer_sid = sksec->peer_sid;
5085         if (peer_sid == SECSID_NULL)
5086                 return -ENOPROTOOPT;
5087
5088         err = security_sid_to_context(&selinux_state, peer_sid, &scontext,
5089                                       &scontext_len);
5090         if (err)
5091                 return err;
5092
5093         if (scontext_len > len) {
5094                 err = -ERANGE;
5095                 goto out_len;
5096         }
5097
5098         if (copy_to_user(optval, scontext, scontext_len))
5099                 err = -EFAULT;
5100
5101 out_len:
5102         if (put_user(scontext_len, optlen))
5103                 err = -EFAULT;
5104         kfree(scontext);
5105         return err;
5106 }
5107
5108 static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid)
5109 {
5110         u32 peer_secid = SECSID_NULL;
5111         u16 family;
5112         struct inode_security_struct *isec;
5113
5114         if (skb && skb->protocol == htons(ETH_P_IP))
5115                 family = PF_INET;
5116         else if (skb && skb->protocol == htons(ETH_P_IPV6))
5117                 family = PF_INET6;
5118         else if (sock)
5119                 family = sock->sk->sk_family;
5120         else
5121                 goto out;
5122
5123         if (sock && family == PF_UNIX) {
5124                 isec = inode_security_novalidate(SOCK_INODE(sock));
5125                 peer_secid = isec->sid;
5126         } else if (skb)
5127                 selinux_skb_peerlbl_sid(skb, family, &peer_secid);
5128
5129 out:
5130         *secid = peer_secid;
5131         if (peer_secid == SECSID_NULL)
5132                 return -EINVAL;
5133         return 0;
5134 }
5135
5136 static int selinux_sk_alloc_security(struct sock *sk, int family, gfp_t priority)
5137 {
5138         struct sk_security_struct *sksec;
5139
5140         sksec = kzalloc(sizeof(*sksec), priority);
5141         if (!sksec)
5142                 return -ENOMEM;
5143
5144         sksec->peer_sid = SECINITSID_UNLABELED;
5145         sksec->sid = SECINITSID_UNLABELED;
5146         sksec->sclass = SECCLASS_SOCKET;
5147         selinux_netlbl_sk_security_reset(sksec);
5148         sk->sk_security = sksec;
5149
5150         return 0;
5151 }
5152
5153 static void selinux_sk_free_security(struct sock *sk)
5154 {
5155         struct sk_security_struct *sksec = sk->sk_security;
5156
5157         sk->sk_security = NULL;
5158         selinux_netlbl_sk_security_free(sksec);
5159         kfree(sksec);
5160 }
5161
5162 static void selinux_sk_clone_security(const struct sock *sk, struct sock *newsk)
5163 {
5164         struct sk_security_struct *sksec = sk->sk_security;
5165         struct sk_security_struct *newsksec = newsk->sk_security;
5166
5167         newsksec->sid = sksec->sid;
5168         newsksec->peer_sid = sksec->peer_sid;
5169         newsksec->sclass = sksec->sclass;
5170
5171         selinux_netlbl_sk_security_reset(newsksec);
5172 }
5173
5174 static void selinux_sk_getsecid(struct sock *sk, u32 *secid)
5175 {
5176         if (!sk)
5177                 *secid = SECINITSID_ANY_SOCKET;
5178         else {
5179                 struct sk_security_struct *sksec = sk->sk_security;
5180
5181                 *secid = sksec->sid;
5182         }
5183 }
5184
5185 static void selinux_sock_graft(struct sock *sk, struct socket *parent)
5186 {
5187         struct inode_security_struct *isec =
5188                 inode_security_novalidate(SOCK_INODE(parent));
5189         struct sk_security_struct *sksec = sk->sk_security;
5190
5191         if (sk->sk_family == PF_INET || sk->sk_family == PF_INET6 ||
5192             sk->sk_family == PF_UNIX)
5193                 isec->sid = sksec->sid;
5194         sksec->sclass = isec->sclass;
5195 }
5196
5197 /* Called whenever SCTP receives an INIT chunk. This happens when an incoming
5198  * connect(2), sctp_connectx(3) or sctp_sendmsg(3) (with no association
5199  * already present).
5200  */
5201 static int selinux_sctp_assoc_request(struct sctp_endpoint *ep,
5202                                       struct sk_buff *skb)
5203 {
5204         struct sk_security_struct *sksec = ep->base.sk->sk_security;
5205         struct common_audit_data ad;
5206         struct lsm_network_audit net = {0,};
5207         u8 peerlbl_active;
5208         u32 peer_sid = SECINITSID_UNLABELED;
5209         u32 conn_sid;
5210         int err = 0;
5211
5212         if (!selinux_policycap_extsockclass())
5213                 return 0;
5214
5215         peerlbl_active = selinux_peerlbl_enabled();
5216
5217         if (peerlbl_active) {
5218                 /* This will return peer_sid = SECSID_NULL if there are
5219                  * no peer labels, see security_net_peersid_resolve().
5220                  */
5221                 err = selinux_skb_peerlbl_sid(skb, ep->base.sk->sk_family,
5222                                               &peer_sid);
5223                 if (err)
5224                         return err;
5225
5226                 if (peer_sid == SECSID_NULL)
5227                         peer_sid = SECINITSID_UNLABELED;
5228         }
5229
5230         if (sksec->sctp_assoc_state == SCTP_ASSOC_UNSET) {
5231                 sksec->sctp_assoc_state = SCTP_ASSOC_SET;
5232
5233                 /* Here as first association on socket. As the peer SID
5234                  * was allowed by peer recv (and the netif/node checks),
5235                  * then it is approved by policy and used as the primary
5236                  * peer SID for getpeercon(3).
5237                  */
5238                 sksec->peer_sid = peer_sid;
5239         } else if  (sksec->peer_sid != peer_sid) {
5240                 /* Other association peer SIDs are checked to enforce
5241                  * consistency among the peer SIDs.
5242                  */
5243                 ad.type = LSM_AUDIT_DATA_NET;
5244                 ad.u.net = &net;
5245                 ad.u.net->sk = ep->base.sk;
5246                 err = avc_has_perm(&selinux_state,
5247                                    sksec->peer_sid, peer_sid, sksec->sclass,
5248                                    SCTP_SOCKET__ASSOCIATION, &ad);
5249                 if (err)
5250                         return err;
5251         }
5252
5253         /* Compute the MLS component for the connection and store
5254          * the information in ep. This will be used by SCTP TCP type
5255          * sockets and peeled off connections as they cause a new
5256          * socket to be generated. selinux_sctp_sk_clone() will then
5257          * plug this into the new socket.
5258          */
5259         err = selinux_conn_sid(sksec->sid, peer_sid, &conn_sid);
5260         if (err)
5261                 return err;
5262
5263         ep->secid = conn_sid;
5264         ep->peer_secid = peer_sid;
5265
5266         /* Set any NetLabel labels including CIPSO/CALIPSO options. */
5267         return selinux_netlbl_sctp_assoc_request(ep, skb);
5268 }
5269
5270 /* Check if sctp IPv4/IPv6 addresses are valid for binding or connecting
5271  * based on their @optname.
5272  */
5273 static int selinux_sctp_bind_connect(struct sock *sk, int optname,
5274                                      struct sockaddr *address,
5275                                      int addrlen)
5276 {
5277         int len, err = 0, walk_size = 0;
5278         void *addr_buf;
5279         struct sockaddr *addr;
5280         struct socket *sock;
5281
5282         if (!selinux_policycap_extsockclass())
5283                 return 0;
5284
5285         /* Process one or more addresses that may be IPv4 or IPv6 */
5286         sock = sk->sk_socket;
5287         addr_buf = address;
5288
5289         while (walk_size < addrlen) {
5290                 addr = addr_buf;
5291                 switch (addr->sa_family) {
5292                 case AF_UNSPEC:
5293                 case AF_INET:
5294                         len = sizeof(struct sockaddr_in);
5295                         break;
5296                 case AF_INET6:
5297                         len = sizeof(struct sockaddr_in6);
5298                         break;
5299                 default:
5300                         return -EINVAL;
5301                 }
5302
5303                 err = -EINVAL;
5304                 switch (optname) {
5305                 /* Bind checks */
5306                 case SCTP_PRIMARY_ADDR:
5307                 case SCTP_SET_PEER_PRIMARY_ADDR:
5308                 case SCTP_SOCKOPT_BINDX_ADD:
5309                         err = selinux_socket_bind(sock, addr, len);
5310                         break;
5311                 /* Connect checks */
5312                 case SCTP_SOCKOPT_CONNECTX:
5313                 case SCTP_PARAM_SET_PRIMARY:
5314                 case SCTP_PARAM_ADD_IP:
5315                 case SCTP_SENDMSG_CONNECT:
5316                         err = selinux_socket_connect_helper(sock, addr, len);
5317                         if (err)
5318                                 return err;
5319
5320                         /* As selinux_sctp_bind_connect() is called by the
5321                          * SCTP protocol layer, the socket is already locked,
5322                          * therefore selinux_netlbl_socket_connect_locked() is
5323                          * is called here. The situations handled are:
5324                          * sctp_connectx(3), sctp_sendmsg(3), sendmsg(2),
5325                          * whenever a new IP address is added or when a new
5326                          * primary address is selected.
5327                          * Note that an SCTP connect(2) call happens before
5328                          * the SCTP protocol layer and is handled via
5329                          * selinux_socket_connect().
5330                          */
5331                         err = selinux_netlbl_socket_connect_locked(sk, addr);
5332                         break;
5333                 }
5334
5335                 if (err)
5336                         return err;
5337
5338                 addr_buf += len;
5339                 walk_size += len;
5340         }
5341
5342         return 0;
5343 }
5344
5345 /* Called whenever a new socket is created by accept(2) or sctp_peeloff(3). */
5346 static void selinux_sctp_sk_clone(struct sctp_endpoint *ep, struct sock *sk,
5347                                   struct sock *newsk)
5348 {
5349         struct sk_security_struct *sksec = sk->sk_security;
5350         struct sk_security_struct *newsksec = newsk->sk_security;
5351
5352         /* If policy does not support SECCLASS_SCTP_SOCKET then call
5353          * the non-sctp clone version.
5354          */
5355         if (!selinux_policycap_extsockclass())
5356                 return selinux_sk_clone_security(sk, newsk);
5357
5358         newsksec->sid = ep->secid;
5359         newsksec->peer_sid = ep->peer_secid;
5360         newsksec->sclass = sksec->sclass;
5361         selinux_netlbl_sctp_sk_clone(sk, newsk);
5362 }
5363
5364 static int selinux_inet_conn_request(struct sock *sk, struct sk_buff *skb,
5365                                      struct request_sock *req)
5366 {
5367         struct sk_security_struct *sksec = sk->sk_security;
5368         int err;
5369         u16 family = req->rsk_ops->family;
5370         u32 connsid;
5371         u32 peersid;
5372
5373         err = selinux_skb_peerlbl_sid(skb, family, &peersid);
5374         if (err)
5375                 return err;
5376         err = selinux_conn_sid(sksec->sid, peersid, &connsid);
5377         if (err)
5378                 return err;
5379         req->secid = connsid;
5380         req->peer_secid = peersid;
5381
5382         return selinux_netlbl_inet_conn_request(req, family);
5383 }
5384
5385 static void selinux_inet_csk_clone(struct sock *newsk,
5386                                    const struct request_sock *req)
5387 {
5388         struct sk_security_struct *newsksec = newsk->sk_security;
5389
5390         newsksec->sid = req->secid;
5391         newsksec->peer_sid = req->peer_secid;
5392         /* NOTE: Ideally, we should also get the isec->sid for the
5393            new socket in sync, but we don't have the isec available yet.
5394            So we will wait until sock_graft to do it, by which
5395            time it will have been created and available. */
5396
5397         /* We don't need to take any sort of lock here as we are the only
5398          * thread with access to newsksec */
5399         selinux_netlbl_inet_csk_clone(newsk, req->rsk_ops->family);
5400 }
5401
5402 static void selinux_inet_conn_established(struct sock *sk, struct sk_buff *skb)
5403 {
5404         u16 family = sk->sk_family;
5405         struct sk_security_struct *sksec = sk->sk_security;
5406
5407         /* handle mapped IPv4 packets arriving via IPv6 sockets */
5408         if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP))
5409                 family = PF_INET;
5410
5411         selinux_skb_peerlbl_sid(skb, family, &sksec->peer_sid);
5412 }
5413
5414 static int selinux_secmark_relabel_packet(u32 sid)
5415 {
5416         const struct task_security_struct *__tsec;
5417         u32 tsid;
5418
5419         __tsec = current_security();
5420         tsid = __tsec->sid;
5421
5422         return avc_has_perm(&selinux_state,
5423                             tsid, sid, SECCLASS_PACKET, PACKET__RELABELTO,
5424                             NULL);
5425 }
5426
5427 static void selinux_secmark_refcount_inc(void)
5428 {
5429         atomic_inc(&selinux_secmark_refcount);
5430 }
5431
5432 static void selinux_secmark_refcount_dec(void)
5433 {
5434         atomic_dec(&selinux_secmark_refcount);
5435 }
5436
5437 static void selinux_req_classify_flow(const struct request_sock *req,
5438                                       struct flowi *fl)
5439 {
5440         fl->flowi_secid = req->secid;
5441 }
5442
5443 static int selinux_tun_dev_alloc_security(void **security)
5444 {
5445         struct tun_security_struct *tunsec;
5446
5447         tunsec = kzalloc(sizeof(*tunsec), GFP_KERNEL);
5448         if (!tunsec)
5449                 return -ENOMEM;
5450         tunsec->sid = current_sid();
5451
5452         *security = tunsec;
5453         return 0;
5454 }
5455
5456 static void selinux_tun_dev_free_security(void *security)
5457 {
5458         kfree(security);
5459 }
5460
5461 static int selinux_tun_dev_create(void)
5462 {
5463         u32 sid = current_sid();
5464
5465         /* we aren't taking into account the "sockcreate" SID since the socket
5466          * that is being created here is not a socket in the traditional sense,
5467          * instead it is a private sock, accessible only to the kernel, and
5468          * representing a wide range of network traffic spanning multiple
5469          * connections unlike traditional sockets - check the TUN driver to
5470          * get a better understanding of why this socket is special */
5471
5472         return avc_has_perm(&selinux_state,
5473                             sid, sid, SECCLASS_TUN_SOCKET, TUN_SOCKET__CREATE,
5474                             NULL);
5475 }
5476
5477 static int selinux_tun_dev_attach_queue(void *security)
5478 {
5479         struct tun_security_struct *tunsec = security;
5480
5481         return avc_has_perm(&selinux_state,
5482                             current_sid(), tunsec->sid, SECCLASS_TUN_SOCKET,
5483                             TUN_SOCKET__ATTACH_QUEUE, NULL);
5484 }
5485
5486 static int selinux_tun_dev_attach(struct sock *sk, void *security)
5487 {
5488         struct tun_security_struct *tunsec = security;
5489         struct sk_security_struct *sksec = sk->sk_security;
5490
5491         /* we don't currently perform any NetLabel based labeling here and it
5492          * isn't clear that we would want to do so anyway; while we could apply
5493          * labeling without the support of the TUN user the resulting labeled
5494          * traffic from the other end of the connection would almost certainly
5495          * cause confusion to the TUN user that had no idea network labeling
5496          * protocols were being used */
5497
5498         sksec->sid = tunsec->sid;
5499         sksec->sclass = SECCLASS_TUN_SOCKET;
5500
5501         return 0;
5502 }
5503
5504 static int selinux_tun_dev_open(void *security)
5505 {
5506         struct tun_security_struct *tunsec = security;
5507         u32 sid = current_sid();
5508         int err;
5509
5510         err = avc_has_perm(&selinux_state,
5511                            sid, tunsec->sid, SECCLASS_TUN_SOCKET,
5512                            TUN_SOCKET__RELABELFROM, NULL);
5513         if (err)
5514                 return err;
5515         err = avc_has_perm(&selinux_state,
5516                            sid, sid, SECCLASS_TUN_SOCKET,
5517                            TUN_SOCKET__RELABELTO, NULL);
5518         if (err)
5519                 return err;
5520         tunsec->sid = sid;
5521
5522         return 0;
5523 }
5524
5525 static int selinux_nlmsg_perm(struct sock *sk, struct sk_buff *skb)
5526 {
5527         int err = 0;
5528         u32 perm;
5529         struct nlmsghdr *nlh;
5530         struct sk_security_struct *sksec = sk->sk_security;
5531
5532         if (skb->len < NLMSG_HDRLEN) {
5533                 err = -EINVAL;
5534                 goto out;
5535         }
5536         nlh = nlmsg_hdr(skb);
5537
5538         err = selinux_nlmsg_lookup(sksec->sclass, nlh->nlmsg_type, &perm);
5539         if (err) {
5540                 if (err == -EINVAL) {
5541                         pr_warn_ratelimited("SELinux: unrecognized netlink"
5542                                " message: protocol=%hu nlmsg_type=%hu sclass=%s"
5543                                " pig=%d comm=%s\n",
5544                                sk->sk_protocol, nlh->nlmsg_type,
5545                                secclass_map[sksec->sclass - 1].name,
5546                                task_pid_nr(current), current->comm);
5547                         if (!enforcing_enabled(&selinux_state) ||
5548                             security_get_allow_unknown(&selinux_state))
5549                                 err = 0;
5550                 }
5551
5552                 /* Ignore */
5553                 if (err == -ENOENT)
5554                         err = 0;
5555                 goto out;
5556         }
5557
5558         err = sock_has_perm(sk, perm);
5559 out:
5560         return err;
5561 }
5562
5563 #ifdef CONFIG_NETFILTER
5564
5565 static unsigned int selinux_ip_forward(struct sk_buff *skb,
5566                                        const struct net_device *indev,
5567                                        u16 family)
5568 {
5569         int err;
5570         char *addrp;
5571         u32 peer_sid;
5572         struct common_audit_data ad;
5573         struct lsm_network_audit net = {0,};
5574         u8 secmark_active;
5575         u8 netlbl_active;
5576         u8 peerlbl_active;
5577
5578         if (!selinux_policycap_netpeer())
5579                 return NF_ACCEPT;
5580
5581         secmark_active = selinux_secmark_enabled();
5582         netlbl_active = netlbl_enabled();
5583         peerlbl_active = selinux_peerlbl_enabled();
5584         if (!secmark_active && !peerlbl_active)
5585                 return NF_ACCEPT;
5586
5587         if (selinux_skb_peerlbl_sid(skb, family, &peer_sid) != 0)
5588                 return NF_DROP;
5589
5590         ad.type = LSM_AUDIT_DATA_NET;
5591         ad.u.net = &net;
5592         ad.u.net->netif = indev->ifindex;
5593         ad.u.net->family = family;
5594         if (selinux_parse_skb(skb, &ad, &addrp, 1, NULL) != 0)
5595                 return NF_DROP;
5596
5597         if (peerlbl_active) {
5598                 err = selinux_inet_sys_rcv_skb(dev_net(indev), indev->ifindex,
5599                                                addrp, family, peer_sid, &ad);
5600                 if (err) {
5601                         selinux_netlbl_err(skb, family, err, 1);
5602                         return NF_DROP;
5603                 }
5604         }
5605
5606         if (secmark_active)
5607                 if (avc_has_perm(&selinux_state,
5608                                  peer_sid, skb->secmark,
5609                                  SECCLASS_PACKET, PACKET__FORWARD_IN, &ad))
5610                         return NF_DROP;
5611
5612         if (netlbl_active)
5613                 /* we do this in the FORWARD path and not the POST_ROUTING
5614                  * path because we want to make sure we apply the necessary
5615                  * labeling before IPsec is applied so we can leverage AH
5616                  * protection */
5617                 if (selinux_netlbl_skbuff_setsid(skb, family, peer_sid) != 0)
5618                         return NF_DROP;
5619
5620         return NF_ACCEPT;
5621 }
5622
5623 static unsigned int selinux_ipv4_forward(void *priv,
5624                                          struct sk_buff *skb,
5625                                          const struct nf_hook_state *state)
5626 {
5627         return selinux_ip_forward(skb, state->in, PF_INET);
5628 }
5629
5630 #if IS_ENABLED(CONFIG_IPV6)
5631 static unsigned int selinux_ipv6_forward(void *priv,
5632                                          struct sk_buff *skb,
5633                                          const struct nf_hook_state *state)
5634 {
5635         return selinux_ip_forward(skb, state->in, PF_INET6);
5636 }
5637 #endif  /* IPV6 */
5638
5639 static unsigned int selinux_ip_output(struct sk_buff *skb,
5640                                       u16 family)
5641 {
5642         struct sock *sk;
5643         u32 sid;
5644
5645         if (!netlbl_enabled())
5646                 return NF_ACCEPT;
5647
5648         /* we do this in the LOCAL_OUT path and not the POST_ROUTING path
5649          * because we want to make sure we apply the necessary labeling
5650          * before IPsec is applied so we can leverage AH protection */
5651         sk = skb->sk;
5652         if (sk) {
5653                 struct sk_security_struct *sksec;
5654
5655                 if (sk_listener(sk))
5656                         /* if the socket is the listening state then this
5657                          * packet is a SYN-ACK packet which means it needs to
5658                          * be labeled based on the connection/request_sock and
5659                          * not the parent socket.  unfortunately, we can't
5660                          * lookup the request_sock yet as it isn't queued on
5661                          * the parent socket until after the SYN-ACK is sent.
5662                          * the "solution" is to simply pass the packet as-is
5663                          * as any IP option based labeling should be copied
5664                          * from the initial connection request (in the IP
5665                          * layer).  it is far from ideal, but until we get a
5666                          * security label in the packet itself this is the
5667                          * best we can do. */
5668                         return NF_ACCEPT;
5669
5670                 /* standard practice, label using the parent socket */
5671                 sksec = sk->sk_security;
5672                 sid = sksec->sid;
5673         } else
5674                 sid = SECINITSID_KERNEL;
5675         if (selinux_netlbl_skbuff_setsid(skb, family, sid) != 0)
5676                 return NF_DROP;
5677
5678         return NF_ACCEPT;
5679 }
5680
5681 static unsigned int selinux_ipv4_output(void *priv,
5682                                         struct sk_buff *skb,
5683                                         const struct nf_hook_state *state)
5684 {
5685         return selinux_ip_output(skb, PF_INET);
5686 }
5687
5688 #if IS_ENABLED(CONFIG_IPV6)
5689 static unsigned int selinux_ipv6_output(void *priv,
5690                                         struct sk_buff *skb,
5691                                         const struct nf_hook_state *state)
5692 {
5693         return selinux_ip_output(skb, PF_INET6);
5694 }
5695 #endif  /* IPV6 */
5696
5697 static unsigned int selinux_ip_postroute_compat(struct sk_buff *skb,
5698                                                 int ifindex,
5699                                                 u16 family)
5700 {
5701         struct sock *sk = skb_to_full_sk(skb);
5702         struct sk_security_struct *sksec;
5703         struct common_audit_data ad;
5704         struct lsm_network_audit net = {0,};
5705         char *addrp;
5706         u8 proto;
5707
5708         if (sk == NULL)
5709                 return NF_ACCEPT;
5710         sksec = sk->sk_security;
5711
5712         ad.type = LSM_AUDIT_DATA_NET;
5713         ad.u.net = &net;
5714         ad.u.net->netif = ifindex;
5715         ad.u.net->family = family;
5716         if (selinux_parse_skb(skb, &ad, &addrp, 0, &proto))
5717                 return NF_DROP;
5718
5719         if (selinux_secmark_enabled())
5720                 if (avc_has_perm(&selinux_state,
5721                                  sksec->sid, skb->secmark,
5722                                  SECCLASS_PACKET, PACKET__SEND, &ad))
5723                         return NF_DROP_ERR(-ECONNREFUSED);
5724
5725         if (selinux_xfrm_postroute_last(sksec->sid, skb, &ad, proto))
5726                 return NF_DROP_ERR(-ECONNREFUSED);
5727
5728         return NF_ACCEPT;
5729 }
5730
5731 static unsigned int selinux_ip_postroute(struct sk_buff *skb,
5732                                          const struct net_device *outdev,
5733                                          u16 family)
5734 {
5735         u32 secmark_perm;
5736         u32 peer_sid;
5737         int ifindex = outdev->ifindex;
5738         struct sock *sk;
5739         struct common_audit_data ad;
5740         struct lsm_network_audit net = {0,};
5741         char *addrp;
5742         u8 secmark_active;
5743         u8 peerlbl_active;
5744
5745         /* If any sort of compatibility mode is enabled then handoff processing
5746          * to the selinux_ip_postroute_compat() function to deal with the
5747          * special handling.  We do this in an attempt to keep this function
5748          * as fast and as clean as possible. */
5749         if (!selinux_policycap_netpeer())
5750                 return selinux_ip_postroute_compat(skb, ifindex, family);
5751
5752         secmark_active = selinux_secmark_enabled();
5753         peerlbl_active = selinux_peerlbl_enabled();
5754         if (!secmark_active && !peerlbl_active)
5755                 return NF_ACCEPT;
5756
5757         sk = skb_to_full_sk(skb);
5758
5759 #ifdef CONFIG_XFRM
5760         /* If skb->dst->xfrm is non-NULL then the packet is undergoing an IPsec
5761          * packet transformation so allow the packet to pass without any checks
5762          * since we'll have another chance to perform access control checks
5763          * when the packet is on it's final way out.
5764          * NOTE: there appear to be some IPv6 multicast cases where skb->dst
5765          *       is NULL, in this case go ahead and apply access control.
5766          * NOTE: if this is a local socket (skb->sk != NULL) that is in the
5767          *       TCP listening state we cannot wait until the XFRM processing
5768          *       is done as we will miss out on the SA label if we do;
5769          *       unfortunately, this means more work, but it is only once per
5770          *       connection. */
5771         if (skb_dst(skb) != NULL && skb_dst(skb)->xfrm != NULL &&
5772             !(sk && sk_listener(sk)))
5773                 return NF_ACCEPT;
5774 #endif
5775
5776         if (sk == NULL) {
5777                 /* Without an associated socket the packet is either coming
5778                  * from the kernel or it is being forwarded; check the packet
5779                  * to determine which and if the packet is being forwarded
5780                  * query the packet directly to determine the security label. */
5781                 if (skb->skb_iif) {
5782                         secmark_perm = PACKET__FORWARD_OUT;
5783                         if (selinux_skb_peerlbl_sid(skb, family, &peer_sid))
5784                                 return NF_DROP;
5785                 } else {
5786                         secmark_perm = PACKET__SEND;
5787                         peer_sid = SECINITSID_KERNEL;
5788                 }
5789         } else if (sk_listener(sk)) {
5790                 /* Locally generated packet but the associated socket is in the
5791                  * listening state which means this is a SYN-ACK packet.  In
5792                  * this particular case the correct security label is assigned
5793                  * to the connection/request_sock but unfortunately we can't
5794                  * query the request_sock as it isn't queued on the parent
5795                  * socket until after the SYN-ACK packet is sent; the only
5796                  * viable choice is to regenerate the label like we do in
5797                  * selinux_inet_conn_request().  See also selinux_ip_output()
5798                  * for similar problems. */
5799                 u32 skb_sid;
5800                 struct sk_security_struct *sksec;
5801
5802                 sksec = sk->sk_security;
5803                 if (selinux_skb_peerlbl_sid(skb, family, &skb_sid))
5804                         return NF_DROP;
5805                 /* At this point, if the returned skb peerlbl is SECSID_NULL
5806                  * and the packet has been through at least one XFRM
5807                  * transformation then we must be dealing with the "final"
5808                  * form of labeled IPsec packet; since we've already applied
5809                  * all of our access controls on this packet we can safely
5810                  * pass the packet. */
5811                 if (skb_sid == SECSID_NULL) {
5812                         switch (family) {
5813                         case PF_INET:
5814                                 if (IPCB(skb)->flags & IPSKB_XFRM_TRANSFORMED)
5815                                         return NF_ACCEPT;
5816                                 break;
5817                         case PF_INET6:
5818                                 if (IP6CB(skb)->flags & IP6SKB_XFRM_TRANSFORMED)
5819                                         return NF_ACCEPT;
5820                                 break;
5821                         default:
5822                                 return NF_DROP_ERR(-ECONNREFUSED);
5823                         }
5824                 }
5825                 if (selinux_conn_sid(sksec->sid, skb_sid, &peer_sid))
5826                         return NF_DROP;
5827                 secmark_perm = PACKET__SEND;
5828         } else {
5829                 /* Locally generated packet, fetch the security label from the
5830                  * associated socket. */
5831                 struct sk_security_struct *sksec = sk->sk_security;
5832                 peer_sid = sksec->sid;
5833                 secmark_perm = PACKET__SEND;
5834         }
5835
5836         ad.type = LSM_AUDIT_DATA_NET;
5837         ad.u.net = &net;
5838         ad.u.net->netif = ifindex;
5839         ad.u.net->family = family;
5840         if (selinux_parse_skb(skb, &ad, &addrp, 0, NULL))
5841                 return NF_DROP;
5842
5843         if (secmark_active)
5844                 if (avc_has_perm(&selinux_state,
5845                                  peer_sid, skb->secmark,
5846                                  SECCLASS_PACKET, secmark_perm, &ad))
5847                         return NF_DROP_ERR(-ECONNREFUSED);
5848
5849         if (peerlbl_active) {
5850                 u32 if_sid;
5851                 u32 node_sid;
5852
5853                 if (sel_netif_sid(dev_net(outdev), ifindex, &if_sid))
5854                         return NF_DROP;
5855                 if (avc_has_perm(&selinux_state,
5856                                  peer_sid, if_sid,
5857                                  SECCLASS_NETIF, NETIF__EGRESS, &ad))
5858                         return NF_DROP_ERR(-ECONNREFUSED);
5859
5860                 if (sel_netnode_sid(addrp, family, &node_sid))
5861                         return NF_DROP;
5862                 if (avc_has_perm(&selinux_state,
5863                                  peer_sid, node_sid,
5864                                  SECCLASS_NODE, NODE__SENDTO, &ad))
5865                         return NF_DROP_ERR(-ECONNREFUSED);
5866         }
5867
5868         return NF_ACCEPT;
5869 }
5870
5871 static unsigned int selinux_ipv4_postroute(void *priv,
5872                                            struct sk_buff *skb,
5873                                            const struct nf_hook_state *state)
5874 {
5875         return selinux_ip_postroute(skb, state->out, PF_INET);
5876 }
5877
5878 #if IS_ENABLED(CONFIG_IPV6)
5879 static unsigned int selinux_ipv6_postroute(void *priv,
5880                                            struct sk_buff *skb,
5881                                            const struct nf_hook_state *state)
5882 {
5883         return selinux_ip_postroute(skb, state->out, PF_INET6);
5884 }
5885 #endif  /* IPV6 */
5886
5887 #endif  /* CONFIG_NETFILTER */
5888
5889 static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb)
5890 {
5891         return selinux_nlmsg_perm(sk, skb);
5892 }
5893
5894 static int ipc_alloc_security(struct kern_ipc_perm *perm,
5895                               u16 sclass)
5896 {
5897         struct ipc_security_struct *isec;
5898
5899         isec = kzalloc(sizeof(struct ipc_security_struct), GFP_KERNEL);
5900         if (!isec)
5901                 return -ENOMEM;
5902
5903         isec->sclass = sclass;
5904         isec->sid = current_sid();
5905         perm->security = isec;
5906
5907         return 0;
5908 }
5909
5910 static void ipc_free_security(struct kern_ipc_perm *perm)
5911 {
5912         struct ipc_security_struct *isec = perm->security;
5913         perm->security = NULL;
5914         kfree(isec);
5915 }
5916
5917 static int msg_msg_alloc_security(struct msg_msg *msg)
5918 {
5919         struct msg_security_struct *msec;
5920
5921         msec = kzalloc(sizeof(struct msg_security_struct), GFP_KERNEL);
5922         if (!msec)
5923                 return -ENOMEM;
5924
5925         msec->sid = SECINITSID_UNLABELED;
5926         msg->security = msec;
5927
5928         return 0;
5929 }
5930
5931 static void msg_msg_free_security(struct msg_msg *msg)
5932 {
5933         struct msg_security_struct *msec = msg->security;
5934
5935         msg->security = NULL;
5936         kfree(msec);
5937 }
5938
5939 static int ipc_has_perm(struct kern_ipc_perm *ipc_perms,
5940                         u32 perms)
5941 {
5942         struct ipc_security_struct *isec;
5943         struct common_audit_data ad;
5944         u32 sid = current_sid();
5945
5946         isec = ipc_perms->security;
5947
5948         ad.type = LSM_AUDIT_DATA_IPC;
5949         ad.u.ipc_id = ipc_perms->key;
5950
5951         return avc_has_perm(&selinux_state,
5952                             sid, isec->sid, isec->sclass, perms, &ad);
5953 }
5954
5955 static int selinux_msg_msg_alloc_security(struct msg_msg *msg)
5956 {
5957         return msg_msg_alloc_security(msg);
5958 }
5959
5960 static void selinux_msg_msg_free_security(struct msg_msg *msg)
5961 {
5962         msg_msg_free_security(msg);
5963 }
5964
5965 /* message queue security operations */
5966 static int selinux_msg_queue_alloc_security(struct kern_ipc_perm *msq)
5967 {
5968         struct ipc_security_struct *isec;
5969         struct common_audit_data ad;
5970         u32 sid = current_sid();
5971         int rc;
5972
5973         rc = ipc_alloc_security(msq, SECCLASS_MSGQ);
5974         if (rc)
5975                 return rc;
5976
5977         isec = msq->security;
5978
5979         ad.type = LSM_AUDIT_DATA_IPC;
5980         ad.u.ipc_id = msq->key;
5981
5982         rc = avc_has_perm(&selinux_state,
5983                           sid, isec->sid, SECCLASS_MSGQ,
5984                           MSGQ__CREATE, &ad);
5985         if (rc) {
5986                 ipc_free_security(msq);
5987                 return rc;
5988         }
5989         return 0;
5990 }
5991
5992 static void selinux_msg_queue_free_security(struct kern_ipc_perm *msq)
5993 {
5994         ipc_free_security(msq);
5995 }
5996
5997 static int selinux_msg_queue_associate(struct kern_ipc_perm *msq, int msqflg)
5998 {
5999         struct ipc_security_struct *isec;
6000         struct common_audit_data ad;
6001         u32 sid = current_sid();
6002
6003         isec = msq->security;
6004
6005         ad.type = LSM_AUDIT_DATA_IPC;
6006         ad.u.ipc_id = msq->key;
6007
6008         return avc_has_perm(&selinux_state,
6009                             sid, isec->sid, SECCLASS_MSGQ,
6010                             MSGQ__ASSOCIATE, &ad);
6011 }
6012
6013 static int selinux_msg_queue_msgctl(struct kern_ipc_perm *msq, int cmd)
6014 {
6015         int err;
6016         int perms;
6017
6018         switch (cmd) {
6019         case IPC_INFO:
6020         case MSG_INFO:
6021                 /* No specific object, just general system-wide information. */
6022                 return avc_has_perm(&selinux_state,
6023                                     current_sid(), SECINITSID_KERNEL,
6024                                     SECCLASS_SYSTEM, SYSTEM__IPC_INFO, NULL);
6025         case IPC_STAT:
6026         case MSG_STAT:
6027         case MSG_STAT_ANY:
6028                 perms = MSGQ__GETATTR | MSGQ__ASSOCIATE;
6029                 break;
6030         case IPC_SET:
6031                 perms = MSGQ__SETATTR;
6032                 break;
6033         case IPC_RMID:
6034                 perms = MSGQ__DESTROY;
6035                 break;
6036         default:
6037                 return 0;
6038         }
6039
6040         err = ipc_has_perm(msq, perms);
6041         return err;
6042 }
6043
6044 static int selinux_msg_queue_msgsnd(struct kern_ipc_perm *msq, struct msg_msg *msg, int msqflg)
6045 {
6046         struct ipc_security_struct *isec;
6047         struct msg_security_struct *msec;
6048         struct common_audit_data ad;
6049         u32 sid = current_sid();
6050         int rc;
6051
6052         isec = msq->security;
6053         msec = msg->security;
6054
6055         /*
6056          * First time through, need to assign label to the message
6057          */
6058         if (msec->sid == SECINITSID_UNLABELED) {
6059                 /*
6060                  * Compute new sid based on current process and
6061                  * message queue this message will be stored in
6062                  */
6063                 rc = security_transition_sid(&selinux_state, sid, isec->sid,
6064                                              SECCLASS_MSG, NULL, &msec->sid);
6065                 if (rc)
6066                         return rc;
6067         }
6068
6069         ad.type = LSM_AUDIT_DATA_IPC;
6070         ad.u.ipc_id = msq->key;
6071
6072         /* Can this process write to the queue? */
6073         rc = avc_has_perm(&selinux_state,
6074                           sid, isec->sid, SECCLASS_MSGQ,
6075                           MSGQ__WRITE, &ad);
6076         if (!rc)
6077                 /* Can this process send the message */
6078                 rc = avc_has_perm(&selinux_state,
6079                                   sid, msec->sid, SECCLASS_MSG,
6080                                   MSG__SEND, &ad);
6081         if (!rc)
6082                 /* Can the message be put in the queue? */
6083                 rc = avc_has_perm(&selinux_state,
6084                                   msec->sid, isec->sid, SECCLASS_MSGQ,
6085                                   MSGQ__ENQUEUE, &ad);
6086
6087         return rc;
6088 }
6089
6090 static int selinux_msg_queue_msgrcv(struct kern_ipc_perm *msq, struct msg_msg *msg,
6091                                     struct task_struct *target,
6092                                     long type, int mode)
6093 {
6094         struct ipc_security_struct *isec;
6095         struct msg_security_struct *msec;
6096         struct common_audit_data ad;
6097         u32 sid = task_sid(target);
6098         int rc;
6099
6100         isec = msq->security;
6101         msec = msg->security;
6102
6103         ad.type = LSM_AUDIT_DATA_IPC;
6104         ad.u.ipc_id = msq->key;
6105
6106         rc = avc_has_perm(&selinux_state,
6107                           sid, isec->sid,
6108                           SECCLASS_MSGQ, MSGQ__READ, &ad);
6109         if (!rc)
6110                 rc = avc_has_perm(&selinux_state,
6111                                   sid, msec->sid,
6112                                   SECCLASS_MSG, MSG__RECEIVE, &ad);
6113         return rc;
6114 }
6115
6116 /* Shared Memory security operations */
6117 static int selinux_shm_alloc_security(struct kern_ipc_perm *shp)
6118 {
6119         struct ipc_security_struct *isec;
6120         struct common_audit_data ad;
6121         u32 sid = current_sid();
6122         int rc;
6123
6124         rc = ipc_alloc_security(shp, SECCLASS_SHM);
6125         if (rc)
6126                 return rc;
6127
6128         isec = shp->security;
6129
6130         ad.type = LSM_AUDIT_DATA_IPC;
6131         ad.u.ipc_id = shp->key;
6132
6133         rc = avc_has_perm(&selinux_state,
6134                           sid, isec->sid, SECCLASS_SHM,
6135                           SHM__CREATE, &ad);
6136         if (rc) {
6137                 ipc_free_security(shp);
6138                 return rc;
6139         }
6140         return 0;
6141 }
6142
6143 static void selinux_shm_free_security(struct kern_ipc_perm *shp)
6144 {
6145         ipc_free_security(shp);
6146 }
6147
6148 static int selinux_shm_associate(struct kern_ipc_perm *shp, int shmflg)
6149 {
6150         struct ipc_security_struct *isec;
6151         struct common_audit_data ad;
6152         u32 sid = current_sid();
6153
6154         isec = shp->security;
6155
6156         ad.type = LSM_AUDIT_DATA_IPC;
6157         ad.u.ipc_id = shp->key;
6158
6159         return avc_has_perm(&selinux_state,
6160                             sid, isec->sid, SECCLASS_SHM,
6161                             SHM__ASSOCIATE, &ad);
6162 }
6163
6164 /* Note, at this point, shp is locked down */
6165 static int selinux_shm_shmctl(struct kern_ipc_perm *shp, int cmd)
6166 {
6167         int perms;
6168         int err;
6169
6170         switch (cmd) {
6171         case IPC_INFO:
6172         case SHM_INFO:
6173                 /* No specific object, just general system-wide information. */
6174                 return avc_has_perm(&selinux_state,
6175                                     current_sid(), SECINITSID_KERNEL,
6176                                     SECCLASS_SYSTEM, SYSTEM__IPC_INFO, NULL);
6177         case IPC_STAT:
6178         case SHM_STAT:
6179         case SHM_STAT_ANY:
6180                 perms = SHM__GETATTR | SHM__ASSOCIATE;
6181                 break;
6182         case IPC_SET:
6183                 perms = SHM__SETATTR;
6184                 break;
6185         case SHM_LOCK:
6186         case SHM_UNLOCK:
6187                 perms = SHM__LOCK;
6188                 break;
6189         case IPC_RMID:
6190                 perms = SHM__DESTROY;
6191                 break;
6192         default:
6193                 return 0;
6194         }
6195
6196         err = ipc_has_perm(shp, perms);
6197         return err;
6198 }
6199
6200 static int selinux_shm_shmat(struct kern_ipc_perm *shp,
6201                              char __user *shmaddr, int shmflg)
6202 {
6203         u32 perms;
6204
6205         if (shmflg & SHM_RDONLY)
6206                 perms = SHM__READ;
6207         else
6208                 perms = SHM__READ | SHM__WRITE;
6209
6210         return ipc_has_perm(shp, perms);
6211 }
6212
6213 /* Semaphore security operations */
6214 static int selinux_sem_alloc_security(struct kern_ipc_perm *sma)
6215 {
6216         struct ipc_security_struct *isec;
6217         struct common_audit_data ad;
6218         u32 sid = current_sid();
6219         int rc;
6220
6221         rc = ipc_alloc_security(sma, SECCLASS_SEM);
6222         if (rc)
6223                 return rc;
6224
6225         isec = sma->security;
6226
6227         ad.type = LSM_AUDIT_DATA_IPC;
6228         ad.u.ipc_id = sma->key;
6229
6230         rc = avc_has_perm(&selinux_state,
6231                           sid, isec->sid, SECCLASS_SEM,
6232                           SEM__CREATE, &ad);
6233         if (rc) {
6234                 ipc_free_security(sma);
6235                 return rc;
6236         }
6237         return 0;
6238 }
6239
6240 static void selinux_sem_free_security(struct kern_ipc_perm *sma)
6241 {
6242         ipc_free_security(sma);
6243 }
6244
6245 static int selinux_sem_associate(struct kern_ipc_perm *sma, int semflg)
6246 {
6247         struct ipc_security_struct *isec;
6248         struct common_audit_data ad;
6249         u32 sid = current_sid();
6250
6251         isec = sma->security;
6252
6253         ad.type = LSM_AUDIT_DATA_IPC;
6254         ad.u.ipc_id = sma->key;
6255
6256         return avc_has_perm(&selinux_state,
6257                             sid, isec->sid, SECCLASS_SEM,
6258                             SEM__ASSOCIATE, &ad);
6259 }
6260
6261 /* Note, at this point, sma is locked down */
6262 static int selinux_sem_semctl(struct kern_ipc_perm *sma, int cmd)
6263 {
6264         int err;
6265         u32 perms;
6266
6267         switch (cmd) {
6268         case IPC_INFO:
6269         case SEM_INFO:
6270                 /* No specific object, just general system-wide information. */
6271                 return avc_has_perm(&selinux_state,
6272                                     current_sid(), SECINITSID_KERNEL,
6273                                     SECCLASS_SYSTEM, SYSTEM__IPC_INFO, NULL);
6274         case GETPID:
6275         case GETNCNT:
6276         case GETZCNT:
6277                 perms = SEM__GETATTR;
6278                 break;
6279         case GETVAL:
6280         case GETALL:
6281                 perms = SEM__READ;
6282                 break;
6283         case SETVAL:
6284         case SETALL:
6285                 perms = SEM__WRITE;
6286                 break;
6287         case IPC_RMID:
6288                 perms = SEM__DESTROY;
6289                 break;
6290         case IPC_SET:
6291                 perms = SEM__SETATTR;
6292                 break;
6293         case IPC_STAT:
6294         case SEM_STAT:
6295         case SEM_STAT_ANY:
6296                 perms = SEM__GETATTR | SEM__ASSOCIATE;
6297                 break;
6298         default:
6299                 return 0;
6300         }
6301
6302         err = ipc_has_perm(sma, perms);
6303         return err;
6304 }
6305
6306 static int selinux_sem_semop(struct kern_ipc_perm *sma,
6307                              struct sembuf *sops, unsigned nsops, int alter)
6308 {
6309         u32 perms;
6310
6311         if (alter)
6312                 perms = SEM__READ | SEM__WRITE;
6313         else
6314                 perms = SEM__READ;
6315
6316         return ipc_has_perm(sma, perms);
6317 }
6318
6319 static int selinux_ipc_permission(struct kern_ipc_perm *ipcp, short flag)
6320 {
6321         u32 av = 0;
6322
6323         av = 0;
6324         if (flag & S_IRUGO)
6325                 av |= IPC__UNIX_READ;
6326         if (flag & S_IWUGO)
6327                 av |= IPC__UNIX_WRITE;
6328
6329         if (av == 0)
6330                 return 0;
6331
6332         return ipc_has_perm(ipcp, av);
6333 }
6334
6335 static void selinux_ipc_getsecid(struct kern_ipc_perm *ipcp, u32 *secid)
6336 {
6337         struct ipc_security_struct *isec = ipcp->security;
6338         *secid = isec->sid;
6339 }
6340
6341 static void selinux_d_instantiate(struct dentry *dentry, struct inode *inode)
6342 {
6343         if (inode)
6344                 inode_doinit_with_dentry(inode, dentry);
6345 }
6346
6347 static int selinux_getprocattr(struct task_struct *p,
6348                                char *name, char **value)
6349 {
6350         const struct task_security_struct *__tsec;
6351         u32 sid;
6352         int error;
6353         unsigned len;
6354
6355         rcu_read_lock();
6356         __tsec = __task_cred(p)->security;
6357
6358         if (current != p) {
6359                 error = avc_has_perm(&selinux_state,
6360                                      current_sid(), __tsec->sid,
6361                                      SECCLASS_PROCESS, PROCESS__GETATTR, NULL);
6362                 if (error)
6363                         goto bad;
6364         }
6365
6366         if (!strcmp(name, "current"))
6367                 sid = __tsec->sid;
6368         else if (!strcmp(name, "prev"))
6369                 sid = __tsec->osid;
6370         else if (!strcmp(name, "exec"))
6371                 sid = __tsec->exec_sid;
6372         else if (!strcmp(name, "fscreate"))
6373                 sid = __tsec->create_sid;
6374         else if (!strcmp(name, "keycreate"))
6375                 sid = __tsec->keycreate_sid;
6376         else if (!strcmp(name, "sockcreate"))
6377                 sid = __tsec->sockcreate_sid;
6378         else {
6379                 error = -EINVAL;
6380                 goto bad;
6381         }
6382         rcu_read_unlock();
6383
6384         if (!sid)
6385                 return 0;
6386
6387         error = security_sid_to_context(&selinux_state, sid, value, &len);
6388         if (error)
6389                 return error;
6390         return len;
6391
6392 bad:
6393         rcu_read_unlock();
6394         return error;
6395 }
6396
6397 static int selinux_setprocattr(const char *name, void *value, size_t size)
6398 {
6399         struct task_security_struct *tsec;
6400         struct cred *new;
6401         u32 mysid = current_sid(), sid = 0, ptsid;
6402         int error;
6403         char *str = value;
6404
6405         /*
6406          * Basic control over ability to set these attributes at all.
6407          */
6408         if (!strcmp(name, "exec"))
6409                 error = avc_has_perm(&selinux_state,
6410                                      mysid, mysid, SECCLASS_PROCESS,
6411                                      PROCESS__SETEXEC, NULL);
6412         else if (!strcmp(name, "fscreate"))
6413                 error = avc_has_perm(&selinux_state,
6414                                      mysid, mysid, SECCLASS_PROCESS,
6415                                      PROCESS__SETFSCREATE, NULL);
6416         else if (!strcmp(name, "keycreate"))
6417                 error = avc_has_perm(&selinux_state,
6418                                      mysid, mysid, SECCLASS_PROCESS,
6419                                      PROCESS__SETKEYCREATE, NULL);
6420         else if (!strcmp(name, "sockcreate"))
6421                 error = avc_has_perm(&selinux_state,
6422                                      mysid, mysid, SECCLASS_PROCESS,
6423                                      PROCESS__SETSOCKCREATE, NULL);
6424         else if (!strcmp(name, "current"))
6425                 error = avc_has_perm(&selinux_state,
6426                                      mysid, mysid, SECCLASS_PROCESS,
6427                                      PROCESS__SETCURRENT, NULL);
6428         else
6429                 error = -EINVAL;
6430         if (error)
6431                 return error;
6432
6433         /* Obtain a SID for the context, if one was specified. */
6434         if (size && str[0] && str[0] != '\n') {
6435                 if (str[size-1] == '\n') {
6436                         str[size-1] = 0;
6437                         size--;
6438                 }
6439                 error = security_context_to_sid(&selinux_state, value, size,
6440                                                 &sid, GFP_KERNEL);
6441                 if (error == -EINVAL && !strcmp(name, "fscreate")) {
6442                         if (!has_cap_mac_admin(true)) {
6443                                 struct audit_buffer *ab;
6444                                 size_t audit_size;
6445
6446                                 /* We strip a nul only if it is at the end, otherwise the
6447                                  * context contains a nul and we should audit that */
6448                                 if (str[size - 1] == '\0')
6449                                         audit_size = size - 1;
6450                                 else
6451                                         audit_size = size;
6452                                 ab = audit_log_start(current->audit_context, GFP_ATOMIC, AUDIT_SELINUX_ERR);
6453                                 audit_log_format(ab, "op=fscreate invalid_context=");
6454                                 audit_log_n_untrustedstring(ab, value, audit_size);
6455                                 audit_log_end(ab);
6456
6457                                 return error;
6458                         }
6459                         error = security_context_to_sid_force(
6460                                                       &selinux_state,
6461                                                       value, size, &sid);
6462                 }
6463                 if (error)
6464                         return error;
6465         }
6466
6467         new = prepare_creds();
6468         if (!new)
6469                 return -ENOMEM;
6470
6471         /* Permission checking based on the specified context is
6472            performed during the actual operation (execve,
6473            open/mkdir/...), when we know the full context of the
6474            operation.  See selinux_bprm_set_creds for the execve
6475            checks and may_create for the file creation checks. The
6476            operation will then fail if the context is not permitted. */
6477         tsec = new->security;
6478         if (!strcmp(name, "exec")) {
6479                 tsec->exec_sid = sid;
6480         } else if (!strcmp(name, "fscreate")) {
6481                 tsec->create_sid = sid;
6482         } else if (!strcmp(name, "keycreate")) {
6483                 error = avc_has_perm(&selinux_state,
6484                                      mysid, sid, SECCLASS_KEY, KEY__CREATE,
6485                                      NULL);
6486                 if (error)
6487                         goto abort_change;
6488                 tsec->keycreate_sid = sid;
6489         } else if (!strcmp(name, "sockcreate")) {
6490                 tsec->sockcreate_sid = sid;
6491         } else if (!strcmp(name, "current")) {
6492                 error = -EINVAL;
6493                 if (sid == 0)
6494                         goto abort_change;
6495
6496                 /* Only allow single threaded processes to change context */
6497                 error = -EPERM;
6498                 if (!current_is_single_threaded()) {
6499                         error = security_bounded_transition(&selinux_state,
6500                                                             tsec->sid, sid);
6501                         if (error)
6502                                 goto abort_change;
6503                 }
6504
6505                 /* Check permissions for the transition. */
6506                 error = avc_has_perm(&selinux_state,
6507                                      tsec->sid, sid, SECCLASS_PROCESS,
6508                                      PROCESS__DYNTRANSITION, NULL);
6509                 if (error)
6510                         goto abort_change;
6511
6512                 /* Check for ptracing, and update the task SID if ok.
6513                    Otherwise, leave SID unchanged and fail. */
6514                 ptsid = ptrace_parent_sid();
6515                 if (ptsid != 0) {
6516                         error = avc_has_perm(&selinux_state,
6517                                              ptsid, sid, SECCLASS_PROCESS,
6518                                              PROCESS__PTRACE, NULL);
6519                         if (error)
6520                                 goto abort_change;
6521                 }
6522
6523                 tsec->sid = sid;
6524         } else {
6525                 error = -EINVAL;
6526                 goto abort_change;
6527         }
6528
6529         commit_creds(new);
6530         return size;
6531
6532 abort_change:
6533         abort_creds(new);
6534         return error;
6535 }
6536
6537 static int selinux_ismaclabel(const char *name)
6538 {
6539         return (strcmp(name, XATTR_SELINUX_SUFFIX) == 0);
6540 }
6541
6542 static int selinux_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
6543 {
6544         return security_sid_to_context(&selinux_state, secid,
6545                                        secdata, seclen);
6546 }
6547
6548 static int selinux_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid)
6549 {
6550         return security_context_to_sid(&selinux_state, secdata, seclen,
6551                                        secid, GFP_KERNEL);
6552 }
6553
6554 static void selinux_release_secctx(char *secdata, u32 seclen)
6555 {
6556         kfree(secdata);
6557 }
6558
6559 static void selinux_inode_invalidate_secctx(struct inode *inode)
6560 {
6561         struct inode_security_struct *isec = inode->i_security;
6562
6563         spin_lock(&isec->lock);
6564         isec->initialized = LABEL_INVALID;
6565         spin_unlock(&isec->lock);
6566 }
6567
6568 /*
6569  *      called with inode->i_mutex locked
6570  */
6571 static int selinux_inode_notifysecctx(struct inode *inode, void *ctx, u32 ctxlen)
6572 {
6573         return selinux_inode_setsecurity(inode, XATTR_SELINUX_SUFFIX, ctx, ctxlen, 0);
6574 }
6575
6576 /*
6577  *      called with inode->i_mutex locked
6578  */
6579 static int selinux_inode_setsecctx(struct dentry *dentry, void *ctx, u32 ctxlen)
6580 {
6581         return __vfs_setxattr_noperm(dentry, XATTR_NAME_SELINUX, ctx, ctxlen, 0);
6582 }
6583
6584 static int selinux_inode_getsecctx(struct inode *inode, void **ctx, u32 *ctxlen)
6585 {
6586         int len = 0;
6587         len = selinux_inode_getsecurity(inode, XATTR_SELINUX_SUFFIX,
6588                                                 ctx, true);
6589         if (len < 0)
6590                 return len;
6591         *ctxlen = len;
6592         return 0;
6593 }
6594 #ifdef CONFIG_KEYS
6595
6596 static int selinux_key_alloc(struct key *k, const struct cred *cred,
6597                              unsigned long flags)
6598 {
6599         const struct task_security_struct *tsec;
6600         struct key_security_struct *ksec;
6601
6602         ksec = kzalloc(sizeof(struct key_security_struct), GFP_KERNEL);
6603         if (!ksec)
6604                 return -ENOMEM;
6605
6606         tsec = cred->security;
6607         if (tsec->keycreate_sid)
6608                 ksec->sid = tsec->keycreate_sid;
6609         else
6610                 ksec->sid = tsec->sid;
6611
6612         k->security = ksec;
6613         return 0;
6614 }
6615
6616 static void selinux_key_free(struct key *k)
6617 {
6618         struct key_security_struct *ksec = k->security;
6619
6620         k->security = NULL;
6621         kfree(ksec);
6622 }
6623
6624 static int selinux_key_permission(key_ref_t key_ref,
6625                                   const struct cred *cred,
6626                                   unsigned perm)
6627 {
6628         struct key *key;
6629         struct key_security_struct *ksec;
6630         u32 sid;
6631
6632         /* if no specific permissions are requested, we skip the
6633            permission check. No serious, additional covert channels
6634            appear to be created. */
6635         if (perm == 0)
6636                 return 0;
6637
6638         sid = cred_sid(cred);
6639
6640         key = key_ref_to_ptr(key_ref);
6641         ksec = key->security;
6642
6643         return avc_has_perm(&selinux_state,
6644                             sid, ksec->sid, SECCLASS_KEY, perm, NULL);
6645 }
6646
6647 static int selinux_key_getsecurity(struct key *key, char **_buffer)
6648 {
6649         struct key_security_struct *ksec = key->security;
6650         char *context = NULL;
6651         unsigned len;
6652         int rc;
6653
6654         rc = security_sid_to_context(&selinux_state, ksec->sid,
6655                                      &context, &len);
6656         if (!rc)
6657                 rc = len;
6658         *_buffer = context;
6659         return rc;
6660 }
6661 #endif
6662
6663 #ifdef CONFIG_SECURITY_INFINIBAND
6664 static int selinux_ib_pkey_access(void *ib_sec, u64 subnet_prefix, u16 pkey_val)
6665 {
6666         struct common_audit_data ad;
6667         int err;
6668         u32 sid = 0;
6669         struct ib_security_struct *sec = ib_sec;
6670         struct lsm_ibpkey_audit ibpkey;
6671
6672         err = sel_ib_pkey_sid(subnet_prefix, pkey_val, &sid);
6673         if (err)
6674                 return err;
6675
6676         ad.type = LSM_AUDIT_DATA_IBPKEY;
6677         ibpkey.subnet_prefix = subnet_prefix;
6678         ibpkey.pkey = pkey_val;
6679         ad.u.ibpkey = &ibpkey;
6680         return avc_has_perm(&selinux_state,
6681                             sec->sid, sid,
6682                             SECCLASS_INFINIBAND_PKEY,
6683                             INFINIBAND_PKEY__ACCESS, &ad);
6684 }
6685
6686 static int selinux_ib_endport_manage_subnet(void *ib_sec, const char *dev_name,
6687                                             u8 port_num)
6688 {
6689         struct common_audit_data ad;
6690         int err;
6691         u32 sid = 0;
6692         struct ib_security_struct *sec = ib_sec;
6693         struct lsm_ibendport_audit ibendport;
6694
6695         err = security_ib_endport_sid(&selinux_state, dev_name, port_num,
6696                                       &sid);
6697
6698         if (err)
6699                 return err;
6700
6701         ad.type = LSM_AUDIT_DATA_IBENDPORT;
6702         strncpy(ibendport.dev_name, dev_name, sizeof(ibendport.dev_name));
6703         ibendport.port = port_num;
6704         ad.u.ibendport = &ibendport;
6705         return avc_has_perm(&selinux_state,
6706                             sec->sid, sid,
6707                             SECCLASS_INFINIBAND_ENDPORT,
6708                             INFINIBAND_ENDPORT__MANAGE_SUBNET, &ad);
6709 }
6710
6711 static int selinux_ib_alloc_security(void **ib_sec)
6712 {
6713         struct ib_security_struct *sec;
6714
6715         sec = kzalloc(sizeof(*sec), GFP_KERNEL);
6716         if (!sec)
6717                 return -ENOMEM;
6718         sec->sid = current_sid();
6719
6720         *ib_sec = sec;
6721         return 0;
6722 }
6723
6724 static void selinux_ib_free_security(void *ib_sec)
6725 {
6726         kfree(ib_sec);
6727 }
6728 #endif
6729
6730 #ifdef CONFIG_BPF_SYSCALL
6731 static int selinux_bpf(int cmd, union bpf_attr *attr,
6732                                      unsigned int size)
6733 {
6734         u32 sid = current_sid();
6735         int ret;
6736
6737         switch (cmd) {
6738         case BPF_MAP_CREATE:
6739                 ret = avc_has_perm(&selinux_state,
6740                                    sid, sid, SECCLASS_BPF, BPF__MAP_CREATE,
6741                                    NULL);
6742                 break;
6743         case BPF_PROG_LOAD:
6744                 ret = avc_has_perm(&selinux_state,
6745                                    sid, sid, SECCLASS_BPF, BPF__PROG_LOAD,
6746                                    NULL);
6747                 break;
6748         default:
6749                 ret = 0;
6750                 break;
6751         }
6752
6753         return ret;
6754 }
6755
6756 static u32 bpf_map_fmode_to_av(fmode_t fmode)
6757 {
6758         u32 av = 0;
6759
6760         if (fmode & FMODE_READ)
6761                 av |= BPF__MAP_READ;
6762         if (fmode & FMODE_WRITE)
6763                 av |= BPF__MAP_WRITE;
6764         return av;
6765 }
6766
6767 /* This function will check the file pass through unix socket or binder to see
6768  * if it is a bpf related object. And apply correspinding checks on the bpf
6769  * object based on the type. The bpf maps and programs, not like other files and
6770  * socket, are using a shared anonymous inode inside the kernel as their inode.
6771  * So checking that inode cannot identify if the process have privilege to
6772  * access the bpf object and that's why we have to add this additional check in
6773  * selinux_file_receive and selinux_binder_transfer_files.
6774  */
6775 static int bpf_fd_pass(struct file *file, u32 sid)
6776 {
6777         struct bpf_security_struct *bpfsec;
6778         struct bpf_prog *prog;
6779         struct bpf_map *map;
6780         int ret;
6781
6782         if (file->f_op == &bpf_map_fops) {
6783                 map = file->private_data;
6784                 bpfsec = map->security;
6785                 ret = avc_has_perm(&selinux_state,
6786                                    sid, bpfsec->sid, SECCLASS_BPF,
6787                                    bpf_map_fmode_to_av(file->f_mode), NULL);
6788                 if (ret)
6789                         return ret;
6790         } else if (file->f_op == &bpf_prog_fops) {
6791                 prog = file->private_data;
6792                 bpfsec = prog->aux->security;
6793                 ret = avc_has_perm(&selinux_state,
6794                                    sid, bpfsec->sid, SECCLASS_BPF,
6795                                    BPF__PROG_RUN, NULL);
6796                 if (ret)
6797                         return ret;
6798         }
6799         return 0;
6800 }
6801
6802 static int selinux_bpf_map(struct bpf_map *map, fmode_t fmode)
6803 {
6804         u32 sid = current_sid();
6805         struct bpf_security_struct *bpfsec;
6806
6807         bpfsec = map->security;
6808         return avc_has_perm(&selinux_state,
6809                             sid, bpfsec->sid, SECCLASS_BPF,
6810                             bpf_map_fmode_to_av(fmode), NULL);
6811 }
6812
6813 static int selinux_bpf_prog(struct bpf_prog *prog)
6814 {
6815         u32 sid = current_sid();
6816         struct bpf_security_struct *bpfsec;
6817
6818         bpfsec = prog->aux->security;
6819         return avc_has_perm(&selinux_state,
6820                             sid, bpfsec->sid, SECCLASS_BPF,
6821                             BPF__PROG_RUN, NULL);
6822 }
6823
6824 static int selinux_bpf_map_alloc(struct bpf_map *map)
6825 {
6826         struct bpf_security_struct *bpfsec;
6827
6828         bpfsec = kzalloc(sizeof(*bpfsec), GFP_KERNEL);
6829         if (!bpfsec)
6830                 return -ENOMEM;
6831
6832         bpfsec->sid = current_sid();
6833         map->security = bpfsec;
6834
6835         return 0;
6836 }
6837
6838 static void selinux_bpf_map_free(struct bpf_map *map)
6839 {
6840         struct bpf_security_struct *bpfsec = map->security;
6841
6842         map->security = NULL;
6843         kfree(bpfsec);
6844 }
6845
6846 static int selinux_bpf_prog_alloc(struct bpf_prog_aux *aux)
6847 {
6848         struct bpf_security_struct *bpfsec;
6849
6850         bpfsec = kzalloc(sizeof(*bpfsec), GFP_KERNEL);
6851         if (!bpfsec)
6852                 return -ENOMEM;
6853
6854         bpfsec->sid = current_sid();
6855         aux->security = bpfsec;
6856
6857         return 0;
6858 }
6859
6860 static void selinux_bpf_prog_free(struct bpf_prog_aux *aux)
6861 {
6862         struct bpf_security_struct *bpfsec = aux->security;
6863
6864         aux->security = NULL;
6865         kfree(bpfsec);
6866 }
6867 #endif
6868
6869 static struct security_hook_list selinux_hooks[] __lsm_ro_after_init = {
6870         LSM_HOOK_INIT(binder_set_context_mgr, selinux_binder_set_context_mgr),
6871         LSM_HOOK_INIT(binder_transaction, selinux_binder_transaction),
6872         LSM_HOOK_INIT(binder_transfer_binder, selinux_binder_transfer_binder),
6873         LSM_HOOK_INIT(binder_transfer_file, selinux_binder_transfer_file),
6874
6875         LSM_HOOK_INIT(ptrace_access_check, selinux_ptrace_access_check),
6876         LSM_HOOK_INIT(ptrace_traceme, selinux_ptrace_traceme),
6877         LSM_HOOK_INIT(capget, selinux_capget),
6878         LSM_HOOK_INIT(capset, selinux_capset),
6879         LSM_HOOK_INIT(capable, selinux_capable),
6880         LSM_HOOK_INIT(quotactl, selinux_quotactl),
6881         LSM_HOOK_INIT(quota_on, selinux_quota_on),
6882         LSM_HOOK_INIT(syslog, selinux_syslog),
6883         LSM_HOOK_INIT(vm_enough_memory, selinux_vm_enough_memory),
6884
6885         LSM_HOOK_INIT(netlink_send, selinux_netlink_send),
6886
6887         LSM_HOOK_INIT(bprm_set_creds, selinux_bprm_set_creds),
6888         LSM_HOOK_INIT(bprm_committing_creds, selinux_bprm_committing_creds),
6889         LSM_HOOK_INIT(bprm_committed_creds, selinux_bprm_committed_creds),
6890
6891         LSM_HOOK_INIT(sb_alloc_security, selinux_sb_alloc_security),
6892         LSM_HOOK_INIT(sb_free_security, selinux_sb_free_security),
6893         LSM_HOOK_INIT(sb_copy_data, selinux_sb_copy_data),
6894         LSM_HOOK_INIT(sb_remount, selinux_sb_remount),
6895         LSM_HOOK_INIT(sb_kern_mount, selinux_sb_kern_mount),
6896         LSM_HOOK_INIT(sb_show_options, selinux_sb_show_options),
6897         LSM_HOOK_INIT(sb_statfs, selinux_sb_statfs),
6898         LSM_HOOK_INIT(sb_mount, selinux_mount),
6899         LSM_HOOK_INIT(sb_umount, selinux_umount),
6900         LSM_HOOK_INIT(sb_set_mnt_opts, selinux_set_mnt_opts),
6901         LSM_HOOK_INIT(sb_clone_mnt_opts, selinux_sb_clone_mnt_opts),
6902         LSM_HOOK_INIT(sb_parse_opts_str, selinux_parse_opts_str),
6903
6904         LSM_HOOK_INIT(dentry_init_security, selinux_dentry_init_security),
6905         LSM_HOOK_INIT(dentry_create_files_as, selinux_dentry_create_files_as),
6906
6907         LSM_HOOK_INIT(inode_alloc_security, selinux_inode_alloc_security),
6908         LSM_HOOK_INIT(inode_free_security, selinux_inode_free_security),
6909         LSM_HOOK_INIT(inode_init_security, selinux_inode_init_security),
6910         LSM_HOOK_INIT(inode_create, selinux_inode_create),
6911         LSM_HOOK_INIT(inode_link, selinux_inode_link),
6912         LSM_HOOK_INIT(inode_unlink, selinux_inode_unlink),
6913         LSM_HOOK_INIT(inode_symlink, selinux_inode_symlink),
6914         LSM_HOOK_INIT(inode_mkdir, selinux_inode_mkdir),
6915         LSM_HOOK_INIT(inode_rmdir, selinux_inode_rmdir),
6916         LSM_HOOK_INIT(inode_mknod, selinux_inode_mknod),
6917         LSM_HOOK_INIT(inode_rename, selinux_inode_rename),
6918         LSM_HOOK_INIT(inode_readlink, selinux_inode_readlink),
6919         LSM_HOOK_INIT(inode_follow_link, selinux_inode_follow_link),
6920         LSM_HOOK_INIT(inode_permission, selinux_inode_permission),
6921         LSM_HOOK_INIT(inode_setattr, selinux_inode_setattr),
6922         LSM_HOOK_INIT(inode_getattr, selinux_inode_getattr),
6923         LSM_HOOK_INIT(inode_setxattr, selinux_inode_setxattr),
6924         LSM_HOOK_INIT(inode_post_setxattr, selinux_inode_post_setxattr),
6925         LSM_HOOK_INIT(inode_getxattr, selinux_inode_getxattr),
6926         LSM_HOOK_INIT(inode_listxattr, selinux_inode_listxattr),
6927         LSM_HOOK_INIT(inode_removexattr, selinux_inode_removexattr),
6928         LSM_HOOK_INIT(inode_getsecurity, selinux_inode_getsecurity),
6929         LSM_HOOK_INIT(inode_setsecurity, selinux_inode_setsecurity),
6930         LSM_HOOK_INIT(inode_listsecurity, selinux_inode_listsecurity),
6931         LSM_HOOK_INIT(inode_getsecid, selinux_inode_getsecid),
6932         LSM_HOOK_INIT(inode_copy_up, selinux_inode_copy_up),
6933         LSM_HOOK_INIT(inode_copy_up_xattr, selinux_inode_copy_up_xattr),
6934
6935         LSM_HOOK_INIT(file_permission, selinux_file_permission),
6936         LSM_HOOK_INIT(file_alloc_security, selinux_file_alloc_security),
6937         LSM_HOOK_INIT(file_free_security, selinux_file_free_security),
6938         LSM_HOOK_INIT(file_ioctl, selinux_file_ioctl),
6939         LSM_HOOK_INIT(mmap_file, selinux_mmap_file),
6940         LSM_HOOK_INIT(mmap_addr, selinux_mmap_addr),
6941         LSM_HOOK_INIT(file_mprotect, selinux_file_mprotect),
6942         LSM_HOOK_INIT(file_lock, selinux_file_lock),
6943         LSM_HOOK_INIT(file_fcntl, selinux_file_fcntl),
6944         LSM_HOOK_INIT(file_set_fowner, selinux_file_set_fowner),
6945         LSM_HOOK_INIT(file_send_sigiotask, selinux_file_send_sigiotask),
6946         LSM_HOOK_INIT(file_receive, selinux_file_receive),
6947
6948         LSM_HOOK_INIT(file_open, selinux_file_open),
6949
6950         LSM_HOOK_INIT(task_alloc, selinux_task_alloc),
6951         LSM_HOOK_INIT(cred_alloc_blank, selinux_cred_alloc_blank),
6952         LSM_HOOK_INIT(cred_free, selinux_cred_free),
6953         LSM_HOOK_INIT(cred_prepare, selinux_cred_prepare),
6954         LSM_HOOK_INIT(cred_transfer, selinux_cred_transfer),
6955         LSM_HOOK_INIT(cred_getsecid, selinux_cred_getsecid),
6956         LSM_HOOK_INIT(kernel_act_as, selinux_kernel_act_as),
6957         LSM_HOOK_INIT(kernel_create_files_as, selinux_kernel_create_files_as),
6958         LSM_HOOK_INIT(kernel_module_request, selinux_kernel_module_request),
6959         LSM_HOOK_INIT(kernel_read_file, selinux_kernel_read_file),
6960         LSM_HOOK_INIT(task_setpgid, selinux_task_setpgid),
6961         LSM_HOOK_INIT(task_getpgid, selinux_task_getpgid),
6962         LSM_HOOK_INIT(task_getsid, selinux_task_getsid),
6963         LSM_HOOK_INIT(task_getsecid, selinux_task_getsecid),
6964         LSM_HOOK_INIT(task_setnice, selinux_task_setnice),
6965         LSM_HOOK_INIT(task_setioprio, selinux_task_setioprio),
6966         LSM_HOOK_INIT(task_getioprio, selinux_task_getioprio),
6967         LSM_HOOK_INIT(task_prlimit, selinux_task_prlimit),
6968         LSM_HOOK_INIT(task_setrlimit, selinux_task_setrlimit),
6969         LSM_HOOK_INIT(task_setscheduler, selinux_task_setscheduler),
6970         LSM_HOOK_INIT(task_getscheduler, selinux_task_getscheduler),
6971         LSM_HOOK_INIT(task_movememory, selinux_task_movememory),
6972         LSM_HOOK_INIT(task_kill, selinux_task_kill),
6973         LSM_HOOK_INIT(task_to_inode, selinux_task_to_inode),
6974
6975         LSM_HOOK_INIT(ipc_permission, selinux_ipc_permission),
6976         LSM_HOOK_INIT(ipc_getsecid, selinux_ipc_getsecid),
6977
6978         LSM_HOOK_INIT(msg_msg_alloc_security, selinux_msg_msg_alloc_security),
6979         LSM_HOOK_INIT(msg_msg_free_security, selinux_msg_msg_free_security),
6980
6981         LSM_HOOK_INIT(msg_queue_alloc_security,
6982                         selinux_msg_queue_alloc_security),
6983         LSM_HOOK_INIT(msg_queue_free_security, selinux_msg_queue_free_security),
6984         LSM_HOOK_INIT(msg_queue_associate, selinux_msg_queue_associate),
6985         LSM_HOOK_INIT(msg_queue_msgctl, selinux_msg_queue_msgctl),
6986         LSM_HOOK_INIT(msg_queue_msgsnd, selinux_msg_queue_msgsnd),
6987         LSM_HOOK_INIT(msg_queue_msgrcv, selinux_msg_queue_msgrcv),
6988
6989         LSM_HOOK_INIT(shm_alloc_security, selinux_shm_alloc_security),
6990         LSM_HOOK_INIT(shm_free_security, selinux_shm_free_security),
6991         LSM_HOOK_INIT(shm_associate, selinux_shm_associate),
6992         LSM_HOOK_INIT(shm_shmctl, selinux_shm_shmctl),
6993         LSM_HOOK_INIT(shm_shmat, selinux_shm_shmat),
6994
6995         LSM_HOOK_INIT(sem_alloc_security, selinux_sem_alloc_security),
6996         LSM_HOOK_INIT(sem_free_security, selinux_sem_free_security),
6997         LSM_HOOK_INIT(sem_associate, selinux_sem_associate),
6998         LSM_HOOK_INIT(sem_semctl, selinux_sem_semctl),
6999         LSM_HOOK_INIT(sem_semop, selinux_sem_semop),
7000
7001         LSM_HOOK_INIT(d_instantiate, selinux_d_instantiate),
7002
7003         LSM_HOOK_INIT(getprocattr, selinux_getprocattr),
7004         LSM_HOOK_INIT(setprocattr, selinux_setprocattr),
7005
7006         LSM_HOOK_INIT(ismaclabel, selinux_ismaclabel),
7007         LSM_HOOK_INIT(secid_to_secctx, selinux_secid_to_secctx),
7008         LSM_HOOK_INIT(secctx_to_secid, selinux_secctx_to_secid),
7009         LSM_HOOK_INIT(release_secctx, selinux_release_secctx),
7010         LSM_HOOK_INIT(inode_invalidate_secctx, selinux_inode_invalidate_secctx),
7011         LSM_HOOK_INIT(inode_notifysecctx, selinux_inode_notifysecctx),
7012         LSM_HOOK_INIT(inode_setsecctx, selinux_inode_setsecctx),
7013         LSM_HOOK_INIT(inode_getsecctx, selinux_inode_getsecctx),
7014
7015         LSM_HOOK_INIT(unix_stream_connect, selinux_socket_unix_stream_connect),
7016         LSM_HOOK_INIT(unix_may_send, selinux_socket_unix_may_send),
7017
7018         LSM_HOOK_INIT(socket_create, selinux_socket_create),
7019         LSM_HOOK_INIT(socket_post_create, selinux_socket_post_create),
7020         LSM_HOOK_INIT(socket_bind, selinux_socket_bind),
7021         LSM_HOOK_INIT(socket_connect, selinux_socket_connect),
7022         LSM_HOOK_INIT(socket_listen, selinux_socket_listen),
7023         LSM_HOOK_INIT(socket_accept, selinux_socket_accept),
7024         LSM_HOOK_INIT(socket_sendmsg, selinux_socket_sendmsg),
7025         LSM_HOOK_INIT(socket_recvmsg, selinux_socket_recvmsg),
7026         LSM_HOOK_INIT(socket_getsockname, selinux_socket_getsockname),
7027         LSM_HOOK_INIT(socket_getpeername, selinux_socket_getpeername),
7028         LSM_HOOK_INIT(socket_getsockopt, selinux_socket_getsockopt),
7029         LSM_HOOK_INIT(socket_setsockopt, selinux_socket_setsockopt),
7030         LSM_HOOK_INIT(socket_shutdown, selinux_socket_shutdown),
7031         LSM_HOOK_INIT(socket_sock_rcv_skb, selinux_socket_sock_rcv_skb),
7032         LSM_HOOK_INIT(socket_getpeersec_stream,
7033                         selinux_socket_getpeersec_stream),
7034         LSM_HOOK_INIT(socket_getpeersec_dgram, selinux_socket_getpeersec_dgram),
7035         LSM_HOOK_INIT(sk_alloc_security, selinux_sk_alloc_security),
7036         LSM_HOOK_INIT(sk_free_security, selinux_sk_free_security),
7037         LSM_HOOK_INIT(sk_clone_security, selinux_sk_clone_security),
7038         LSM_HOOK_INIT(sk_getsecid, selinux_sk_getsecid),
7039         LSM_HOOK_INIT(sock_graft, selinux_sock_graft),
7040         LSM_HOOK_INIT(sctp_assoc_request, selinux_sctp_assoc_request),
7041         LSM_HOOK_INIT(sctp_sk_clone, selinux_sctp_sk_clone),
7042         LSM_HOOK_INIT(sctp_bind_connect, selinux_sctp_bind_connect),
7043         LSM_HOOK_INIT(inet_conn_request, selinux_inet_conn_request),
7044         LSM_HOOK_INIT(inet_csk_clone, selinux_inet_csk_clone),
7045         LSM_HOOK_INIT(inet_conn_established, selinux_inet_conn_established),
7046         LSM_HOOK_INIT(secmark_relabel_packet, selinux_secmark_relabel_packet),
7047         LSM_HOOK_INIT(secmark_refcount_inc, selinux_secmark_refcount_inc),
7048         LSM_HOOK_INIT(secmark_refcount_dec, selinux_secmark_refcount_dec),
7049         LSM_HOOK_INIT(req_classify_flow, selinux_req_classify_flow),
7050         LSM_HOOK_INIT(tun_dev_alloc_security, selinux_tun_dev_alloc_security),
7051         LSM_HOOK_INIT(tun_dev_free_security, selinux_tun_dev_free_security),
7052         LSM_HOOK_INIT(tun_dev_create, selinux_tun_dev_create),
7053         LSM_HOOK_INIT(tun_dev_attach_queue, selinux_tun_dev_attach_queue),
7054         LSM_HOOK_INIT(tun_dev_attach, selinux_tun_dev_attach),
7055         LSM_HOOK_INIT(tun_dev_open, selinux_tun_dev_open),
7056 #ifdef CONFIG_SECURITY_INFINIBAND
7057         LSM_HOOK_INIT(ib_pkey_access, selinux_ib_pkey_access),
7058         LSM_HOOK_INIT(ib_endport_manage_subnet,
7059                       selinux_ib_endport_manage_subnet),
7060         LSM_HOOK_INIT(ib_alloc_security, selinux_ib_alloc_security),
7061         LSM_HOOK_INIT(ib_free_security, selinux_ib_free_security),
7062 #endif
7063 #ifdef CONFIG_SECURITY_NETWORK_XFRM
7064         LSM_HOOK_INIT(xfrm_policy_alloc_security, selinux_xfrm_policy_alloc),
7065         LSM_HOOK_INIT(xfrm_policy_clone_security, selinux_xfrm_policy_clone),
7066         LSM_HOOK_INIT(xfrm_policy_free_security, selinux_xfrm_policy_free),
7067         LSM_HOOK_INIT(xfrm_policy_delete_security, selinux_xfrm_policy_delete),
7068         LSM_HOOK_INIT(xfrm_state_alloc, selinux_xfrm_state_alloc),
7069         LSM_HOOK_INIT(xfrm_state_alloc_acquire,
7070                         selinux_xfrm_state_alloc_acquire),
7071         LSM_HOOK_INIT(xfrm_state_free_security, selinux_xfrm_state_free),
7072         LSM_HOOK_INIT(xfrm_state_delete_security, selinux_xfrm_state_delete),
7073         LSM_HOOK_INIT(xfrm_policy_lookup, selinux_xfrm_policy_lookup),
7074         LSM_HOOK_INIT(xfrm_state_pol_flow_match,
7075                         selinux_xfrm_state_pol_flow_match),
7076         LSM_HOOK_INIT(xfrm_decode_session, selinux_xfrm_decode_session),
7077 #endif
7078
7079 #ifdef CONFIG_KEYS
7080         LSM_HOOK_INIT(key_alloc, selinux_key_alloc),
7081         LSM_HOOK_INIT(key_free, selinux_key_free),
7082         LSM_HOOK_INIT(key_permission, selinux_key_permission),
7083         LSM_HOOK_INIT(key_getsecurity, selinux_key_getsecurity),
7084 #endif
7085
7086 #ifdef CONFIG_AUDIT
7087         LSM_HOOK_INIT(audit_rule_init, selinux_audit_rule_init),
7088         LSM_HOOK_INIT(audit_rule_known, selinux_audit_rule_known),
7089         LSM_HOOK_INIT(audit_rule_match, selinux_audit_rule_match),
7090         LSM_HOOK_INIT(audit_rule_free, selinux_audit_rule_free),
7091 #endif
7092
7093 #ifdef CONFIG_BPF_SYSCALL
7094         LSM_HOOK_INIT(bpf, selinux_bpf),
7095         LSM_HOOK_INIT(bpf_map, selinux_bpf_map),
7096         LSM_HOOK_INIT(bpf_prog, selinux_bpf_prog),
7097         LSM_HOOK_INIT(bpf_map_alloc_security, selinux_bpf_map_alloc),
7098         LSM_HOOK_INIT(bpf_prog_alloc_security, selinux_bpf_prog_alloc),
7099         LSM_HOOK_INIT(bpf_map_free_security, selinux_bpf_map_free),
7100         LSM_HOOK_INIT(bpf_prog_free_security, selinux_bpf_prog_free),
7101 #endif
7102 };
7103
7104 static __init int selinux_init(void)
7105 {
7106         if (!security_module_enable("selinux")) {
7107                 selinux_enabled = 0;
7108                 return 0;
7109         }
7110
7111         if (!selinux_enabled) {
7112                 printk(KERN_INFO "SELinux:  Disabled at boot.\n");
7113                 return 0;
7114         }
7115
7116         printk(KERN_INFO "SELinux:  Initializing.\n");
7117
7118         memset(&selinux_state, 0, sizeof(selinux_state));
7119         enforcing_set(&selinux_state, selinux_enforcing_boot);
7120         selinux_state.checkreqprot = selinux_checkreqprot_boot;
7121         selinux_ss_init(&selinux_state.ss);
7122         selinux_avc_init(&selinux_state.avc);
7123
7124         /* Set the security state for the initial task. */
7125         cred_init_security();
7126
7127         default_noexec = !(VM_DATA_DEFAULT_FLAGS & VM_EXEC);
7128
7129         sel_inode_cache = kmem_cache_create("selinux_inode_security",
7130                                             sizeof(struct inode_security_struct),
7131                                             0, SLAB_PANIC, NULL);
7132         file_security_cache = kmem_cache_create("selinux_file_security",
7133                                             sizeof(struct file_security_struct),
7134                                             0, SLAB_PANIC, NULL);
7135         avc_init();
7136
7137         avtab_cache_init();
7138
7139         ebitmap_cache_init();
7140
7141         hashtab_cache_init();
7142
7143         security_add_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks), "selinux");
7144
7145         if (avc_add_callback(selinux_netcache_avc_callback, AVC_CALLBACK_RESET))
7146                 panic("SELinux: Unable to register AVC netcache callback\n");
7147
7148         if (avc_add_callback(selinux_lsm_notifier_avc_callback, AVC_CALLBACK_RESET))
7149                 panic("SELinux: Unable to register AVC LSM notifier callback\n");
7150
7151         if (selinux_enforcing_boot)
7152                 printk(KERN_DEBUG "SELinux:  Starting in enforcing mode\n");
7153         else
7154                 printk(KERN_DEBUG "SELinux:  Starting in permissive mode\n");
7155
7156         return 0;
7157 }
7158
7159 static void delayed_superblock_init(struct super_block *sb, void *unused)
7160 {
7161         superblock_doinit(sb, NULL);
7162 }
7163
7164 void selinux_complete_init(void)
7165 {
7166         printk(KERN_DEBUG "SELinux:  Completing initialization.\n");
7167
7168         /* Set up any superblocks initialized prior to the policy load. */
7169         printk(KERN_DEBUG "SELinux:  Setting up existing superblocks.\n");
7170         iterate_supers(delayed_superblock_init, NULL);
7171 }
7172
7173 /* SELinux requires early initialization in order to label
7174    all processes and objects when they are created. */
7175 security_initcall(selinux_init);
7176
7177 #if defined(CONFIG_NETFILTER)
7178
7179 static const struct nf_hook_ops selinux_nf_ops[] = {
7180         {
7181                 .hook =         selinux_ipv4_postroute,
7182                 .pf =           NFPROTO_IPV4,
7183                 .hooknum =      NF_INET_POST_ROUTING,
7184                 .priority =     NF_IP_PRI_SELINUX_LAST,
7185         },
7186         {
7187                 .hook =         selinux_ipv4_forward,
7188                 .pf =           NFPROTO_IPV4,
7189                 .hooknum =      NF_INET_FORWARD,
7190                 .priority =     NF_IP_PRI_SELINUX_FIRST,
7191         },
7192         {
7193                 .hook =         selinux_ipv4_output,
7194                 .pf =           NFPROTO_IPV4,
7195                 .hooknum =      NF_INET_LOCAL_OUT,
7196                 .priority =     NF_IP_PRI_SELINUX_FIRST,
7197         },
7198 #if IS_ENABLED(CONFIG_IPV6)
7199         {
7200                 .hook =         selinux_ipv6_postroute,
7201                 .pf =           NFPROTO_IPV6,
7202                 .hooknum =      NF_INET_POST_ROUTING,
7203                 .priority =     NF_IP6_PRI_SELINUX_LAST,
7204         },
7205         {
7206                 .hook =         selinux_ipv6_forward,
7207                 .pf =           NFPROTO_IPV6,
7208                 .hooknum =      NF_INET_FORWARD,
7209                 .priority =     NF_IP6_PRI_SELINUX_FIRST,
7210         },
7211         {
7212                 .hook =         selinux_ipv6_output,
7213                 .pf =           NFPROTO_IPV6,
7214                 .hooknum =      NF_INET_LOCAL_OUT,
7215                 .priority =     NF_IP6_PRI_SELINUX_FIRST,
7216         },
7217 #endif  /* IPV6 */
7218 };
7219
7220 static int __net_init selinux_nf_register(struct net *net)
7221 {
7222         return nf_register_net_hooks(net, selinux_nf_ops,
7223                                      ARRAY_SIZE(selinux_nf_ops));
7224 }
7225
7226 static void __net_exit selinux_nf_unregister(struct net *net)
7227 {
7228         nf_unregister_net_hooks(net, selinux_nf_ops,
7229                                 ARRAY_SIZE(selinux_nf_ops));
7230 }
7231
7232 static struct pernet_operations selinux_net_ops = {
7233         .init = selinux_nf_register,
7234         .exit = selinux_nf_unregister,
7235 };
7236
7237 static int __init selinux_nf_ip_init(void)
7238 {
7239         int err;
7240
7241         if (!selinux_enabled)
7242                 return 0;
7243
7244         printk(KERN_DEBUG "SELinux:  Registering netfilter hooks\n");
7245
7246         err = register_pernet_subsys(&selinux_net_ops);
7247         if (err)
7248                 panic("SELinux: register_pernet_subsys: error %d\n", err);
7249
7250         return 0;
7251 }
7252 __initcall(selinux_nf_ip_init);
7253
7254 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
7255 static void selinux_nf_ip_exit(void)
7256 {
7257         printk(KERN_DEBUG "SELinux:  Unregistering netfilter hooks\n");
7258
7259         unregister_pernet_subsys(&selinux_net_ops);
7260 }
7261 #endif
7262
7263 #else /* CONFIG_NETFILTER */
7264
7265 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
7266 #define selinux_nf_ip_exit()
7267 #endif
7268
7269 #endif /* CONFIG_NETFILTER */
7270
7271 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
7272 int selinux_disable(struct selinux_state *state)
7273 {
7274         if (state->initialized) {
7275                 /* Not permitted after initial policy load. */
7276                 return -EINVAL;
7277         }
7278
7279         if (state->disabled) {
7280                 /* Only do this once. */
7281                 return -EINVAL;
7282         }
7283
7284         state->disabled = 1;
7285
7286         printk(KERN_INFO "SELinux:  Disabled at runtime.\n");
7287
7288         selinux_enabled = 0;
7289
7290         security_delete_hooks(selinux_hooks, ARRAY_SIZE(selinux_hooks));
7291
7292         /* Try to destroy the avc node cache */
7293         avc_disable();
7294
7295         /* Unregister netfilter hooks. */
7296         selinux_nf_ip_exit();
7297
7298         /* Unregister selinuxfs. */
7299         exit_sel_fs();
7300
7301         return 0;
7302 }
7303 #endif
This page took 0.439179 seconds and 4 git commands to generate.