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
174#define CAP_SETPCAP 8
175
176
177
178#define CAP_LINUX_IMMUTABLE 9
179
180
181
182
183#define CAP_NET_BIND_SERVICE 10
184
185
186
187#define CAP_NET_BROADCAST 11
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203#define CAP_NET_ADMIN 12
204
205
206
207
208#define CAP_NET_RAW 13
209
210
211
212
213
214#define CAP_IPC_LOCK 14
215
216
217
218#define CAP_IPC_OWNER 15
219
220
221#define CAP_SYS_MODULE 16
222
223
224
225
226#define CAP_SYS_RAWIO 17
227
228
229
230#define CAP_SYS_CHROOT 18
231
232
233
234#define CAP_SYS_PTRACE 19
235
236
237
238#define CAP_SYS_PACCT 20
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
278#define CAP_SYS_ADMIN 21
279
280
281
282#define CAP_SYS_BOOT 22
283
284
285
286
287
288
289
290
291#define CAP_SYS_NICE 23
292
293
294
295
296
297
298
299
300
301
302
303
304
305#define CAP_SYS_RESOURCE 24
306
307
308
309
310
311#define CAP_SYS_TIME 25
312
313
314
315
316#define CAP_SYS_TTY_CONFIG 26
317
318
319
320#define CAP_MKNOD 27
321
322
323
324#define CAP_LEASE 28
325
326#define CAP_AUDIT_WRITE 29
327
328#define CAP_AUDIT_CONTROL 30
329
330#define CAP_SETFCAP 31
331
332
333
334
335
336
337
338#define CAP_MAC_OVERRIDE 32
339
340
341
342
343
344
345
346
347#define CAP_MAC_ADMIN 33
348
349#define CAP_LAST_CAP CAP_MAC_ADMIN
350
351#define cap_valid(x) ((x) >= 0 && (x) <= CAP_LAST_CAP)
352
353
354
355
356
357#define CAP_TO_INDEX(x) ((x) >> 5)
358#define CAP_TO_MASK(x) (1 << ((x) & 31))
359
360#ifdef __KERNEL__
361
362
363
364
365
366#define CAP_FOR_EACH_U32(__capi) \
367 for (__capi = 0; __capi < _KERNEL_CAPABILITY_U32S; ++__capi)
368
369# define CAP_FS_MASK_B0 (CAP_TO_MASK(CAP_CHOWN) \
370 | CAP_TO_MASK(CAP_DAC_OVERRIDE) \
371 | CAP_TO_MASK(CAP_DAC_READ_SEARCH) \
372 | CAP_TO_MASK(CAP_FOWNER) \
373 | CAP_TO_MASK(CAP_FSETID))
374
375# define CAP_FS_MASK_B1 (CAP_TO_MASK(CAP_MAC_OVERRIDE))
376
377#if _KERNEL_CAPABILITY_U32S != 2
378# error Fix up hand-coded capability macro initializers
379#else
380
381# define CAP_EMPTY_SET ((kernel_cap_t){{ 0, 0 }})
382# define CAP_FULL_SET ((kernel_cap_t){{ ~0, ~0 }})
383# define CAP_INIT_EFF_SET ((kernel_cap_t){{ ~CAP_TO_MASK(CAP_SETPCAP), ~0 }})
384# define CAP_FS_SET ((kernel_cap_t){{ CAP_FS_MASK_B0, CAP_FS_MASK_B1 } })
385# define CAP_NFSD_SET ((kernel_cap_t){{ CAP_FS_MASK_B0|CAP_TO_MASK(CAP_SYS_RESOURCE), \
386 CAP_FS_MASK_B1 } })
387
388#endif
389
390#define CAP_INIT_INH_SET CAP_EMPTY_SET
391
392# define cap_clear(c) do { (c) = __cap_empty_set; } while (0)
393# define cap_set_full(c) do { (c) = __cap_full_set; } while (0)
394# define cap_set_init_eff(c) do { (c) = __cap_init_eff_set; } while (0)
395
396#define cap_raise(c, flag) ((c).cap[CAP_TO_INDEX(flag)] |= CAP_TO_MASK(flag))
397#define cap_lower(c, flag) ((c).cap[CAP_TO_INDEX(flag)] &= ~CAP_TO_MASK(flag))
398#define cap_raised(c, flag) ((c).cap[CAP_TO_INDEX(flag)] & CAP_TO_MASK(flag))
399
400#define CAP_BOP_ALL(c, a, b, OP) \
401do { \
402 unsigned __capi; \
403 CAP_FOR_EACH_U32(__capi) { \
404 c.cap[__capi] = a.cap[__capi] OP b.cap[__capi]; \
405 } \
406} while (0)
407
408#define CAP_UOP_ALL(c, a, OP) \
409do { \
410 unsigned __capi; \
411 CAP_FOR_EACH_U32(__capi) { \
412 c.cap[__capi] = OP a.cap[__capi]; \
413 } \
414} while (0)
415
416static inline kernel_cap_t cap_combine(const kernel_cap_t a,
417 const kernel_cap_t b)
418{
419 kernel_cap_t dest;
420 CAP_BOP_ALL(dest, a, b, |);
421 return dest;
422}
423
424static inline kernel_cap_t cap_intersect(const kernel_cap_t a,
425 const kernel_cap_t b)
426{
427 kernel_cap_t dest;
428 CAP_BOP_ALL(dest, a, b, &);
429 return dest;
430}
431
432static inline kernel_cap_t cap_drop(const kernel_cap_t a,
433 const kernel_cap_t drop)
434{
435 kernel_cap_t dest;
436 CAP_BOP_ALL(dest, a, drop, &~);
437 return dest;
438}
439
440static inline kernel_cap_t cap_invert(const kernel_cap_t c)
441{
442 kernel_cap_t dest;
443 CAP_UOP_ALL(dest, c, ~);
444 return dest;
445}
446
447static inline int cap_isclear(const kernel_cap_t a)
448{
449 unsigned __capi;
450 CAP_FOR_EACH_U32(__capi) {
451 if (a.cap[__capi] != 0)
452 return 0;
453 }
454 return 1;
455}
456
457static inline int cap_issubset(const kernel_cap_t a, const kernel_cap_t set)
458{
459 kernel_cap_t dest;
460 dest = cap_drop(a, set);
461 return cap_isclear(dest);
462}
463
464
465
466static inline int cap_is_fs_cap(int cap)
467{
468 const kernel_cap_t __cap_fs_set = CAP_FS_SET;
469 return !!(CAP_TO_MASK(cap) & __cap_fs_set.cap[CAP_TO_INDEX(cap)]);
470}
471
472static inline kernel_cap_t cap_drop_fs_set(const kernel_cap_t a)
473{
474 const kernel_cap_t __cap_fs_set = CAP_FS_SET;
475 return cap_drop(a, __cap_fs_set);
476}
477
478static inline kernel_cap_t cap_raise_fs_set(const kernel_cap_t a,
479 const kernel_cap_t permitted)
480{
481 const kernel_cap_t __cap_fs_set = CAP_FS_SET;
482 return cap_combine(a,
483 cap_intersect(permitted, __cap_fs_set));
484}
485
486static inline kernel_cap_t cap_drop_nfsd_set(const kernel_cap_t a)
487{
488 const kernel_cap_t __cap_fs_set = CAP_NFSD_SET;
489 return cap_drop(a, __cap_fs_set);
490}
491
492static inline kernel_cap_t cap_raise_nfsd_set(const kernel_cap_t a,
493 const kernel_cap_t permitted)
494{
495 const kernel_cap_t __cap_nfsd_set = CAP_NFSD_SET;
496 return cap_combine(a,
497 cap_intersect(permitted, __cap_nfsd_set));
498}
499
500extern const kernel_cap_t __cap_empty_set;
501extern const kernel_cap_t __cap_full_set;
502extern const kernel_cap_t __cap_init_eff_set;
503
504kernel_cap_t cap_set_effective(const kernel_cap_t pE_new);
505
506int capable(int cap);
507int __capable(struct task_struct *t, int cap);
508
509#endif
510
511#endif
512