| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * This is <linux/capability.h> | 
 | 3 |  * | 
| Serge E. Hallyn | b537677 | 2007-10-16 23:31:36 -0700 | [diff] [blame] | 4 |  * Andrew G. Morgan <morgan@kernel.org> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 5 |  * Alexander Kjeldaas <astor@guardian.no> | 
 | 6 |  * with help from Aleph1, Roland Buresund and Andrew Main. | 
 | 7 |  * | 
 | 8 |  * See here for the libcap library ("POSIX draft" compliance): | 
 | 9 |  * | 
| GeunSik Lim | bcf5644 | 2009-06-16 10:26:25 +0200 | [diff] [blame] | 10 |  * ftp://www.kernel.org/pub/linux/libs/security/linux-privs/kernel-2.6/ | 
| Serge E. Hallyn | b537677 | 2007-10-16 23:31:36 -0700 | [diff] [blame] | 11 |  */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 12 |  | 
 | 13 | #ifndef _LINUX_CAPABILITY_H | 
 | 14 | #define _LINUX_CAPABILITY_H | 
 | 15 |  | 
 | 16 | #include <linux/types.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 17 |  | 
| Andrew Morton | b7add02 | 2007-05-23 13:57:39 -0700 | [diff] [blame] | 18 | struct task_struct; | 
 | 19 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 20 | /* User-level do most of the mapping between kernel and user | 
 | 21 |    capabilities based on the version tag given by the kernel. The | 
 | 22 |    kernel might be somewhat backwards compatible, but don't bet on | 
 | 23 |    it. */ | 
 | 24 |  | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 25 | /* Note, cap_t, is defined by POSIX (draft) to be an "opaque" pointer to | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 26 |    a set of three capability sets.  The transposition of 3*the | 
 | 27 |    following structure to such a composite is better handled in a user | 
 | 28 |    library since the draft standard requires the use of malloc/free | 
 | 29 |    etc.. */ | 
| Serge E. Hallyn | b537677 | 2007-10-16 23:31:36 -0700 | [diff] [blame] | 30 |  | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 31 | #define _LINUX_CAPABILITY_VERSION_1  0x19980330 | 
 | 32 | #define _LINUX_CAPABILITY_U32S_1     1 | 
 | 33 |  | 
| Andrew G. Morgan | ca05a99 | 2008-05-27 22:05:17 -0700 | [diff] [blame] | 34 | #define _LINUX_CAPABILITY_VERSION_2  0x20071026  /* deprecated - use v3 */ | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 35 | #define _LINUX_CAPABILITY_U32S_2     2 | 
 | 36 |  | 
| Andrew G. Morgan | ca05a99 | 2008-05-27 22:05:17 -0700 | [diff] [blame] | 37 | #define _LINUX_CAPABILITY_VERSION_3  0x20080522 | 
 | 38 | #define _LINUX_CAPABILITY_U32S_3     2 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 39 |  | 
 | 40 | typedef struct __user_cap_header_struct { | 
 | 41 | 	__u32 version; | 
 | 42 | 	int pid; | 
 | 43 | } __user *cap_user_header_t; | 
| Serge E. Hallyn | b537677 | 2007-10-16 23:31:36 -0700 | [diff] [blame] | 44 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 45 | typedef struct __user_cap_data_struct { | 
 | 46 |         __u32 effective; | 
 | 47 |         __u32 permitted; | 
 | 48 |         __u32 inheritable; | 
 | 49 | } __user *cap_user_data_t; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 50 |  | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 51 |  | 
| Serge E. Hallyn | b537677 | 2007-10-16 23:31:36 -0700 | [diff] [blame] | 52 | #define XATTR_CAPS_SUFFIX "capability" | 
 | 53 | #define XATTR_NAME_CAPS XATTR_SECURITY_PREFIX XATTR_CAPS_SUFFIX | 
 | 54 |  | 
| Serge E. Hallyn | b537677 | 2007-10-16 23:31:36 -0700 | [diff] [blame] | 55 | #define VFS_CAP_REVISION_MASK	0xFF000000 | 
| Eric Paris | 851f7ff | 2008-11-11 21:48:14 +1100 | [diff] [blame] | 56 | #define VFS_CAP_REVISION_SHIFT	24 | 
| Serge E. Hallyn | b537677 | 2007-10-16 23:31:36 -0700 | [diff] [blame] | 57 | #define VFS_CAP_FLAGS_MASK	~VFS_CAP_REVISION_MASK | 
 | 58 | #define VFS_CAP_FLAGS_EFFECTIVE	0x000001 | 
 | 59 |  | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 60 | #define VFS_CAP_REVISION_1	0x01000000 | 
 | 61 | #define VFS_CAP_U32_1           1 | 
 | 62 | #define XATTR_CAPS_SZ_1         (sizeof(__le32)*(1 + 2*VFS_CAP_U32_1)) | 
 | 63 |  | 
 | 64 | #define VFS_CAP_REVISION_2	0x02000000 | 
 | 65 | #define VFS_CAP_U32_2           2 | 
 | 66 | #define XATTR_CAPS_SZ_2         (sizeof(__le32)*(1 + 2*VFS_CAP_U32_2)) | 
 | 67 |  | 
 | 68 | #define XATTR_CAPS_SZ           XATTR_CAPS_SZ_2 | 
 | 69 | #define VFS_CAP_U32             VFS_CAP_U32_2 | 
 | 70 | #define VFS_CAP_REVISION	VFS_CAP_REVISION_2 | 
 | 71 |  | 
| Serge E. Hallyn | b537677 | 2007-10-16 23:31:36 -0700 | [diff] [blame] | 72 | struct vfs_cap_data { | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 73 | 	__le32 magic_etc;            /* Little endian */ | 
| Andrew Morton | 8f6936f | 2008-02-04 22:29:41 -0800 | [diff] [blame] | 74 | 	struct { | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 75 | 		__le32 permitted;    /* Little endian */ | 
 | 76 | 		__le32 inheritable;  /* Little endian */ | 
 | 77 | 	} data[VFS_CAP_U32]; | 
| Serge E. Hallyn | b537677 | 2007-10-16 23:31:36 -0700 | [diff] [blame] | 78 | }; | 
 | 79 |  | 
| Andrew G. Morgan | ca05a99 | 2008-05-27 22:05:17 -0700 | [diff] [blame] | 80 | #ifndef __KERNEL__ | 
 | 81 |  | 
 | 82 | /* | 
 | 83 |  * Backwardly compatible definition for source code - trapped in a | 
 | 84 |  * 32-bit world. If you find you need this, please consider using | 
 | 85 |  * libcap to untrap yourself... | 
 | 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 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 94 |  | 
| Jaswinder Singh Rajput | 9fa91d9 | 2009-01-30 20:39:30 +0530 | [diff] [blame] | 95 | #ifdef CONFIG_SECURITY_FILE_CAPABILITIES | 
 | 96 | extern int file_caps_enabled; | 
 | 97 | #endif | 
 | 98 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 99 | typedef struct kernel_cap_struct { | 
| Andrew G. Morgan | ca05a99 | 2008-05-27 22:05:17 -0700 | [diff] [blame] | 100 | 	__u32 cap[_KERNEL_CAPABILITY_U32S]; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 101 | } kernel_cap_t; | 
 | 102 |  | 
| Eric Paris | c0b0044 | 2008-11-11 21:48:10 +1100 | [diff] [blame] | 103 | /* exact same as vfs_cap_data but in cpu endian and always filled completely */ | 
 | 104 | struct cpu_vfs_cap_data { | 
 | 105 | 	__u32 magic_etc; | 
 | 106 | 	kernel_cap_t permitted; | 
 | 107 | 	kernel_cap_t inheritable; | 
 | 108 | }; | 
 | 109 |  | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 110 | #define _USER_CAP_HEADER_SIZE  (sizeof(struct __user_cap_header_struct)) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 111 | #define _KERNEL_CAP_T_SIZE     (sizeof(kernel_cap_t)) | 
 | 112 |  | 
 | 113 | #endif | 
 | 114 |  | 
 | 115 |  | 
 | 116 | /** | 
| Serge E. Hallyn | b537677 | 2007-10-16 23:31:36 -0700 | [diff] [blame] | 117 |  ** POSIX-draft defined capabilities. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 118 |  **/ | 
 | 119 |  | 
 | 120 | /* In a system with the [_POSIX_CHOWN_RESTRICTED] option defined, this | 
 | 121 |    overrides the restriction of changing file ownership and group | 
 | 122 |    ownership. */ | 
 | 123 |  | 
 | 124 | #define CAP_CHOWN            0 | 
 | 125 |  | 
 | 126 | /* Override all DAC access, including ACL execute access if | 
 | 127 |    [_POSIX_ACL] is defined. Excluding DAC access covered by | 
 | 128 |    CAP_LINUX_IMMUTABLE. */ | 
 | 129 |  | 
 | 130 | #define CAP_DAC_OVERRIDE     1 | 
 | 131 |  | 
 | 132 | /* Overrides all DAC restrictions regarding read and search on files | 
 | 133 |    and directories, including ACL restrictions if [_POSIX_ACL] is | 
 | 134 |    defined. Excluding DAC access covered by CAP_LINUX_IMMUTABLE. */ | 
 | 135 |  | 
 | 136 | #define CAP_DAC_READ_SEARCH  2 | 
| Serge E. Hallyn | b537677 | 2007-10-16 23:31:36 -0700 | [diff] [blame] | 137 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 138 | /* Overrides all restrictions about allowed operations on files, where | 
 | 139 |    file owner ID must be equal to the user ID, except where CAP_FSETID | 
 | 140 |    is applicable. It doesn't override MAC and DAC restrictions. */ | 
 | 141 |  | 
 | 142 | #define CAP_FOWNER           3 | 
 | 143 |  | 
 | 144 | /* Overrides the following restrictions that the effective user ID | 
 | 145 |    shall match the file owner ID when setting the S_ISUID and S_ISGID | 
 | 146 |    bits on that file; that the effective group ID (or one of the | 
 | 147 |    supplementary group IDs) shall match the file owner ID when setting | 
 | 148 |    the S_ISGID bit on that file; that the S_ISUID and S_ISGID bits are | 
 | 149 |    cleared on successful return from chown(2) (not implemented). */ | 
 | 150 |  | 
 | 151 | #define CAP_FSETID           4 | 
 | 152 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 153 | /* Overrides the restriction that the real or effective user ID of a | 
 | 154 |    process sending a signal must match the real or effective user ID | 
 | 155 |    of the process receiving the signal. */ | 
 | 156 |  | 
 | 157 | #define CAP_KILL             5 | 
 | 158 |  | 
 | 159 | /* Allows setgid(2) manipulation */ | 
 | 160 | /* Allows setgroups(2) */ | 
 | 161 | /* Allows forged gids on socket credentials passing. */ | 
 | 162 |  | 
 | 163 | #define CAP_SETGID           6 | 
 | 164 |  | 
 | 165 | /* Allows set*uid(2) manipulation (including fsuid). */ | 
 | 166 | /* Allows forged pids on socket credentials passing. */ | 
 | 167 |  | 
 | 168 | #define CAP_SETUID           7 | 
 | 169 |  | 
 | 170 |  | 
 | 171 | /** | 
 | 172 |  ** Linux-specific capabilities | 
 | 173 |  **/ | 
 | 174 |  | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 175 | /* Without VFS support for capabilities: | 
 | 176 |  *   Transfer any capability in your permitted set to any pid, | 
 | 177 |  *   remove any capability in your permitted set from any pid | 
 | 178 |  * With VFS support for capabilities (neither of above, but) | 
| Serge E. Hallyn | 3b7391d | 2008-02-04 22:29:45 -0800 | [diff] [blame] | 179 |  *   Add any capability from current's capability bounding set | 
 | 180 |  *       to the current process' inheritable set | 
 | 181 |  *   Allow taking bits out of capability bounding set | 
| Andrew G. Morgan | 3898b1b | 2008-04-28 02:13:40 -0700 | [diff] [blame] | 182 |  *   Allow modification of the securebits for a process | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 183 |  */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 184 |  | 
 | 185 | #define CAP_SETPCAP          8 | 
 | 186 |  | 
 | 187 | /* Allow modification of S_IMMUTABLE and S_APPEND file attributes */ | 
 | 188 |  | 
 | 189 | #define CAP_LINUX_IMMUTABLE  9 | 
 | 190 |  | 
 | 191 | /* Allows binding to TCP/UDP sockets below 1024 */ | 
 | 192 | /* Allows binding to ATM VCIs below 32 */ | 
 | 193 |  | 
 | 194 | #define CAP_NET_BIND_SERVICE 10 | 
 | 195 |  | 
 | 196 | /* Allow broadcasting, listen to multicast */ | 
 | 197 |  | 
 | 198 | #define CAP_NET_BROADCAST    11 | 
 | 199 |  | 
 | 200 | /* Allow interface configuration */ | 
 | 201 | /* Allow administration of IP firewall, masquerading and accounting */ | 
 | 202 | /* Allow setting debug option on sockets */ | 
 | 203 | /* Allow modification of routing tables */ | 
 | 204 | /* Allow setting arbitrary process / process group ownership on | 
 | 205 |    sockets */ | 
 | 206 | /* Allow binding to any address for transparent proxying */ | 
 | 207 | /* Allow setting TOS (type of service) */ | 
 | 208 | /* Allow setting promiscuous mode */ | 
 | 209 | /* Allow clearing driver statistics */ | 
 | 210 | /* Allow multicasting */ | 
 | 211 | /* Allow read/write of device-specific registers */ | 
 | 212 | /* Allow activation of ATM control sockets */ | 
 | 213 |  | 
 | 214 | #define CAP_NET_ADMIN        12 | 
 | 215 |  | 
 | 216 | /* Allow use of RAW sockets */ | 
 | 217 | /* Allow use of PACKET sockets */ | 
 | 218 |  | 
 | 219 | #define CAP_NET_RAW          13 | 
 | 220 |  | 
 | 221 | /* Allow locking of shared memory segments */ | 
 | 222 | /* Allow mlock and mlockall (which doesn't really have anything to do | 
 | 223 |    with IPC) */ | 
 | 224 |  | 
 | 225 | #define CAP_IPC_LOCK         14 | 
 | 226 |  | 
 | 227 | /* Override IPC ownership checks */ | 
 | 228 |  | 
 | 229 | #define CAP_IPC_OWNER        15 | 
 | 230 |  | 
 | 231 | /* Insert and remove kernel modules - modify kernel without limit */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 232 | #define CAP_SYS_MODULE       16 | 
 | 233 |  | 
 | 234 | /* Allow ioperm/iopl access */ | 
 | 235 | /* Allow sending USB messages to any device via /proc/bus/usb */ | 
 | 236 |  | 
 | 237 | #define CAP_SYS_RAWIO        17 | 
 | 238 |  | 
 | 239 | /* Allow use of chroot() */ | 
 | 240 |  | 
 | 241 | #define CAP_SYS_CHROOT       18 | 
 | 242 |  | 
 | 243 | /* Allow ptrace() of any process */ | 
 | 244 |  | 
 | 245 | #define CAP_SYS_PTRACE       19 | 
 | 246 |  | 
 | 247 | /* Allow configuration of process accounting */ | 
 | 248 |  | 
 | 249 | #define CAP_SYS_PACCT        20 | 
 | 250 |  | 
 | 251 | /* Allow configuration of the secure attention key */ | 
 | 252 | /* Allow administration of the random device */ | 
 | 253 | /* Allow examination and configuration of disk quotas */ | 
 | 254 | /* Allow configuring the kernel's syslog (printk behaviour) */ | 
 | 255 | /* Allow setting the domainname */ | 
 | 256 | /* Allow setting the hostname */ | 
 | 257 | /* Allow calling bdflush() */ | 
 | 258 | /* Allow mount() and umount(), setting up new smb connection */ | 
 | 259 | /* Allow some autofs root ioctls */ | 
 | 260 | /* Allow nfsservctl */ | 
 | 261 | /* Allow VM86_REQUEST_IRQ */ | 
 | 262 | /* Allow to read/write pci config on alpha */ | 
 | 263 | /* Allow irix_prctl on mips (setstacksize) */ | 
 | 264 | /* Allow flushing all cache on m68k (sys_cacheflush) */ | 
 | 265 | /* Allow removing semaphores */ | 
 | 266 | /* Used instead of CAP_CHOWN to "chown" IPC message queues, semaphores | 
 | 267 |    and shared memory */ | 
 | 268 | /* Allow locking/unlocking of shared memory segment */ | 
 | 269 | /* Allow turning swap on/off */ | 
 | 270 | /* Allow forged pids on socket credentials passing */ | 
 | 271 | /* Allow setting readahead and flushing buffers on block devices */ | 
 | 272 | /* Allow setting geometry in floppy driver */ | 
 | 273 | /* Allow turning DMA on/off in xd driver */ | 
 | 274 | /* Allow administration of md devices (mostly the above, but some | 
 | 275 |    extra ioctls) */ | 
 | 276 | /* Allow tuning the ide driver */ | 
 | 277 | /* Allow access to the nvram device */ | 
 | 278 | /* Allow administration of apm_bios, serial and bttv (TV) device */ | 
 | 279 | /* Allow manufacturer commands in isdn CAPI support driver */ | 
 | 280 | /* Allow reading non-standardized portions of pci configuration space */ | 
 | 281 | /* Allow DDI debug ioctl on sbpcd driver */ | 
 | 282 | /* Allow setting up serial ports */ | 
 | 283 | /* Allow sending raw qic-117 commands */ | 
 | 284 | /* Allow enabling/disabling tagged queuing on SCSI controllers and sending | 
 | 285 |    arbitrary SCSI commands */ | 
 | 286 | /* Allow setting encryption key on loopback filesystem */ | 
| Martin Hicks | bce5f6ba | 2005-09-03 15:54:50 -0700 | [diff] [blame] | 287 | /* Allow setting zone reclaim policy */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 288 |  | 
 | 289 | #define CAP_SYS_ADMIN        21 | 
 | 290 |  | 
 | 291 | /* Allow use of reboot() */ | 
 | 292 |  | 
 | 293 | #define CAP_SYS_BOOT         22 | 
 | 294 |  | 
 | 295 | /* Allow raising priority and setting priority on other (different | 
 | 296 |    UID) processes */ | 
 | 297 | /* Allow use of FIFO and round-robin (realtime) scheduling on own | 
 | 298 |    processes and setting the scheduling algorithm used by another | 
 | 299 |    process. */ | 
 | 300 | /* Allow setting cpu affinity on other processes */ | 
 | 301 |  | 
 | 302 | #define CAP_SYS_NICE         23 | 
 | 303 |  | 
 | 304 | /* Override resource limits. Set resource limits. */ | 
 | 305 | /* Override quota limits. */ | 
 | 306 | /* Override reserved space on ext2 filesystem */ | 
 | 307 | /* Modify data journaling mode on ext3 filesystem (uses journaling | 
 | 308 |    resources) */ | 
| Serge E. Hallyn | b537677 | 2007-10-16 23:31:36 -0700 | [diff] [blame] | 309 | /* NOTE: ext2 honors fsuid when checking for resource overrides, so | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 310 |    you can override using fsuid too */ | 
 | 311 | /* Override size restrictions on IPC message queues */ | 
 | 312 | /* Allow more than 64hz interrupts from the real-time clock */ | 
 | 313 | /* Override max number of consoles on console allocation */ | 
 | 314 | /* Override max number of keymaps */ | 
 | 315 |  | 
 | 316 | #define CAP_SYS_RESOURCE     24 | 
 | 317 |  | 
 | 318 | /* Allow manipulation of system clock */ | 
 | 319 | /* Allow irix_stime on mips */ | 
 | 320 | /* Allow setting the real-time clock */ | 
 | 321 |  | 
 | 322 | #define CAP_SYS_TIME         25 | 
 | 323 |  | 
 | 324 | /* Allow configuration of tty devices */ | 
 | 325 | /* Allow vhangup() of tty */ | 
 | 326 |  | 
 | 327 | #define CAP_SYS_TTY_CONFIG   26 | 
 | 328 |  | 
 | 329 | /* Allow the privileged aspects of mknod() */ | 
 | 330 |  | 
 | 331 | #define CAP_MKNOD            27 | 
 | 332 |  | 
 | 333 | /* Allow taking of leases on files */ | 
 | 334 |  | 
 | 335 | #define CAP_LEASE            28 | 
 | 336 |  | 
 | 337 | #define CAP_AUDIT_WRITE      29 | 
 | 338 |  | 
 | 339 | #define CAP_AUDIT_CONTROL    30 | 
 | 340 |  | 
| Serge E. Hallyn | b537677 | 2007-10-16 23:31:36 -0700 | [diff] [blame] | 341 | #define CAP_SETFCAP	     31 | 
 | 342 |  | 
| Casey Schaufler | e114e47 | 2008-02-04 22:29:50 -0800 | [diff] [blame] | 343 | /* Override MAC access. | 
 | 344 |    The base kernel enforces no MAC policy. | 
 | 345 |    An LSM may enforce a MAC policy, and if it does and it chooses | 
 | 346 |    to implement capability based overrides of that policy, this is | 
 | 347 |    the capability it should use to do so. */ | 
 | 348 |  | 
 | 349 | #define CAP_MAC_OVERRIDE     32 | 
 | 350 |  | 
 | 351 | /* Allow MAC configuration or state changes. | 
 | 352 |    The base kernel requires no MAC configuration. | 
 | 353 |    An LSM may enforce a MAC policy, and if it does and it chooses | 
 | 354 |    to implement capability based checks on modifications to that | 
 | 355 |    policy or the data required to maintain it, this is the | 
 | 356 |    capability it should use to do so. */ | 
 | 357 |  | 
 | 358 | #define CAP_MAC_ADMIN        33 | 
 | 359 |  | 
 | 360 | #define CAP_LAST_CAP         CAP_MAC_ADMIN | 
| Serge E. Hallyn | 3b7391d | 2008-02-04 22:29:45 -0800 | [diff] [blame] | 361 |  | 
 | 362 | #define cap_valid(x) ((x) >= 0 && (x) <= CAP_LAST_CAP) | 
 | 363 |  | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 364 | /* | 
 | 365 |  * Bit location of each capability (used by user-space library and kernel) | 
 | 366 |  */ | 
 | 367 |  | 
 | 368 | #define CAP_TO_INDEX(x)     ((x) >> 5)        /* 1 << 5 == bits in __u32 */ | 
 | 369 | #define CAP_TO_MASK(x)      (1 << ((x) & 31)) /* mask for indexed __u32 */ | 
 | 370 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 371 | #ifdef __KERNEL__ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 372 |  | 
 | 373 | /* | 
 | 374 |  * Internal kernel functions only | 
 | 375 |  */ | 
| Serge E. Hallyn | b537677 | 2007-10-16 23:31:36 -0700 | [diff] [blame] | 376 |  | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 377 | #define CAP_FOR_EACH_U32(__capi)  \ | 
| Andrew G. Morgan | ca05a99 | 2008-05-27 22:05:17 -0700 | [diff] [blame] | 378 | 	for (__capi = 0; __capi < _KERNEL_CAPABILITY_U32S; ++__capi) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 379 |  | 
| Serge E. Hallyn | 0ad30b8 | 2009-04-13 09:56:14 -0500 | [diff] [blame] | 380 | /* | 
 | 381 |  * CAP_FS_MASK and CAP_NFSD_MASKS: | 
 | 382 |  * | 
 | 383 |  * The fs mask is all the privileges that fsuid==0 historically meant. | 
 | 384 |  * At one time in the past, that included CAP_MKNOD and CAP_LINUX_IMMUTABLE. | 
 | 385 |  * | 
 | 386 |  * It has never meant setting security.* and trusted.* xattrs. | 
 | 387 |  * | 
 | 388 |  * We could also define fsmask as follows: | 
 | 389 |  *   1. CAP_FS_MASK is the privilege to bypass all fs-related DAC permissions | 
 | 390 |  *   2. The security.* and trusted.* xattrs are fs-related MAC permissions | 
 | 391 |  */ | 
 | 392 |  | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 393 | # define CAP_FS_MASK_B0     (CAP_TO_MASK(CAP_CHOWN)		\ | 
| Serge E. Hallyn | 0ad30b8 | 2009-04-13 09:56:14 -0500 | [diff] [blame] | 394 | 			    | CAP_TO_MASK(CAP_MKNOD)		\ | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 395 | 			    | CAP_TO_MASK(CAP_DAC_OVERRIDE)	\ | 
 | 396 | 			    | CAP_TO_MASK(CAP_DAC_READ_SEARCH)	\ | 
 | 397 | 			    | CAP_TO_MASK(CAP_FOWNER)		\ | 
 | 398 | 			    | CAP_TO_MASK(CAP_FSETID)) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 399 |  | 
| Casey Schaufler | e114e47 | 2008-02-04 22:29:50 -0800 | [diff] [blame] | 400 | # define CAP_FS_MASK_B1     (CAP_TO_MASK(CAP_MAC_OVERRIDE)) | 
 | 401 |  | 
| Andrew G. Morgan | ca05a99 | 2008-05-27 22:05:17 -0700 | [diff] [blame] | 402 | #if _KERNEL_CAPABILITY_U32S != 2 | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 403 | # error Fix up hand-coded capability macro initializers | 
 | 404 | #else /* HAND-CODED capability initializers */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 405 |  | 
| David Howells | 25f2ea9 | 2008-04-29 20:54:28 +0100 | [diff] [blame] | 406 | # define CAP_EMPTY_SET    ((kernel_cap_t){{ 0, 0 }}) | 
 | 407 | # define CAP_FULL_SET     ((kernel_cap_t){{ ~0, ~0 }}) | 
 | 408 | # define CAP_INIT_EFF_SET ((kernel_cap_t){{ ~CAP_TO_MASK(CAP_SETPCAP), ~0 }}) | 
| Serge E. Hallyn | 0ad30b8 | 2009-04-13 09:56:14 -0500 | [diff] [blame] | 409 | # define CAP_FS_SET       ((kernel_cap_t){{ CAP_FS_MASK_B0 \ | 
 | 410 | 				    | CAP_TO_MASK(CAP_LINUX_IMMUTABLE), \ | 
 | 411 | 				    CAP_FS_MASK_B1 } }) | 
| J. Bruce Fields | 76a67ec | 2009-03-16 18:34:20 -0400 | [diff] [blame] | 412 | # define CAP_NFSD_SET     ((kernel_cap_t){{ CAP_FS_MASK_B0 \ | 
| Serge E. Hallyn | 0ad30b8 | 2009-04-13 09:56:14 -0500 | [diff] [blame] | 413 | 				    | CAP_TO_MASK(CAP_SYS_RESOURCE), \ | 
 | 414 | 				    CAP_FS_MASK_B1 } }) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 415 |  | 
| Andrew G. Morgan | ca05a99 | 2008-05-27 22:05:17 -0700 | [diff] [blame] | 416 | #endif /* _KERNEL_CAPABILITY_U32S != 2 */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 417 |  | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 418 | #define CAP_INIT_INH_SET    CAP_EMPTY_SET | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 419 |  | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 420 | # define cap_clear(c)         do { (c) = __cap_empty_set; } while (0) | 
 | 421 | # define cap_set_full(c)      do { (c) = __cap_full_set; } while (0) | 
 | 422 | # define cap_set_init_eff(c)  do { (c) = __cap_init_eff_set; } while (0) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 423 |  | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 424 | #define cap_raise(c, flag)  ((c).cap[CAP_TO_INDEX(flag)] |= CAP_TO_MASK(flag)) | 
 | 425 | #define cap_lower(c, flag)  ((c).cap[CAP_TO_INDEX(flag)] &= ~CAP_TO_MASK(flag)) | 
 | 426 | #define cap_raised(c, flag) ((c).cap[CAP_TO_INDEX(flag)] & CAP_TO_MASK(flag)) | 
 | 427 |  | 
 | 428 | #define CAP_BOP_ALL(c, a, b, OP)                                    \ | 
 | 429 | do {                                                                \ | 
 | 430 | 	unsigned __capi;                                            \ | 
 | 431 | 	CAP_FOR_EACH_U32(__capi) {                                  \ | 
 | 432 | 		c.cap[__capi] = a.cap[__capi] OP b.cap[__capi];     \ | 
 | 433 | 	}                                                           \ | 
 | 434 | } while (0) | 
 | 435 |  | 
 | 436 | #define CAP_UOP_ALL(c, a, OP)                                       \ | 
 | 437 | do {                                                                \ | 
 | 438 | 	unsigned __capi;                                            \ | 
 | 439 | 	CAP_FOR_EACH_U32(__capi) {                                  \ | 
 | 440 | 		c.cap[__capi] = OP a.cap[__capi];                   \ | 
 | 441 | 	}                                                           \ | 
 | 442 | } while (0) | 
 | 443 |  | 
 | 444 | static inline kernel_cap_t cap_combine(const kernel_cap_t a, | 
 | 445 | 				       const kernel_cap_t b) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 446 | { | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 447 | 	kernel_cap_t dest; | 
 | 448 | 	CAP_BOP_ALL(dest, a, b, |); | 
 | 449 | 	return dest; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 450 | } | 
 | 451 |  | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 452 | static inline kernel_cap_t cap_intersect(const kernel_cap_t a, | 
 | 453 | 					 const kernel_cap_t b) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 454 | { | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 455 | 	kernel_cap_t dest; | 
 | 456 | 	CAP_BOP_ALL(dest, a, b, &); | 
 | 457 | 	return dest; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 458 | } | 
 | 459 |  | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 460 | static inline kernel_cap_t cap_drop(const kernel_cap_t a, | 
 | 461 | 				    const kernel_cap_t drop) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 462 | { | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 463 | 	kernel_cap_t dest; | 
 | 464 | 	CAP_BOP_ALL(dest, a, drop, &~); | 
 | 465 | 	return dest; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 466 | } | 
 | 467 |  | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 468 | static inline kernel_cap_t cap_invert(const kernel_cap_t c) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 469 | { | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 470 | 	kernel_cap_t dest; | 
 | 471 | 	CAP_UOP_ALL(dest, c, ~); | 
 | 472 | 	return dest; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 473 | } | 
 | 474 |  | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 475 | static inline int cap_isclear(const kernel_cap_t a) | 
 | 476 | { | 
 | 477 | 	unsigned __capi; | 
 | 478 | 	CAP_FOR_EACH_U32(__capi) { | 
 | 479 | 		if (a.cap[__capi] != 0) | 
 | 480 | 			return 0; | 
 | 481 | 	} | 
 | 482 | 	return 1; | 
 | 483 | } | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 484 |  | 
| Eric Paris | 9d36be7 | 2008-11-11 21:48:07 +1100 | [diff] [blame] | 485 | /* | 
 | 486 |  * Check if "a" is a subset of "set". | 
 | 487 |  * return 1 if ALL of the capabilities in "a" are also in "set" | 
 | 488 |  *	cap_issubset(0101, 1111) will return 1 | 
 | 489 |  * return 0 if ANY of the capabilities in "a" are not in "set" | 
 | 490 |  *	cap_issubset(1111, 0101) will return 0 | 
 | 491 |  */ | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 492 | static inline int cap_issubset(const kernel_cap_t a, const kernel_cap_t set) | 
 | 493 | { | 
 | 494 | 	kernel_cap_t dest; | 
 | 495 | 	dest = cap_drop(a, set); | 
 | 496 | 	return cap_isclear(dest); | 
 | 497 | } | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 498 |  | 
| Andrew Morgan | e338d26 | 2008-02-04 22:29:42 -0800 | [diff] [blame] | 499 | /* Used to decide between falling back on the old suser() or fsuser(). */ | 
 | 500 |  | 
 | 501 | static inline int cap_is_fs_cap(int cap) | 
 | 502 | { | 
 | 503 | 	const kernel_cap_t __cap_fs_set = CAP_FS_SET; | 
 | 504 | 	return !!(CAP_TO_MASK(cap) & __cap_fs_set.cap[CAP_TO_INDEX(cap)]); | 
 | 505 | } | 
 | 506 |  | 
 | 507 | static inline kernel_cap_t cap_drop_fs_set(const kernel_cap_t a) | 
 | 508 | { | 
 | 509 | 	const kernel_cap_t __cap_fs_set = CAP_FS_SET; | 
 | 510 | 	return cap_drop(a, __cap_fs_set); | 
 | 511 | } | 
 | 512 |  | 
 | 513 | static inline kernel_cap_t cap_raise_fs_set(const kernel_cap_t a, | 
 | 514 | 					    const kernel_cap_t permitted) | 
 | 515 | { | 
 | 516 | 	const kernel_cap_t __cap_fs_set = CAP_FS_SET; | 
 | 517 | 	return cap_combine(a, | 
 | 518 | 			   cap_intersect(permitted, __cap_fs_set)); | 
 | 519 | } | 
 | 520 |  | 
 | 521 | static inline kernel_cap_t cap_drop_nfsd_set(const kernel_cap_t a) | 
 | 522 | { | 
 | 523 | 	const kernel_cap_t __cap_fs_set = CAP_NFSD_SET; | 
 | 524 | 	return cap_drop(a, __cap_fs_set); | 
 | 525 | } | 
 | 526 |  | 
 | 527 | static inline kernel_cap_t cap_raise_nfsd_set(const kernel_cap_t a, | 
 | 528 | 					      const kernel_cap_t permitted) | 
 | 529 | { | 
 | 530 | 	const kernel_cap_t __cap_nfsd_set = CAP_NFSD_SET; | 
 | 531 | 	return cap_combine(a, | 
 | 532 | 			   cap_intersect(permitted, __cap_nfsd_set)); | 
 | 533 | } | 
 | 534 |  | 
 | 535 | extern const kernel_cap_t __cap_empty_set; | 
 | 536 | extern const kernel_cap_t __cap_full_set; | 
 | 537 | extern const kernel_cap_t __cap_init_eff_set; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 538 |  | 
| David Howells | 5cd9c58 | 2008-08-14 11:37:28 +0100 | [diff] [blame] | 539 | /** | 
 | 540 |  * has_capability - Determine if a task has a superior capability available | 
 | 541 |  * @t: The task in question | 
 | 542 |  * @cap: The capability to be tested for | 
 | 543 |  * | 
 | 544 |  * Return true if the specified task has the given superior capability | 
 | 545 |  * currently in effect, false if not. | 
 | 546 |  * | 
 | 547 |  * Note that this does not set PF_SUPERPRIV on the task. | 
 | 548 |  */ | 
| David Howells | 3699c53 | 2009-01-06 22:27:01 +0000 | [diff] [blame] | 549 | #define has_capability(t, cap) (security_real_capable((t), (cap)) == 0) | 
 | 550 |  | 
 | 551 | /** | 
 | 552 |  * has_capability_noaudit - Determine if a task has a superior capability available (unaudited) | 
 | 553 |  * @t: The task in question | 
 | 554 |  * @cap: The capability to be tested for | 
 | 555 |  * | 
 | 556 |  * Return true if the specified task has the given superior capability | 
 | 557 |  * currently in effect, false if not, but don't write an audit message for the | 
 | 558 |  * check. | 
 | 559 |  * | 
 | 560 |  * Note that this does not set PF_SUPERPRIV on the task. | 
 | 561 |  */ | 
 | 562 | #define has_capability_noaudit(t, cap) \ | 
 | 563 | 	(security_real_capable_noaudit((t), (cap)) == 0) | 
| David Howells | 5cd9c58 | 2008-08-14 11:37:28 +0100 | [diff] [blame] | 564 |  | 
 | 565 | extern int capable(int cap); | 
| Randy.Dunlap | c59ede7 | 2006-01-11 12:17:46 -0800 | [diff] [blame] | 566 |  | 
| Eric Paris | 851f7ff | 2008-11-11 21:48:14 +1100 | [diff] [blame] | 567 | /* audit system wants to get cap info from files as well */ | 
 | 568 | struct dentry; | 
 | 569 | extern int get_vfs_caps_from_disk(const struct dentry *dentry, struct cpu_vfs_cap_data *cpu_caps); | 
 | 570 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 571 | #endif /* __KERNEL__ */ | 
 | 572 |  | 
 | 573 | #endif /* !_LINUX_CAPABILITY_H */ |