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