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