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