1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef _LINUX_CAPABILITY_H
14#define _LINUX_CAPABILITY_H
15
16#include <linux/types.h>
17
18struct task_struct;
19
20
21
22
23
24
25
26
27
28
29
30
31#define _LINUX_CAPABILITY_VERSION_1 0x19980330
32#define _LINUX_CAPABILITY_U32S_1 1
33
34#define _LINUX_CAPABILITY_VERSION_2 0x20071026
35#define _LINUX_CAPABILITY_U32S_2 2
36
37#define _LINUX_CAPABILITY_VERSION_3 0x20080522
38#define _LINUX_CAPABILITY_U32S_3 2
39
40typedef struct __user_cap_header_struct {
41 __u32 version;
42 int pid;
43} __user *cap_user_header_t;
44
45typedef struct __user_cap_data_struct {
46 __u32 effective;
47 __u32 permitted;
48 __u32 inheritable;
49} __user *cap_user_data_t;
50
51
52#define XATTR_CAPS_SUFFIX "capability"
53#define XATTR_NAME_CAPS XATTR_SECURITY_PREFIX XATTR_CAPS_SUFFIX
54
55#define VFS_CAP_REVISION_MASK 0xFF000000
56#define VFS_CAP_FLAGS_MASK ~VFS_CAP_REVISION_MASK
57#define VFS_CAP_FLAGS_EFFECTIVE 0x000001
58
59#define VFS_CAP_REVISION_1 0x01000000
60#define VFS_CAP_U32_1 1
61#define XATTR_CAPS_SZ_1 (sizeof(__le32)*(1 + 2*VFS_CAP_U32_1))
62
63#define VFS_CAP_REVISION_2 0x02000000
64#define VFS_CAP_U32_2 2
65#define XATTR_CAPS_SZ_2 (sizeof(__le32)*(1 + 2*VFS_CAP_U32_2))
66
67#define XATTR_CAPS_SZ XATTR_CAPS_SZ_2
68#define VFS_CAP_U32 VFS_CAP_U32_2
69#define VFS_CAP_REVISION VFS_CAP_REVISION_2
70
71
72struct vfs_cap_data {
73 __le32 magic_etc;
74 struct {
75 __le32 permitted;
76 __le32 inheritable;
77 } data[VFS_CAP_U32];
78};
79
80#ifndef __KERNEL__
81
82
83
84
85
86
87#define _LINUX_CAPABILITY_VERSION _LINUX_CAPABILITY_VERSION_1
88#define _LINUX_CAPABILITY_U32S _LINUX_CAPABILITY_U32S_1
89
90#else
91
92#define _KERNEL_CAPABILITY_VERSION _LINUX_CAPABILITY_VERSION_3
93#define _KERNEL_CAPABILITY_U32S _LINUX_CAPABILITY_U32S_3
94
95typedef struct kernel_cap_struct {
96 __u32 cap[_KERNEL_CAPABILITY_U32S];
97} kernel_cap_t;
98
99#define _USER_CAP_HEADER_SIZE (sizeof(struct __user_cap_header_struct))
100#define _KERNEL_CAP_T_SIZE (sizeof(kernel_cap_t))
101
102#endif
103
104
105
106
107
108
109
110
111
112
113#define CAP_CHOWN 0
114
115
116
117
118
119#define CAP_DAC_OVERRIDE 1
120
121
122
123
124
125#define CAP_DAC_READ_SEARCH 2
126
127
128
129
130
131#define CAP_FOWNER 3
132
133
134
135
136
137
138
139
140#define CAP_FSETID 4
141
142
143
144
145
146#define CAP_KILL 5
147
148
149
150
151
152#define CAP_SETGID 6
153
154
155
156
157#define CAP_SETUID 7
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173#define CAP_SETPCAP 8
174
175
176
177#define CAP_LINUX_IMMUTABLE 9
178
179
180
181
182#define CAP_NET_BIND_SERVICE 10
183
184
185
186#define CAP_NET_BROADCAST 11
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202#define CAP_NET_ADMIN 12
203
204
205
206
207#define CAP_NET_RAW 13
208
209
210
211
212
213#define CAP_IPC_LOCK 14
214
215
216
217#define CAP_IPC_OWNER 15
218
219
220#define CAP_SYS_MODULE 16
221
222
223
224
225#define CAP_SYS_RAWIO 17
226
227
228
229#define CAP_SYS_CHROOT 18
230
231
232
233#define CAP_SYS_PTRACE 19
234
235
236
237#define CAP_SYS_PACCT 20
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277#define CAP_SYS_ADMIN 21
278
279
280
281#define CAP_SYS_BOOT 22
282
283
284
285
286
287
288
289
290#define CAP_SYS_NICE 23
291
292
293
294
295
296
297
298
299
300
301
302
303
304#define CAP_SYS_RESOURCE 24
305
306
307
308
309
310#define CAP_SYS_TIME 25
311
312
313
314
315#define CAP_SYS_TTY_CONFIG 26
316
317
318
319#define CAP_MKNOD 27
320
321
322
323#define CAP_LEASE 28
324
325#define CAP_AUDIT_WRITE 29
326
327#define CAP_AUDIT_CONTROL 30
328
329#define CAP_SETFCAP 31
330
331
332
333
334
335
336
337#define CAP_MAC_OVERRIDE 32
338
339
340
341
342
343
344
345
346#define CAP_MAC_ADMIN 33
347
348#define CAP_LAST_CAP CAP_MAC_ADMIN
349
350#define cap_valid(x) ((x) >= 0 && (x) <= CAP_LAST_CAP)
351
352
353
354
355
356#define CAP_TO_INDEX(x) ((x) >> 5)
357#define CAP_TO_MASK(x) (1 << ((x) & 31))
358
359#ifdef __KERNEL__
360
361
362
363
364
365#define CAP_FOR_EACH_U32(__capi) \
366 for (__capi = 0; __capi < _KERNEL_CAPABILITY_U32S; ++__capi)
367
368# define CAP_FS_MASK_B0 (CAP_TO_MASK(CAP_CHOWN) \
369 | CAP_TO_MASK(CAP_DAC_OVERRIDE) \
370 | CAP_TO_MASK(CAP_DAC_READ_SEARCH) \
371 | CAP_TO_MASK(CAP_FOWNER) \
372 | CAP_TO_MASK(CAP_FSETID))
373
374# define CAP_FS_MASK_B1 (CAP_TO_MASK(CAP_MAC_OVERRIDE))
375
376#if _KERNEL_CAPABILITY_U32S != 2
377# error Fix up hand-coded capability macro initializers
378#else
379
380# define CAP_EMPTY_SET {{ 0, 0 }}
381# define CAP_FULL_SET {{ ~0, ~0 }}
382# define CAP_INIT_EFF_SET {{ ~CAP_TO_MASK(CAP_SETPCAP), ~0 }}
383# define CAP_FS_SET {{ CAP_FS_MASK_B0, CAP_FS_MASK_B1 } }
384# define CAP_NFSD_SET {{ CAP_FS_MASK_B0|CAP_TO_MASK(CAP_SYS_RESOURCE), \
385 CAP_FS_MASK_B1 } }
386
387#endif
388
389#define CAP_INIT_INH_SET CAP_EMPTY_SET
390
391# define cap_clear(c) do { (c) = __cap_empty_set; } while (0)
392# define cap_set_full(c) do { (c) = __cap_full_set; } while (0)
393# define cap_set_init_eff(c) do { (c) = __cap_init_eff_set; } while (0)
394
395#define cap_raise(c, flag) ((c).cap[CAP_TO_INDEX(flag)] |= CAP_TO_MASK(flag))
396#define cap_lower(c, flag) ((c).cap[CAP_TO_INDEX(flag)] &= ~CAP_TO_MASK(flag))
397#define cap_raised(c, flag) ((c).cap[CAP_TO_INDEX(flag)] & CAP_TO_MASK(flag))
398
399#define CAP_BOP_ALL(c, a, b, OP) \
400do { \
401 unsigned __capi; \
402 CAP_FOR_EACH_U32(__capi) { \
403 c.cap[__capi] = a.cap[__capi] OP b.cap[__capi]; \
404 } \
405} while (0)
406
407#define CAP_UOP_ALL(c, a, OP) \
408do { \
409 unsigned __capi; \
410 CAP_FOR_EACH_U32(__capi) { \
411 c.cap[__capi] = OP a.cap[__capi]; \
412 } \
413} while (0)
414
415static inline kernel_cap_t cap_combine(const kernel_cap_t a,
416 const kernel_cap_t b)
417{
418 kernel_cap_t dest;
419 CAP_BOP_ALL(dest, a, b, |);
420 return dest;
421}
422
423static inline kernel_cap_t cap_intersect(const kernel_cap_t a,
424 const kernel_cap_t b)
425{
426 kernel_cap_t dest;
427 CAP_BOP_ALL(dest, a, b, &);
428 return dest;
429}
430
431static inline kernel_cap_t cap_drop(const kernel_cap_t a,
432 const kernel_cap_t drop)
433{
434 kernel_cap_t dest;
435 CAP_BOP_ALL(dest, a, drop, &~);
436 return dest;
437}
438
439static inline kernel_cap_t cap_invert(const kernel_cap_t c)
440{
441 kernel_cap_t dest;
442 CAP_UOP_ALL(dest, c, ~);
443 return dest;
444}
445
446static inline int cap_isclear(const kernel_cap_t a)
447{
448 unsigned __capi;
449 CAP_FOR_EACH_U32(__capi) {
450 if (a.cap[__capi] != 0)
451 return 0;
452 }
453 return 1;
454}
455
456static inline int cap_issubset(const kernel_cap_t a, const kernel_cap_t set)
457{
458 kernel_cap_t dest;
459 dest = cap_drop(a, set);
460 return cap_isclear(dest);
461}
462
463
464
465static inline int cap_is_fs_cap(int cap)
466{
467 const kernel_cap_t __cap_fs_set = CAP_FS_SET;
468 return !!(CAP_TO_MASK(cap) & __cap_fs_set.cap[CAP_TO_INDEX(cap)]);
469}
470
471static inline kernel_cap_t cap_drop_fs_set(const kernel_cap_t a)
472{
473 const kernel_cap_t __cap_fs_set = CAP_FS_SET;
474 return cap_drop(a, __cap_fs_set);
475}
476
477static inline kernel_cap_t cap_raise_fs_set(const kernel_cap_t a,
478 const kernel_cap_t permitted)
479{
480 const kernel_cap_t __cap_fs_set = CAP_FS_SET;
481 return cap_combine(a,
482 cap_intersect(permitted, __cap_fs_set));
483}
484
485static inline kernel_cap_t cap_drop_nfsd_set(const kernel_cap_t a)
486{
487 const kernel_cap_t __cap_fs_set = CAP_NFSD_SET;
488 return cap_drop(a, __cap_fs_set);
489}
490
491static inline kernel_cap_t cap_raise_nfsd_set(const kernel_cap_t a,
492 const kernel_cap_t permitted)
493{
494 const kernel_cap_t __cap_nfsd_set = CAP_NFSD_SET;
495 return cap_combine(a,
496 cap_intersect(permitted, __cap_nfsd_set));
497}
498
499extern const kernel_cap_t __cap_empty_set;
500extern const kernel_cap_t __cap_full_set;
501extern const kernel_cap_t __cap_init_eff_set;
502
503int capable(int cap);
504int __capable(struct task_struct *t, int cap);
505
506extern long cap_prctl_drop(unsigned long cap);
507
508#endif
509
510#endif
511