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/lsm_hooks.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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71int cap_capable(const struct cred *cred, struct user_namespace *targ_ns,
72 int cap, int audit)
73{
74 struct user_namespace *ns = targ_ns;
75
76
77
78
79
80 for (;;) {
81
82 if (ns == cred->user_ns)
83 return cap_raised(cred->cap_effective, cap) ? 0 : -EPERM;
84
85
86
87
88
89 if (ns->level <= cred->user_ns->level)
90 return -EPERM;
91
92
93
94
95
96 if ((ns->parent == cred->user_ns) && uid_eq(ns->owner, cred->euid))
97 return 0;
98
99
100
101
102
103 ns = ns->parent;
104 }
105
106
107}
108
109
110
111
112
113
114
115
116
117int cap_settime(const struct timespec64 *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 const kernel_cap_t *caller_caps;
144
145 rcu_read_lock();
146 cred = current_cred();
147 child_cred = __task_cred(child);
148 if (mode & PTRACE_MODE_FSCREDS)
149 caller_caps = &cred->cap_effective;
150 else
151 caller_caps = &cred->cap_permitted;
152 if (cred->user_ns == child_cred->user_ns &&
153 cap_issubset(child_cred->cap_permitted, *caller_caps))
154 goto out;
155 if (ns_capable(child_cred->user_ns, CAP_SYS_PTRACE))
156 goto out;
157 ret = -EPERM;
158out:
159 rcu_read_unlock();
160 return ret;
161}
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176int cap_ptrace_traceme(struct task_struct *parent)
177{
178 int ret = 0;
179 const struct cred *cred, *child_cred;
180
181 rcu_read_lock();
182 cred = __task_cred(parent);
183 child_cred = current_cred();
184 if (cred->user_ns == child_cred->user_ns &&
185 cap_issubset(child_cred->cap_permitted, cred->cap_permitted))
186 goto out;
187 if (has_ns_capability(parent, child_cred->user_ns, CAP_SYS_PTRACE))
188 goto out;
189 ret = -EPERM;
190out:
191 rcu_read_unlock();
192 return ret;
193}
194
195
196
197
198
199
200
201
202
203
204
205int cap_capget(struct task_struct *target, kernel_cap_t *effective,
206 kernel_cap_t *inheritable, kernel_cap_t *permitted)
207{
208 const struct cred *cred;
209
210
211 rcu_read_lock();
212 cred = __task_cred(target);
213 *effective = cred->cap_effective;
214 *inheritable = cred->cap_inheritable;
215 *permitted = cred->cap_permitted;
216 rcu_read_unlock();
217 return 0;
218}
219
220
221
222
223
224static inline int cap_inh_is_capped(void)
225{
226
227
228
229
230 if (cap_capable(current_cred(), current_cred()->user_ns,
231 CAP_SETPCAP, SECURITY_CAP_AUDIT) == 0)
232 return 0;
233 return 1;
234}
235
236
237
238
239
240
241
242
243
244
245
246
247
248int cap_capset(struct cred *new,
249 const struct cred *old,
250 const kernel_cap_t *effective,
251 const kernel_cap_t *inheritable,
252 const kernel_cap_t *permitted)
253{
254 if (cap_inh_is_capped() &&
255 !cap_issubset(*inheritable,
256 cap_combine(old->cap_inheritable,
257 old->cap_permitted)))
258
259 return -EPERM;
260
261 if (!cap_issubset(*inheritable,
262 cap_combine(old->cap_inheritable,
263 old->cap_bset)))
264
265 return -EPERM;
266
267
268 if (!cap_issubset(*permitted, old->cap_permitted))
269 return -EPERM;
270
271
272 if (!cap_issubset(*effective, *permitted))
273 return -EPERM;
274
275 new->cap_effective = *effective;
276 new->cap_inheritable = *inheritable;
277 new->cap_permitted = *permitted;
278
279
280
281
282
283 new->cap_ambient = cap_intersect(new->cap_ambient,
284 cap_intersect(*permitted,
285 *inheritable));
286 if (WARN_ON(!cap_ambient_invariant_ok(new)))
287 return -EINVAL;
288 return 0;
289}
290
291
292
293
294
295
296
297
298
299
300
301
302int cap_inode_need_killpriv(struct dentry *dentry)
303{
304 struct inode *inode = d_backing_inode(dentry);
305 int error;
306
307 error = __vfs_getxattr(dentry, inode, XATTR_NAME_CAPS, NULL, 0);
308 return error > 0;
309}
310
311
312
313
314
315
316
317
318
319int cap_inode_killpriv(struct dentry *dentry)
320{
321 int error;
322
323 error = __vfs_removexattr(dentry, XATTR_NAME_CAPS);
324 if (error == -EOPNOTSUPP)
325 error = 0;
326 return error;
327}
328
329static bool rootid_owns_currentns(kuid_t kroot)
330{
331 struct user_namespace *ns;
332
333 if (!uid_valid(kroot))
334 return false;
335
336 for (ns = current_user_ns(); ; ns = ns->parent) {
337 if (from_kuid(ns, kroot) == 0)
338 return true;
339 if (ns == &init_user_ns)
340 break;
341 }
342
343 return false;
344}
345
346static __u32 sansflags(__u32 m)
347{
348 return m & ~VFS_CAP_FLAGS_EFFECTIVE;
349}
350
351static bool is_v2header(size_t size, __le32 magic)
352{
353 __u32 m = le32_to_cpu(magic);
354 if (size != XATTR_CAPS_SZ_2)
355 return false;
356 return sansflags(m) == VFS_CAP_REVISION_2;
357}
358
359static bool is_v3header(size_t size, __le32 magic)
360{
361 __u32 m = le32_to_cpu(magic);
362
363 if (size != XATTR_CAPS_SZ_3)
364 return false;
365 return sansflags(m) == VFS_CAP_REVISION_3;
366}
367
368
369
370
371
372
373
374
375
376
377
378
379int cap_inode_getsecurity(struct inode *inode, const char *name, void **buffer,
380 bool alloc)
381{
382 int size, ret;
383 kuid_t kroot;
384 uid_t root, mappedroot;
385 char *tmpbuf = NULL;
386 struct vfs_cap_data *cap;
387 struct vfs_ns_cap_data *nscap;
388 struct dentry *dentry;
389 struct user_namespace *fs_ns;
390
391 if (strcmp(name, "capability") != 0)
392 return -EOPNOTSUPP;
393
394 dentry = d_find_alias(inode);
395 if (!dentry)
396 return -EINVAL;
397
398 size = sizeof(struct vfs_ns_cap_data);
399 ret = (int) vfs_getxattr_alloc(dentry, XATTR_NAME_CAPS,
400 &tmpbuf, size, GFP_NOFS);
401 dput(dentry);
402
403 if (ret < 0)
404 return ret;
405
406 fs_ns = inode->i_sb->s_user_ns;
407 cap = (struct vfs_cap_data *) tmpbuf;
408 if (is_v2header((size_t) ret, cap->magic_etc)) {
409
410
411 if (alloc)
412 *buffer = tmpbuf;
413 else
414 kfree(tmpbuf);
415 return ret;
416 } else if (!is_v3header((size_t) ret, cap->magic_etc)) {
417 kfree(tmpbuf);
418 return -EINVAL;
419 }
420
421 nscap = (struct vfs_ns_cap_data *) tmpbuf;
422 root = le32_to_cpu(nscap->rootid);
423 kroot = make_kuid(fs_ns, root);
424
425
426
427 mappedroot = from_kuid(current_user_ns(), kroot);
428 if (mappedroot != (uid_t)-1 && mappedroot != (uid_t)0) {
429 if (alloc) {
430 *buffer = tmpbuf;
431 nscap->rootid = cpu_to_le32(mappedroot);
432 } else
433 kfree(tmpbuf);
434 return size;
435 }
436
437 if (!rootid_owns_currentns(kroot)) {
438 kfree(tmpbuf);
439 return -EOPNOTSUPP;
440 }
441
442
443 size = sizeof(struct vfs_cap_data);
444 if (alloc) {
445 *buffer = kmalloc(size, GFP_ATOMIC);
446 if (*buffer) {
447 struct vfs_cap_data *cap = *buffer;
448 __le32 nsmagic, magic;
449 magic = VFS_CAP_REVISION_2;
450 nsmagic = le32_to_cpu(nscap->magic_etc);
451 if (nsmagic & VFS_CAP_FLAGS_EFFECTIVE)
452 magic |= VFS_CAP_FLAGS_EFFECTIVE;
453 memcpy(&cap->data, &nscap->data, sizeof(__le32) * 2 * VFS_CAP_U32);
454 cap->magic_etc = cpu_to_le32(magic);
455 }
456 }
457 kfree(tmpbuf);
458 return size;
459}
460
461static kuid_t rootid_from_xattr(const void *value, size_t size,
462 struct user_namespace *task_ns)
463{
464 const struct vfs_ns_cap_data *nscap = value;
465 uid_t rootid = 0;
466
467 if (size == XATTR_CAPS_SZ_3)
468 rootid = le32_to_cpu(nscap->rootid);
469
470 return make_kuid(task_ns, rootid);
471}
472
473static bool validheader(size_t size, __le32 magic)
474{
475 return is_v2header(size, magic) || is_v3header(size, magic);
476}
477
478
479
480
481
482
483
484int cap_convert_nscap(struct dentry *dentry, void **ivalue, size_t size)
485{
486 struct vfs_ns_cap_data *nscap;
487 uid_t nsrootid;
488 const struct vfs_cap_data *cap = *ivalue;
489 __u32 magic, nsmagic;
490 struct inode *inode = d_backing_inode(dentry);
491 struct user_namespace *task_ns = current_user_ns(),
492 *fs_ns = inode->i_sb->s_user_ns;
493 kuid_t rootid;
494 size_t newsize;
495
496 if (!*ivalue)
497 return -EINVAL;
498 if (!validheader(size, cap->magic_etc))
499 return -EINVAL;
500 if (!capable_wrt_inode_uidgid(inode, CAP_SETFCAP))
501 return -EPERM;
502 if (size == XATTR_CAPS_SZ_2)
503 if (ns_capable(inode->i_sb->s_user_ns, CAP_SETFCAP))
504
505 return size;
506
507 rootid = rootid_from_xattr(*ivalue, size, task_ns);
508 if (!uid_valid(rootid))
509 return -EINVAL;
510
511 nsrootid = from_kuid(fs_ns, rootid);
512 if (nsrootid == -1)
513 return -EINVAL;
514
515 newsize = sizeof(struct vfs_ns_cap_data);
516 nscap = kmalloc(newsize, GFP_ATOMIC);
517 if (!nscap)
518 return -ENOMEM;
519 nscap->rootid = cpu_to_le32(nsrootid);
520 nsmagic = VFS_CAP_REVISION_3;
521 magic = le32_to_cpu(cap->magic_etc);
522 if (magic & VFS_CAP_FLAGS_EFFECTIVE)
523 nsmagic |= VFS_CAP_FLAGS_EFFECTIVE;
524 nscap->magic_etc = cpu_to_le32(nsmagic);
525 memcpy(&nscap->data, &cap->data, sizeof(__le32) * 2 * VFS_CAP_U32);
526
527 kvfree(*ivalue);
528 *ivalue = nscap;
529 return newsize;
530}
531
532
533
534
535
536static inline int bprm_caps_from_vfs_caps(struct cpu_vfs_cap_data *caps,
537 struct linux_binprm *bprm,
538 bool *effective,
539 bool *has_cap)
540{
541 struct cred *new = bprm->cred;
542 unsigned i;
543 int ret = 0;
544
545 if (caps->magic_etc & VFS_CAP_FLAGS_EFFECTIVE)
546 *effective = true;
547
548 if (caps->magic_etc & VFS_CAP_REVISION_MASK)
549 *has_cap = true;
550
551 CAP_FOR_EACH_U32(i) {
552 __u32 permitted = caps->permitted.cap[i];
553 __u32 inheritable = caps->inheritable.cap[i];
554
555
556
557
558
559 new->cap_permitted.cap[i] =
560 (new->cap_bset.cap[i] & permitted) |
561 (new->cap_inheritable.cap[i] & inheritable);
562
563 if (permitted & ~new->cap_permitted.cap[i])
564
565 ret = -EPERM;
566 }
567
568
569
570
571
572
573 return *effective ? ret : 0;
574}
575
576
577
578
579int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data *cpu_caps)
580{
581 struct inode *inode = d_backing_inode(dentry);
582 __u32 magic_etc;
583 unsigned tocopy, i;
584 int size;
585 struct vfs_ns_cap_data data, *nscaps = &data;
586 struct vfs_cap_data *caps = (struct vfs_cap_data *) &data;
587 kuid_t rootkuid;
588 struct user_namespace *fs_ns;
589
590 memset(cpu_caps, 0, sizeof(struct cpu_vfs_cap_data));
591
592 if (!inode)
593 return -ENODATA;
594
595 fs_ns = inode->i_sb->s_user_ns;
596 size = __vfs_getxattr((struct dentry *)dentry, inode,
597 XATTR_NAME_CAPS, &data, XATTR_CAPS_SZ);
598 if (size == -ENODATA || size == -EOPNOTSUPP)
599
600 return -ENODATA;
601
602 if (size < 0)
603 return size;
604
605 if (size < sizeof(magic_etc))
606 return -EINVAL;
607
608 cpu_caps->magic_etc = magic_etc = le32_to_cpu(caps->magic_etc);
609
610 rootkuid = make_kuid(fs_ns, 0);
611 switch (magic_etc & VFS_CAP_REVISION_MASK) {
612 case VFS_CAP_REVISION_1:
613 if (size != XATTR_CAPS_SZ_1)
614 return -EINVAL;
615 tocopy = VFS_CAP_U32_1;
616 break;
617 case VFS_CAP_REVISION_2:
618 if (size != XATTR_CAPS_SZ_2)
619 return -EINVAL;
620 tocopy = VFS_CAP_U32_2;
621 break;
622 case VFS_CAP_REVISION_3:
623 if (size != XATTR_CAPS_SZ_3)
624 return -EINVAL;
625 tocopy = VFS_CAP_U32_3;
626 rootkuid = make_kuid(fs_ns, le32_to_cpu(nscaps->rootid));
627 break;
628
629 default:
630 return -EINVAL;
631 }
632
633
634
635 if (!rootid_owns_currentns(rootkuid))
636 return -ENODATA;
637
638 CAP_FOR_EACH_U32(i) {
639 if (i >= tocopy)
640 break;
641 cpu_caps->permitted.cap[i] = le32_to_cpu(caps->data[i].permitted);
642 cpu_caps->inheritable.cap[i] = le32_to_cpu(caps->data[i].inheritable);
643 }
644
645 cpu_caps->permitted.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK;
646 cpu_caps->inheritable.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK;
647
648 return 0;
649}
650
651
652
653
654
655
656static int get_file_caps(struct linux_binprm *bprm, bool *effective, bool *has_cap)
657{
658 int rc = 0;
659 struct cpu_vfs_cap_data vcaps;
660
661 cap_clear(bprm->cred->cap_permitted);
662
663 if (!file_caps_enabled)
664 return 0;
665
666 if (!mnt_may_suid(bprm->file->f_path.mnt))
667 return 0;
668
669
670
671
672
673
674 if (!current_in_userns(bprm->file->f_path.mnt->mnt_sb->s_user_ns))
675 return 0;
676
677 rc = get_vfs_caps_from_disk(bprm->file->f_path.dentry, &vcaps);
678 if (rc < 0) {
679 if (rc == -EINVAL)
680 printk(KERN_NOTICE "Invalid argument reading file caps for %s\n",
681 bprm->filename);
682 else if (rc == -ENODATA)
683 rc = 0;
684 goto out;
685 }
686
687 rc = bprm_caps_from_vfs_caps(&vcaps, bprm, effective, has_cap);
688 if (rc == -EINVAL)
689 printk(KERN_NOTICE "%s: cap_from_disk returned %d for %s\n",
690 __func__, rc, bprm->filename);
691
692out:
693 if (rc)
694 cap_clear(bprm->cred->cap_permitted);
695
696 return rc;
697}
698
699
700
701
702
703
704
705
706
707int cap_bprm_set_creds(struct linux_binprm *bprm)
708{
709 const struct cred *old = current_cred();
710 struct cred *new = bprm->cred;
711 bool effective, has_cap = false, is_setid;
712 int ret;
713 kuid_t root_uid;
714
715 if (WARN_ON(!cap_ambient_invariant_ok(old)))
716 return -EPERM;
717
718 effective = false;
719 ret = get_file_caps(bprm, &effective, &has_cap);
720 if (ret < 0)
721 return ret;
722
723 root_uid = make_kuid(new->user_ns, 0);
724
725 if (!issecure(SECURE_NOROOT)) {
726
727
728
729
730
731 if (has_cap && !uid_eq(new->uid, root_uid) && uid_eq(new->euid, root_uid)) {
732 warn_setuid_and_fcaps_mixed(bprm->filename);
733 goto skip;
734 }
735
736
737
738
739
740
741
742 if (uid_eq(new->euid, root_uid) || uid_eq(new->uid, root_uid)) {
743
744 new->cap_permitted = cap_combine(old->cap_bset,
745 old->cap_inheritable);
746 }
747 if (uid_eq(new->euid, root_uid))
748 effective = true;
749 }
750skip:
751
752
753 if (!cap_issubset(new->cap_permitted, old->cap_permitted))
754 bprm->per_clear |= PER_CLEAR_ON_SETID;
755
756
757
758
759
760
761
762 is_setid = !uid_eq(new->euid, old->uid) || !gid_eq(new->egid, old->gid);
763
764 if ((is_setid ||
765 !cap_issubset(new->cap_permitted, old->cap_permitted)) &&
766 ((bprm->unsafe & ~LSM_UNSAFE_PTRACE) ||
767 !ptracer_capable(current, new->user_ns))) {
768
769 if (!ns_capable(new->user_ns, CAP_SETUID) ||
770 (bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS)) {
771 new->euid = new->uid;
772 new->egid = new->gid;
773 }
774 new->cap_permitted = cap_intersect(new->cap_permitted,
775 old->cap_permitted);
776 }
777
778 new->suid = new->fsuid = new->euid;
779 new->sgid = new->fsgid = new->egid;
780
781
782 if (has_cap || is_setid)
783 cap_clear(new->cap_ambient);
784
785
786
787
788
789 new->cap_permitted = cap_combine(new->cap_permitted, new->cap_ambient);
790
791
792
793
794
795 if (effective)
796 new->cap_effective = new->cap_permitted;
797 else
798 new->cap_effective = new->cap_ambient;
799
800 if (WARN_ON(!cap_ambient_invariant_ok(new)))
801 return -EPERM;
802
803
804
805
806
807
808
809
810
811
812
813
814
815 if (!cap_issubset(new->cap_effective, new->cap_ambient)) {
816 if (!cap_issubset(CAP_FULL_SET, new->cap_effective) ||
817 !uid_eq(new->euid, root_uid) || !uid_eq(new->uid, root_uid) ||
818 issecure(SECURE_NOROOT)) {
819 ret = audit_log_bprm_fcaps(bprm, new, old);
820 if (ret < 0)
821 return ret;
822 }
823 }
824
825 new->securebits &= ~issecure_mask(SECURE_KEEP_CAPS);
826
827 if (WARN_ON(!cap_ambient_invariant_ok(new)))
828 return -EPERM;
829
830
831 bprm->cap_elevated = 0;
832 if (is_setid) {
833 bprm->cap_elevated = 1;
834 } else if (!uid_eq(new->uid, root_uid)) {
835 if (effective ||
836 !cap_issubset(new->cap_permitted, new->cap_ambient))
837 bprm->cap_elevated = 1;
838 }
839
840 return 0;
841}
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857int cap_inode_setxattr(struct dentry *dentry, const char *name,
858 const void *value, size_t size, int flags)
859{
860
861 if (strncmp(name, XATTR_SECURITY_PREFIX,
862 sizeof(XATTR_SECURITY_PREFIX) - 1) != 0)
863 return 0;
864
865
866
867
868
869 if (strcmp(name, XATTR_NAME_CAPS) == 0)
870 return 0;
871
872 if (!capable(CAP_SYS_ADMIN))
873 return -EPERM;
874 return 0;
875}
876
877
878
879
880
881
882
883
884
885
886
887
888int cap_inode_removexattr(struct dentry *dentry, const char *name)
889{
890
891 if (strncmp(name, XATTR_SECURITY_PREFIX,
892 sizeof(XATTR_SECURITY_PREFIX) - 1) != 0)
893 return 0;
894
895 if (strcmp(name, XATTR_NAME_CAPS) == 0) {
896
897 struct inode *inode = d_backing_inode(dentry);
898 if (!inode)
899 return -EINVAL;
900 if (!capable_wrt_inode_uidgid(inode, CAP_SETFCAP))
901 return -EPERM;
902 return 0;
903 }
904
905 if (!capable(CAP_SYS_ADMIN))
906 return -EPERM;
907 return 0;
908}
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939static inline void cap_emulate_setxuid(struct cred *new, const struct cred *old)
940{
941 kuid_t root_uid = make_kuid(old->user_ns, 0);
942
943 if ((uid_eq(old->uid, root_uid) ||
944 uid_eq(old->euid, root_uid) ||
945 uid_eq(old->suid, root_uid)) &&
946 (!uid_eq(new->uid, root_uid) &&
947 !uid_eq(new->euid, root_uid) &&
948 !uid_eq(new->suid, root_uid))) {
949 if (!issecure(SECURE_KEEP_CAPS)) {
950 cap_clear(new->cap_permitted);
951 cap_clear(new->cap_effective);
952 }
953
954
955
956
957
958
959 cap_clear(new->cap_ambient);
960 }
961 if (uid_eq(old->euid, root_uid) && !uid_eq(new->euid, root_uid))
962 cap_clear(new->cap_effective);
963 if (!uid_eq(old->euid, root_uid) && uid_eq(new->euid, root_uid))
964 new->cap_effective = new->cap_permitted;
965}
966
967
968
969
970
971
972
973
974
975
976int cap_task_fix_setuid(struct cred *new, const struct cred *old, int flags)
977{
978 switch (flags) {
979 case LSM_SETID_RE:
980 case LSM_SETID_ID:
981 case LSM_SETID_RES:
982
983
984 if (!issecure(SECURE_NO_SETUID_FIXUP))
985 cap_emulate_setxuid(new, old);
986 break;
987
988 case LSM_SETID_FS:
989
990
991
992
993
994
995 if (!issecure(SECURE_NO_SETUID_FIXUP)) {
996 kuid_t root_uid = make_kuid(old->user_ns, 0);
997 if (uid_eq(old->fsuid, root_uid) && !uid_eq(new->fsuid, root_uid))
998 new->cap_effective =
999 cap_drop_fs_set(new->cap_effective);
1000
1001 if (!uid_eq(old->fsuid, root_uid) && uid_eq(new->fsuid, root_uid))
1002 new->cap_effective =
1003 cap_raise_fs_set(new->cap_effective,
1004 new->cap_permitted);
1005 }
1006 break;
1007
1008 default:
1009 return -EINVAL;
1010 }
1011
1012 return 0;
1013}
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025static int cap_safe_nice(struct task_struct *p)
1026{
1027 int is_subset, ret = 0;
1028
1029 rcu_read_lock();
1030 is_subset = cap_issubset(__task_cred(p)->cap_permitted,
1031 current_cred()->cap_permitted);
1032 if (!is_subset && !ns_capable(__task_cred(p)->user_ns, CAP_SYS_NICE))
1033 ret = -EPERM;
1034 rcu_read_unlock();
1035
1036 return ret;
1037}
1038
1039
1040
1041
1042
1043
1044
1045
1046int cap_task_setscheduler(struct task_struct *p)
1047{
1048 return cap_safe_nice(p);
1049}
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059int cap_task_setioprio(struct task_struct *p, int ioprio)
1060{
1061 return cap_safe_nice(p);
1062}
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072int cap_task_setnice(struct task_struct *p, int nice)
1073{
1074 return cap_safe_nice(p);
1075}
1076
1077
1078
1079
1080
1081static int cap_prctl_drop(unsigned long cap)
1082{
1083 struct cred *new;
1084
1085 if (!ns_capable(current_user_ns(), CAP_SETPCAP))
1086 return -EPERM;
1087 if (!cap_valid(cap))
1088 return -EINVAL;
1089
1090 new = prepare_creds();
1091 if (!new)
1092 return -ENOMEM;
1093 cap_lower(new->cap_bset, cap);
1094 return commit_creds(new);
1095}
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109int cap_task_prctl(int option, unsigned long arg2, unsigned long arg3,
1110 unsigned long arg4, unsigned long arg5)
1111{
1112 const struct cred *old = current_cred();
1113 struct cred *new;
1114
1115 switch (option) {
1116 case PR_CAPBSET_READ:
1117 if (!cap_valid(arg2))
1118 return -EINVAL;
1119 return !!cap_raised(old->cap_bset, arg2);
1120
1121 case PR_CAPBSET_DROP:
1122 return cap_prctl_drop(arg2);
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143 case PR_SET_SECUREBITS:
1144 if ((((old->securebits & SECURE_ALL_LOCKS) >> 1)
1145 & (old->securebits ^ arg2))
1146 || ((old->securebits & SECURE_ALL_LOCKS & ~arg2))
1147 || (arg2 & ~(SECURE_ALL_LOCKS | SECURE_ALL_BITS))
1148 || (cap_capable(current_cred(),
1149 current_cred()->user_ns, CAP_SETPCAP,
1150 SECURITY_CAP_AUDIT) != 0)
1151
1152
1153
1154
1155
1156
1157
1158 )
1159
1160 return -EPERM;
1161
1162 new = prepare_creds();
1163 if (!new)
1164 return -ENOMEM;
1165 new->securebits = arg2;
1166 return commit_creds(new);
1167
1168 case PR_GET_SECUREBITS:
1169 return old->securebits;
1170
1171 case PR_GET_KEEPCAPS:
1172 return !!issecure(SECURE_KEEP_CAPS);
1173
1174 case PR_SET_KEEPCAPS:
1175 if (arg2 > 1)
1176 return -EINVAL;
1177 if (issecure(SECURE_KEEP_CAPS_LOCKED))
1178 return -EPERM;
1179
1180 new = prepare_creds();
1181 if (!new)
1182 return -ENOMEM;
1183 if (arg2)
1184 new->securebits |= issecure_mask(SECURE_KEEP_CAPS);
1185 else
1186 new->securebits &= ~issecure_mask(SECURE_KEEP_CAPS);
1187 return commit_creds(new);
1188
1189 case PR_CAP_AMBIENT:
1190 if (arg2 == PR_CAP_AMBIENT_CLEAR_ALL) {
1191 if (arg3 | arg4 | arg5)
1192 return -EINVAL;
1193
1194 new = prepare_creds();
1195 if (!new)
1196 return -ENOMEM;
1197 cap_clear(new->cap_ambient);
1198 return commit_creds(new);
1199 }
1200
1201 if (((!cap_valid(arg3)) | arg4 | arg5))
1202 return -EINVAL;
1203
1204 if (arg2 == PR_CAP_AMBIENT_IS_SET) {
1205 return !!cap_raised(current_cred()->cap_ambient, arg3);
1206 } else if (arg2 != PR_CAP_AMBIENT_RAISE &&
1207 arg2 != PR_CAP_AMBIENT_LOWER) {
1208 return -EINVAL;
1209 } else {
1210 if (arg2 == PR_CAP_AMBIENT_RAISE &&
1211 (!cap_raised(current_cred()->cap_permitted, arg3) ||
1212 !cap_raised(current_cred()->cap_inheritable,
1213 arg3) ||
1214 issecure(SECURE_NO_CAP_AMBIENT_RAISE)))
1215 return -EPERM;
1216
1217 new = prepare_creds();
1218 if (!new)
1219 return -ENOMEM;
1220 if (arg2 == PR_CAP_AMBIENT_RAISE)
1221 cap_raise(new->cap_ambient, arg3);
1222 else
1223 cap_lower(new->cap_ambient, arg3);
1224 return commit_creds(new);
1225 }
1226
1227 default:
1228
1229 return -ENOSYS;
1230 }
1231}
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241int cap_vm_enough_memory(struct mm_struct *mm, long pages)
1242{
1243 int cap_sys_admin = 0;
1244
1245 if (cap_capable(current_cred(), &init_user_ns, CAP_SYS_ADMIN,
1246 SECURITY_CAP_NOAUDIT) == 0)
1247 cap_sys_admin = 1;
1248 return cap_sys_admin;
1249}
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260int cap_mmap_addr(unsigned long addr)
1261{
1262 int ret = 0;
1263
1264 if (addr < dac_mmap_min_addr) {
1265 ret = cap_capable(current_cred(), &init_user_ns, CAP_SYS_RAWIO,
1266 SECURITY_CAP_AUDIT);
1267
1268 if (ret == 0)
1269 current->flags |= PF_SUPERPRIV;
1270 }
1271 return ret;
1272}
1273
1274int cap_mmap_file(struct file *file, unsigned long reqprot,
1275 unsigned long prot, unsigned long flags)
1276{
1277 return 0;
1278}
1279
1280#ifdef CONFIG_SECURITY
1281
1282struct security_hook_list capability_hooks[] __lsm_ro_after_init = {
1283 LSM_HOOK_INIT(capable, cap_capable),
1284 LSM_HOOK_INIT(settime, cap_settime),
1285 LSM_HOOK_INIT(ptrace_access_check, cap_ptrace_access_check),
1286 LSM_HOOK_INIT(ptrace_traceme, cap_ptrace_traceme),
1287 LSM_HOOK_INIT(capget, cap_capget),
1288 LSM_HOOK_INIT(capset, cap_capset),
1289 LSM_HOOK_INIT(bprm_set_creds, cap_bprm_set_creds),
1290 LSM_HOOK_INIT(inode_need_killpriv, cap_inode_need_killpriv),
1291 LSM_HOOK_INIT(inode_killpriv, cap_inode_killpriv),
1292 LSM_HOOK_INIT(inode_getsecurity, cap_inode_getsecurity),
1293 LSM_HOOK_INIT(mmap_addr, cap_mmap_addr),
1294 LSM_HOOK_INIT(mmap_file, cap_mmap_file),
1295 LSM_HOOK_INIT(task_fix_setuid, cap_task_fix_setuid),
1296 LSM_HOOK_INIT(task_prctl, cap_task_prctl),
1297 LSM_HOOK_INIT(task_setscheduler, cap_task_setscheduler),
1298 LSM_HOOK_INIT(task_setioprio, cap_task_setioprio),
1299 LSM_HOOK_INIT(task_setnice, cap_task_setnice),
1300 LSM_HOOK_INIT(vm_enough_memory, cap_vm_enough_memory),
1301};
1302
1303void __init capability_add_hooks(void)
1304{
1305 security_add_hooks(capability_hooks, ARRAY_SIZE(capability_hooks),
1306 "capability");
1307}
1308
1309#endif
1310