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