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