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