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