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