1
2
3
4
5
6
7
8
9
10#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
11
12#include <linux/audit.h>
13#include <linux/capability.h>
14#include <linux/mm.h>
15#include <linux/export.h>
16#include <linux/security.h>
17#include <linux/syscalls.h>
18#include <linux/pid_namespace.h>
19#include <linux/user_namespace.h>
20#include <linux/uaccess.h>
21
22
23
24
25
26const kernel_cap_t __cap_empty_set = CAP_EMPTY_SET;
27EXPORT_SYMBOL(__cap_empty_set);
28
29int file_caps_enabled = 1;
30
31static int __init file_caps_disable(char *str)
32{
33 file_caps_enabled = 0;
34 return 1;
35}
36__setup("no_file_caps", file_caps_disable);
37
38#ifdef CONFIG_MULTIUSER
39
40
41
42
43
44
45static void warn_legacy_capability_use(void)
46{
47 char name[sizeof(current->comm)];
48
49 pr_info_once("warning: `%s' uses 32-bit capabilities (legacy support in use)\n",
50 get_task_comm(name, current));
51}
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69static void warn_deprecated_v2(void)
70{
71 char name[sizeof(current->comm)];
72
73 pr_info_once("warning: `%s' uses deprecated v2 capabilities in a way that may be insecure\n",
74 get_task_comm(name, current));
75}
76
77
78
79
80
81static int cap_validate_magic(cap_user_header_t header, unsigned *tocopy)
82{
83 __u32 version;
84
85 if (get_user(version, &header->version))
86 return -EFAULT;
87
88 switch (version) {
89 case _LINUX_CAPABILITY_VERSION_1:
90 warn_legacy_capability_use();
91 *tocopy = _LINUX_CAPABILITY_U32S_1;
92 break;
93 case _LINUX_CAPABILITY_VERSION_2:
94 warn_deprecated_v2();
95
96
97
98 case _LINUX_CAPABILITY_VERSION_3:
99 *tocopy = _LINUX_CAPABILITY_U32S_3;
100 break;
101 default:
102 if (put_user((u32)_KERNEL_CAPABILITY_VERSION, &header->version))
103 return -EFAULT;
104 return -EINVAL;
105 }
106
107 return 0;
108}
109
110
111
112
113
114
115
116
117static inline int cap_get_target_pid(pid_t pid, kernel_cap_t *pEp,
118 kernel_cap_t *pIp, kernel_cap_t *pPp)
119{
120 int ret;
121
122 if (pid && (pid != task_pid_vnr(current))) {
123 struct task_struct *target;
124
125 rcu_read_lock();
126
127 target = find_task_by_vpid(pid);
128 if (!target)
129 ret = -ESRCH;
130 else
131 ret = security_capget(target, pEp, pIp, pPp);
132
133 rcu_read_unlock();
134 } else
135 ret = security_capget(current, pEp, pIp, pPp);
136
137 return ret;
138}
139
140
141
142
143
144
145
146
147
148
149SYSCALL_DEFINE2(capget, cap_user_header_t, header, cap_user_data_t, dataptr)
150{
151 int ret = 0;
152 pid_t pid;
153 unsigned tocopy;
154 kernel_cap_t pE, pI, pP;
155
156 ret = cap_validate_magic(header, &tocopy);
157 if ((dataptr == NULL) || (ret != 0))
158 return ((dataptr == NULL) && (ret == -EINVAL)) ? 0 : ret;
159
160 if (get_user(pid, &header->pid))
161 return -EFAULT;
162
163 if (pid < 0)
164 return -EINVAL;
165
166 ret = cap_get_target_pid(pid, &pE, &pI, &pP);
167 if (!ret) {
168 struct __user_cap_data_struct kdata[_KERNEL_CAPABILITY_U32S];
169 unsigned i;
170
171 for (i = 0; i < tocopy; i++) {
172 kdata[i].effective = pE.cap[i];
173 kdata[i].permitted = pP.cap[i];
174 kdata[i].inheritable = pI.cap[i];
175 }
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196 if (copy_to_user(dataptr, kdata, tocopy
197 * sizeof(struct __user_cap_data_struct))) {
198 return -EFAULT;
199 }
200 }
201
202 return ret;
203}
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223SYSCALL_DEFINE2(capset, cap_user_header_t, header, const cap_user_data_t, data)
224{
225 struct __user_cap_data_struct kdata[_KERNEL_CAPABILITY_U32S];
226 unsigned i, tocopy, copybytes;
227 kernel_cap_t inheritable, permitted, effective;
228 struct cred *new;
229 int ret;
230 pid_t pid;
231
232 ret = cap_validate_magic(header, &tocopy);
233 if (ret != 0)
234 return ret;
235
236 if (get_user(pid, &header->pid))
237 return -EFAULT;
238
239
240 if (pid != 0 && pid != task_pid_vnr(current))
241 return -EPERM;
242
243 copybytes = tocopy * sizeof(struct __user_cap_data_struct);
244 if (copybytes > sizeof(kdata))
245 return -EFAULT;
246
247 if (copy_from_user(&kdata, data, copybytes))
248 return -EFAULT;
249
250 for (i = 0; i < tocopy; i++) {
251 effective.cap[i] = kdata[i].effective;
252 permitted.cap[i] = kdata[i].permitted;
253 inheritable.cap[i] = kdata[i].inheritable;
254 }
255 while (i < _KERNEL_CAPABILITY_U32S) {
256 effective.cap[i] = 0;
257 permitted.cap[i] = 0;
258 inheritable.cap[i] = 0;
259 i++;
260 }
261
262 effective.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK;
263 permitted.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK;
264 inheritable.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK;
265
266 new = prepare_creds();
267 if (!new)
268 return -ENOMEM;
269
270 ret = security_capset(new, current_cred(),
271 &effective, &inheritable, &permitted);
272 if (ret < 0)
273 goto error;
274
275 audit_log_capset(new, current_cred());
276
277 return commit_creds(new);
278
279error:
280 abort_creds(new);
281 return ret;
282}
283
284
285
286
287
288
289
290
291
292
293
294
295bool has_ns_capability(struct task_struct *t,
296 struct user_namespace *ns, int cap)
297{
298 int ret;
299
300 rcu_read_lock();
301 ret = security_capable(__task_cred(t), ns, cap);
302 rcu_read_unlock();
303
304 return (ret == 0);
305}
306
307
308
309
310
311
312
313
314
315
316
317bool has_capability(struct task_struct *t, int cap)
318{
319 return has_ns_capability(t, &init_user_ns, cap);
320}
321EXPORT_SYMBOL(has_capability);
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336bool has_ns_capability_noaudit(struct task_struct *t,
337 struct user_namespace *ns, int cap)
338{
339 int ret;
340
341 rcu_read_lock();
342 ret = security_capable_noaudit(__task_cred(t), ns, cap);
343 rcu_read_unlock();
344
345 return (ret == 0);
346}
347
348
349
350
351
352
353
354
355
356
357
358
359
360bool has_capability_noaudit(struct task_struct *t, int cap)
361{
362 return has_ns_capability_noaudit(t, &init_user_ns, cap);
363}
364
365static bool ns_capable_common(struct user_namespace *ns, int cap, bool audit)
366{
367 int capable;
368
369 if (unlikely(!cap_valid(cap))) {
370 pr_crit("capable() called with invalid cap=%u\n", cap);
371 BUG();
372 }
373
374 capable = audit ? security_capable(current_cred(), ns, cap) :
375 security_capable_noaudit(current_cred(), ns, cap);
376 if (capable == 0) {
377 current->flags |= PF_SUPERPRIV;
378 return true;
379 }
380 return false;
381}
382
383
384
385
386
387
388
389
390
391
392
393
394bool ns_capable(struct user_namespace *ns, int cap)
395{
396 return ns_capable_common(ns, cap, true);
397}
398EXPORT_SYMBOL(ns_capable);
399
400
401
402
403
404
405
406
407
408
409
410
411
412bool ns_capable_noaudit(struct user_namespace *ns, int cap)
413{
414 return ns_capable_common(ns, cap, false);
415}
416EXPORT_SYMBOL(ns_capable_noaudit);
417
418
419
420
421
422
423
424
425
426
427
428bool capable(int cap)
429{
430 return ns_capable(&init_user_ns, cap);
431}
432EXPORT_SYMBOL(capable);
433#endif
434
435
436
437
438
439
440
441
442
443
444
445
446
447bool file_ns_capable(const struct file *file, struct user_namespace *ns,
448 int cap)
449{
450 if (WARN_ON_ONCE(!cap_valid(cap)))
451 return false;
452
453 if (security_capable(file->f_cred, ns, cap) == 0)
454 return true;
455
456 return false;
457}
458EXPORT_SYMBOL(file_ns_capable);
459
460
461
462
463
464
465
466
467bool privileged_wrt_inode_uidgid(struct user_namespace *ns, const struct inode *inode)
468{
469 return kuid_has_mapping(ns, inode->i_uid) &&
470 kgid_has_mapping(ns, inode->i_gid);
471}
472
473
474
475
476
477
478
479
480
481
482bool capable_wrt_inode_uidgid(const struct inode *inode, int cap)
483{
484 struct user_namespace *ns = current_user_ns();
485
486 return ns_capable(ns, cap) && privileged_wrt_inode_uidgid(ns, inode);
487}
488EXPORT_SYMBOL(capable_wrt_inode_uidgid);
489
490
491
492
493
494
495
496
497
498bool ptracer_capable(struct task_struct *tsk, struct user_namespace *ns)
499{
500 int ret = 0;
501 const struct cred *cred;
502 rcu_read_lock();
503 cred = rcu_dereference(tsk->ptracer_cred);
504 if (cred)
505 ret = security_capable_noaudit(cred, ns, CAP_SYS_PTRACE);
506 rcu_read_unlock();
507 return (ret == 0);
508}
509