1
2
3
4
5
6
7
8
9
10#include <linux/capability.h>
11#include <linux/audit.h>
12#include <linux/module.h>
13#include <linux/init.h>
14#include <linux/kernel.h>
15#include <linux/security.h>
16#include <linux/file.h>
17#include <linux/mm.h>
18#include <linux/mman.h>
19#include <linux/pagemap.h>
20#include <linux/swap.h>
21#include <linux/skbuff.h>
22#include <linux/netlink.h>
23#include <linux/ptrace.h>
24#include <linux/xattr.h>
25#include <linux/hugetlb.h>
26#include <linux/mount.h>
27#include <linux/sched.h>
28#include <linux/prctl.h>
29#include <linux/securebits.h>
30#include <linux/user_namespace.h>
31#include <linux/binfmts.h>
32#include <linux/personality.h>
33
34
35
36
37
38
39
40
41
42
43
44
45static void warn_setuid_and_fcaps_mixed(const char *fname)
46{
47 static int warned;
48 if (!warned) {
49 printk(KERN_INFO "warning: `%s' has both setuid-root and"
50 " effective capabilities. Therefore not raising all"
51 " capabilities.\n", fname);
52 warned = 1;
53 }
54}
55
56int cap_netlink_send(struct sock *sk, struct sk_buff *skb)
57{
58 return 0;
59}
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76int cap_capable(const struct cred *cred, struct user_namespace *targ_ns,
77 int cap, int audit)
78{
79 for (;;) {
80
81 if (targ_ns != &init_user_ns && uid_eq(targ_ns->owner, cred->euid))
82 return 0;
83
84
85 if (targ_ns == cred->user_ns)
86 return cap_raised(cred->cap_effective, cap) ? 0 : -EPERM;
87
88
89 if (targ_ns == &init_user_ns)
90 return -EPERM;
91
92
93
94
95
96 targ_ns = targ_ns->parent;
97 }
98
99
100}
101
102
103
104
105
106
107
108
109
110int cap_settime(const struct timespec *ts, const struct timezone *tz)
111{
112 if (!capable(CAP_SYS_TIME))
113 return -EPERM;
114 return 0;
115}
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132int cap_ptrace_access_check(struct task_struct *child, unsigned int mode)
133{
134 int ret = 0;
135 const struct cred *cred, *child_cred;
136
137 rcu_read_lock();
138 cred = current_cred();
139 child_cred = __task_cred(child);
140 if (cred->user_ns == child_cred->user_ns &&
141 cap_issubset(child_cred->cap_permitted, cred->cap_permitted))
142 goto out;
143 if (ns_capable(child_cred->user_ns, CAP_SYS_PTRACE))
144 goto out;
145 ret = -EPERM;
146out:
147 rcu_read_unlock();
148 return ret;
149}
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164int cap_ptrace_traceme(struct task_struct *parent)
165{
166 int ret = 0;
167 const struct cred *cred, *child_cred;
168
169 rcu_read_lock();
170 cred = __task_cred(parent);
171 child_cred = current_cred();
172 if (cred->user_ns == child_cred->user_ns &&
173 cap_issubset(child_cred->cap_permitted, cred->cap_permitted))
174 goto out;
175 if (has_ns_capability(parent, child_cred->user_ns, CAP_SYS_PTRACE))
176 goto out;
177 ret = -EPERM;
178out:
179 rcu_read_unlock();
180 return ret;
181}
182
183
184
185
186
187
188
189
190
191
192
193int cap_capget(struct task_struct *target, kernel_cap_t *effective,
194 kernel_cap_t *inheritable, kernel_cap_t *permitted)
195{
196 const struct cred *cred;
197
198
199 rcu_read_lock();
200 cred = __task_cred(target);
201 *effective = cred->cap_effective;
202 *inheritable = cred->cap_inheritable;
203 *permitted = cred->cap_permitted;
204 rcu_read_unlock();
205 return 0;
206}
207
208
209
210
211
212static inline int cap_inh_is_capped(void)
213{
214
215
216
217
218 if (cap_capable(current_cred(), current_cred()->user_ns,
219 CAP_SETPCAP, SECURITY_CAP_AUDIT) == 0)
220 return 0;
221 return 1;
222}
223
224
225
226
227
228
229
230
231
232
233
234
235
236int cap_capset(struct cred *new,
237 const struct cred *old,
238 const kernel_cap_t *effective,
239 const kernel_cap_t *inheritable,
240 const kernel_cap_t *permitted)
241{
242 if (cap_inh_is_capped() &&
243 !cap_issubset(*inheritable,
244 cap_combine(old->cap_inheritable,
245 old->cap_permitted)))
246
247 return -EPERM;
248
249 if (!cap_issubset(*inheritable,
250 cap_combine(old->cap_inheritable,
251 old->cap_bset)))
252
253 return -EPERM;
254
255
256 if (!cap_issubset(*permitted, old->cap_permitted))
257 return -EPERM;
258
259
260 if (!cap_issubset(*effective, *permitted))
261 return -EPERM;
262
263 new->cap_effective = *effective;
264 new->cap_inheritable = *inheritable;
265 new->cap_permitted = *permitted;
266 return 0;
267}
268
269
270
271
272static inline void bprm_clear_caps(struct linux_binprm *bprm)
273{
274 cap_clear(bprm->cred->cap_permitted);
275 bprm->cap_effective = false;
276}
277
278
279
280
281
282
283
284
285
286
287
288
289int cap_inode_need_killpriv(struct dentry *dentry)
290{
291 struct inode *inode = dentry->d_inode;
292 int error;
293
294 if (!inode->i_op->getxattr)
295 return 0;
296
297 error = inode->i_op->getxattr(dentry, XATTR_NAME_CAPS, NULL, 0);
298 if (error <= 0)
299 return 0;
300 return 1;
301}
302
303
304
305
306
307
308
309
310
311int cap_inode_killpriv(struct dentry *dentry)
312{
313 struct inode *inode = dentry->d_inode;
314
315 if (!inode->i_op->removexattr)
316 return 0;
317
318 return inode->i_op->removexattr(dentry, XATTR_NAME_CAPS);
319}
320
321
322
323
324
325static inline int bprm_caps_from_vfs_caps(struct cpu_vfs_cap_data *caps,
326 struct linux_binprm *bprm,
327 bool *effective,
328 bool *has_cap)
329{
330 struct cred *new = bprm->cred;
331 unsigned i;
332 int ret = 0;
333
334 if (caps->magic_etc & VFS_CAP_FLAGS_EFFECTIVE)
335 *effective = true;
336
337 if (caps->magic_etc & VFS_CAP_REVISION_MASK)
338 *has_cap = true;
339
340 CAP_FOR_EACH_U32(i) {
341 __u32 permitted = caps->permitted.cap[i];
342 __u32 inheritable = caps->inheritable.cap[i];
343
344
345
346
347 new->cap_permitted.cap[i] =
348 (new->cap_bset.cap[i] & permitted) |
349 (new->cap_inheritable.cap[i] & inheritable);
350
351 if (permitted & ~new->cap_permitted.cap[i])
352
353 ret = -EPERM;
354 }
355
356
357
358
359
360
361 return *effective ? ret : 0;
362}
363
364
365
366
367int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data *cpu_caps)
368{
369 struct inode *inode = dentry->d_inode;
370 __u32 magic_etc;
371 unsigned tocopy, i;
372 int size;
373 struct vfs_cap_data caps;
374
375 memset(cpu_caps, 0, sizeof(struct cpu_vfs_cap_data));
376
377 if (!inode || !inode->i_op->getxattr)
378 return -ENODATA;
379
380 size = inode->i_op->getxattr((struct dentry *)dentry, XATTR_NAME_CAPS, &caps,
381 XATTR_CAPS_SZ);
382 if (size == -ENODATA || size == -EOPNOTSUPP)
383
384 return -ENODATA;
385 if (size < 0)
386 return size;
387
388 if (size < sizeof(magic_etc))
389 return -EINVAL;
390
391 cpu_caps->magic_etc = magic_etc = le32_to_cpu(caps.magic_etc);
392
393 switch (magic_etc & VFS_CAP_REVISION_MASK) {
394 case VFS_CAP_REVISION_1:
395 if (size != XATTR_CAPS_SZ_1)
396 return -EINVAL;
397 tocopy = VFS_CAP_U32_1;
398 break;
399 case VFS_CAP_REVISION_2:
400 if (size != XATTR_CAPS_SZ_2)
401 return -EINVAL;
402 tocopy = VFS_CAP_U32_2;
403 break;
404 default:
405 return -EINVAL;
406 }
407
408 CAP_FOR_EACH_U32(i) {
409 if (i >= tocopy)
410 break;
411 cpu_caps->permitted.cap[i] = le32_to_cpu(caps.data[i].permitted);
412 cpu_caps->inheritable.cap[i] = le32_to_cpu(caps.data[i].inheritable);
413 }
414
415 return 0;
416}
417
418
419
420
421
422
423static int get_file_caps(struct linux_binprm *bprm, bool *effective, bool *has_cap)
424{
425 struct dentry *dentry;
426 int rc = 0;
427 struct cpu_vfs_cap_data vcaps;
428
429 bprm_clear_caps(bprm);
430
431 if (!file_caps_enabled)
432 return 0;
433
434 if (bprm->file->f_vfsmnt->mnt_flags & MNT_NOSUID)
435 return 0;
436
437 dentry = dget(bprm->file->f_dentry);
438
439 rc = get_vfs_caps_from_disk(dentry, &vcaps);
440 if (rc < 0) {
441 if (rc == -EINVAL)
442 printk(KERN_NOTICE "%s: get_vfs_caps_from_disk returned %d for %s\n",
443 __func__, rc, bprm->filename);
444 else if (rc == -ENODATA)
445 rc = 0;
446 goto out;
447 }
448
449 rc = bprm_caps_from_vfs_caps(&vcaps, bprm, effective, has_cap);
450 if (rc == -EINVAL)
451 printk(KERN_NOTICE "%s: cap_from_disk returned %d for %s\n",
452 __func__, rc, bprm->filename);
453
454out:
455 dput(dentry);
456 if (rc)
457 bprm_clear_caps(bprm);
458
459 return rc;
460}
461
462
463
464
465
466
467
468
469
470int cap_bprm_set_creds(struct linux_binprm *bprm)
471{
472 const struct cred *old = current_cred();
473 struct cred *new = bprm->cred;
474 bool effective, has_cap = false;
475 int ret;
476 kuid_t root_uid;
477
478 effective = false;
479 ret = get_file_caps(bprm, &effective, &has_cap);
480 if (ret < 0)
481 return ret;
482
483 root_uid = make_kuid(new->user_ns, 0);
484
485 if (!issecure(SECURE_NOROOT)) {
486
487
488
489
490
491 if (has_cap && !uid_eq(new->uid, root_uid) && uid_eq(new->euid, root_uid)) {
492 warn_setuid_and_fcaps_mixed(bprm->filename);
493 goto skip;
494 }
495
496
497
498
499
500
501
502 if (uid_eq(new->euid, root_uid) || uid_eq(new->uid, root_uid)) {
503
504 new->cap_permitted = cap_combine(old->cap_bset,
505 old->cap_inheritable);
506 }
507 if (uid_eq(new->euid, root_uid))
508 effective = true;
509 }
510skip:
511
512
513 if (!cap_issubset(new->cap_permitted, old->cap_permitted))
514 bprm->per_clear |= PER_CLEAR_ON_SETID;
515
516
517
518
519
520
521
522 if ((!uid_eq(new->euid, old->uid) ||
523 !gid_eq(new->egid, old->gid) ||
524 !cap_issubset(new->cap_permitted, old->cap_permitted)) &&
525 bprm->unsafe & ~LSM_UNSAFE_PTRACE_CAP) {
526
527 if (!capable(CAP_SETUID) ||
528 (bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS)) {
529 new->euid = new->uid;
530 new->egid = new->gid;
531 }
532 new->cap_permitted = cap_intersect(new->cap_permitted,
533 old->cap_permitted);
534 }
535
536 new->suid = new->fsuid = new->euid;
537 new->sgid = new->fsgid = new->egid;
538
539 if (effective)
540 new->cap_effective = new->cap_permitted;
541 else
542 cap_clear(new->cap_effective);
543 bprm->cap_effective = effective;
544
545
546
547
548
549
550
551
552
553
554
555
556
557 if (!cap_isclear(new->cap_effective)) {
558 if (!cap_issubset(CAP_FULL_SET, new->cap_effective) ||
559 !uid_eq(new->euid, root_uid) || !uid_eq(new->uid, root_uid) ||
560 issecure(SECURE_NOROOT)) {
561 ret = audit_log_bprm_fcaps(bprm, new, old);
562 if (ret < 0)
563 return ret;
564 }
565 }
566
567 new->securebits &= ~issecure_mask(SECURE_KEEP_CAPS);
568 return 0;
569}
570
571
572
573
574
575
576
577
578
579
580
581int cap_bprm_secureexec(struct linux_binprm *bprm)
582{
583 const struct cred *cred = current_cred();
584 kuid_t root_uid = make_kuid(cred->user_ns, 0);
585
586 if (!uid_eq(cred->uid, root_uid)) {
587 if (bprm->cap_effective)
588 return 1;
589 if (!cap_isclear(cred->cap_permitted))
590 return 1;
591 }
592
593 return (!uid_eq(cred->euid, cred->uid) ||
594 !gid_eq(cred->egid, cred->gid));
595}
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611int cap_inode_setxattr(struct dentry *dentry, const char *name,
612 const void *value, size_t size, int flags)
613{
614 if (!strcmp(name, XATTR_NAME_CAPS)) {
615 if (!capable(CAP_SETFCAP))
616 return -EPERM;
617 return 0;
618 }
619
620 if (!strncmp(name, XATTR_SECURITY_PREFIX,
621 sizeof(XATTR_SECURITY_PREFIX) - 1) &&
622 !capable(CAP_SYS_ADMIN))
623 return -EPERM;
624 return 0;
625}
626
627
628
629
630
631
632
633
634
635
636
637
638int cap_inode_removexattr(struct dentry *dentry, const char *name)
639{
640 if (!strcmp(name, XATTR_NAME_CAPS)) {
641 if (!capable(CAP_SETFCAP))
642 return -EPERM;
643 return 0;
644 }
645
646 if (!strncmp(name, XATTR_SECURITY_PREFIX,
647 sizeof(XATTR_SECURITY_PREFIX) - 1) &&
648 !capable(CAP_SYS_ADMIN))
649 return -EPERM;
650 return 0;
651}
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682static inline void cap_emulate_setxuid(struct cred *new, const struct cred *old)
683{
684 kuid_t root_uid = make_kuid(old->user_ns, 0);
685
686 if ((uid_eq(old->uid, root_uid) ||
687 uid_eq(old->euid, root_uid) ||
688 uid_eq(old->suid, root_uid)) &&
689 (!uid_eq(new->uid, root_uid) &&
690 !uid_eq(new->euid, root_uid) &&
691 !uid_eq(new->suid, root_uid)) &&
692 !issecure(SECURE_KEEP_CAPS)) {
693 cap_clear(new->cap_permitted);
694 cap_clear(new->cap_effective);
695 }
696 if (uid_eq(old->euid, root_uid) && !uid_eq(new->euid, root_uid))
697 cap_clear(new->cap_effective);
698 if (!uid_eq(old->euid, root_uid) && uid_eq(new->euid, root_uid))
699 new->cap_effective = new->cap_permitted;
700}
701
702
703
704
705
706
707
708
709
710
711int cap_task_fix_setuid(struct cred *new, const struct cred *old, int flags)
712{
713 switch (flags) {
714 case LSM_SETID_RE:
715 case LSM_SETID_ID:
716 case LSM_SETID_RES:
717
718
719 if (!issecure(SECURE_NO_SETUID_FIXUP))
720 cap_emulate_setxuid(new, old);
721 break;
722
723 case LSM_SETID_FS:
724
725
726
727
728
729
730 if (!issecure(SECURE_NO_SETUID_FIXUP)) {
731 kuid_t root_uid = make_kuid(old->user_ns, 0);
732 if (uid_eq(old->fsuid, root_uid) && !uid_eq(new->fsuid, root_uid))
733 new->cap_effective =
734 cap_drop_fs_set(new->cap_effective);
735
736 if (!uid_eq(old->fsuid, root_uid) && uid_eq(new->fsuid, root_uid))
737 new->cap_effective =
738 cap_raise_fs_set(new->cap_effective,
739 new->cap_permitted);
740 }
741 break;
742
743 default:
744 return -EINVAL;
745 }
746
747 return 0;
748}
749
750
751
752
753
754
755
756
757
758
759
760static int cap_safe_nice(struct task_struct *p)
761{
762 int is_subset;
763
764 rcu_read_lock();
765 is_subset = cap_issubset(__task_cred(p)->cap_permitted,
766 current_cred()->cap_permitted);
767 rcu_read_unlock();
768
769 if (!is_subset && !capable(CAP_SYS_NICE))
770 return -EPERM;
771 return 0;
772}
773
774
775
776
777
778
779
780
781int cap_task_setscheduler(struct task_struct *p)
782{
783 return cap_safe_nice(p);
784}
785
786
787
788
789
790
791
792
793
794int cap_task_setioprio(struct task_struct *p, int ioprio)
795{
796 return cap_safe_nice(p);
797}
798
799
800
801
802
803
804
805
806
807int cap_task_setnice(struct task_struct *p, int nice)
808{
809 return cap_safe_nice(p);
810}
811
812
813
814
815
816static long cap_prctl_drop(struct cred *new, unsigned long cap)
817{
818 if (!capable(CAP_SETPCAP))
819 return -EPERM;
820 if (!cap_valid(cap))
821 return -EINVAL;
822
823 cap_lower(new->cap_bset, cap);
824 return 0;
825}
826
827
828
829
830
831
832
833
834
835
836
837
838
839int cap_task_prctl(int option, unsigned long arg2, unsigned long arg3,
840 unsigned long arg4, unsigned long arg5)
841{
842 struct cred *new;
843 long error = 0;
844
845 new = prepare_creds();
846 if (!new)
847 return -ENOMEM;
848
849 switch (option) {
850 case PR_CAPBSET_READ:
851 error = -EINVAL;
852 if (!cap_valid(arg2))
853 goto error;
854 error = !!cap_raised(new->cap_bset, arg2);
855 goto no_change;
856
857 case PR_CAPBSET_DROP:
858 error = cap_prctl_drop(new, arg2);
859 if (error < 0)
860 goto error;
861 goto changed;
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882 case PR_SET_SECUREBITS:
883 error = -EPERM;
884 if ((((new->securebits & SECURE_ALL_LOCKS) >> 1)
885 & (new->securebits ^ arg2))
886 || ((new->securebits & SECURE_ALL_LOCKS & ~arg2))
887 || (arg2 & ~(SECURE_ALL_LOCKS | SECURE_ALL_BITS))
888 || (cap_capable(current_cred(),
889 current_cred()->user_ns, CAP_SETPCAP,
890 SECURITY_CAP_AUDIT) != 0)
891
892
893
894
895
896
897
898 )
899
900 goto error;
901 new->securebits = arg2;
902 goto changed;
903
904 case PR_GET_SECUREBITS:
905 error = new->securebits;
906 goto no_change;
907
908 case PR_GET_KEEPCAPS:
909 if (issecure(SECURE_KEEP_CAPS))
910 error = 1;
911 goto no_change;
912
913 case PR_SET_KEEPCAPS:
914 error = -EINVAL;
915 if (arg2 > 1)
916 goto error;
917 error = -EPERM;
918 if (issecure(SECURE_KEEP_CAPS_LOCKED))
919 goto error;
920 if (arg2)
921 new->securebits |= issecure_mask(SECURE_KEEP_CAPS);
922 else
923 new->securebits &= ~issecure_mask(SECURE_KEEP_CAPS);
924 goto changed;
925
926 default:
927
928 error = -ENOSYS;
929 goto error;
930 }
931
932
933changed:
934 return commit_creds(new);
935
936no_change:
937error:
938 abort_creds(new);
939 return error;
940}
941
942
943
944
945
946
947
948
949
950int cap_vm_enough_memory(struct mm_struct *mm, long pages)
951{
952 int cap_sys_admin = 0;
953
954 if (cap_capable(current_cred(), &init_user_ns, CAP_SYS_ADMIN,
955 SECURITY_CAP_NOAUDIT) == 0)
956 cap_sys_admin = 1;
957 return __vm_enough_memory(mm, pages, cap_sys_admin);
958}
959
960
961
962
963
964
965
966
967
968
969int cap_mmap_addr(unsigned long addr)
970{
971 int ret = 0;
972
973 if (addr < dac_mmap_min_addr) {
974 ret = cap_capable(current_cred(), &init_user_ns, CAP_SYS_RAWIO,
975 SECURITY_CAP_AUDIT);
976
977 if (ret == 0)
978 current->flags |= PF_SUPERPRIV;
979 }
980 return ret;
981}
982
983int cap_mmap_file(struct file *file, unsigned long reqprot,
984 unsigned long prot, unsigned long flags)
985{
986 return 0;
987}
988