1 // SPDX-License-Identifier: GPL-2.0 << 2 /* 1 /* 3 * linux/kernel/capability.c 2 * linux/kernel/capability.c 4 * 3 * 5 * Copyright (C) 1997 Andrew Main <zefram@fys 4 * Copyright (C) 1997 Andrew Main <zefram@fysh.org> 6 * 5 * 7 * Integrated into 2.1.97+, Andrew G. Morgan 6 * Integrated into 2.1.97+, Andrew G. Morgan <morgan@kernel.org> 8 * 30 May 2002: Cleanup, Robert M. Love <rml@t 7 * 30 May 2002: Cleanup, Robert M. Love <rml@tech9.net> 9 */ 8 */ 10 9 11 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt << 12 << 13 #include <linux/audit.h> 10 #include <linux/audit.h> 14 #include <linux/capability.h> 11 #include <linux/capability.h> 15 #include <linux/mm.h> 12 #include <linux/mm.h> 16 #include <linux/export.h> 13 #include <linux/export.h> 17 #include <linux/security.h> 14 #include <linux/security.h> 18 #include <linux/syscalls.h> 15 #include <linux/syscalls.h> 19 #include <linux/pid_namespace.h> 16 #include <linux/pid_namespace.h> 20 #include <linux/user_namespace.h> 17 #include <linux/user_namespace.h> 21 #include <linux/uaccess.h> !! 18 #include <asm/uaccess.h> >> 19 >> 20 /* >> 21 * Leveraged for setting/resetting capabilities >> 22 */ >> 23 >> 24 const kernel_cap_t __cap_empty_set = CAP_EMPTY_SET; >> 25 >> 26 EXPORT_SYMBOL(__cap_empty_set); 22 27 23 int file_caps_enabled = 1; 28 int file_caps_enabled = 1; 24 29 25 static int __init file_caps_disable(char *str) 30 static int __init file_caps_disable(char *str) 26 { 31 { 27 file_caps_enabled = 0; 32 file_caps_enabled = 0; 28 return 1; 33 return 1; 29 } 34 } 30 __setup("no_file_caps", file_caps_disable); 35 __setup("no_file_caps", file_caps_disable); 31 36 32 #ifdef CONFIG_MULTIUSER << 33 /* 37 /* 34 * More recent versions of libcap are availabl 38 * More recent versions of libcap are available from: 35 * 39 * 36 * http://www.kernel.org/pub/linux/libs/secu 40 * http://www.kernel.org/pub/linux/libs/security/linux-privs/ 37 */ 41 */ 38 42 39 static void warn_legacy_capability_use(void) 43 static void warn_legacy_capability_use(void) 40 { 44 { 41 char name[sizeof(current->comm)]; !! 45 static int warned; 42 !! 46 if (!warned) { 43 pr_info_once("warning: `%s' uses 32-bi !! 47 char name[sizeof(current->comm)]; 44 get_task_comm(name, curre !! 48 >> 49 printk(KERN_INFO "warning: `%s' uses 32-bit capabilities" >> 50 " (legacy support in use)\n", >> 51 get_task_comm(name, current)); >> 52 warned = 1; >> 53 } 45 } 54 } 46 55 47 /* 56 /* 48 * Version 2 capabilities worked fine, but the 57 * Version 2 capabilities worked fine, but the linux/capability.h file 49 * that accompanied their introduction encoura 58 * that accompanied their introduction encouraged their use without 50 * the necessary user-space source code change 59 * the necessary user-space source code changes. As such, we have 51 * created a version 3 with equivalent functio 60 * created a version 3 with equivalent functionality to version 2, but 52 * with a header change to protect legacy sour 61 * with a header change to protect legacy source code from using 53 * version 2 when it wanted to use version 1. 62 * version 2 when it wanted to use version 1. If your system has code 54 * that trips the following warning, it is usi 63 * that trips the following warning, it is using version 2 specific 55 * capabilities and may be doing so insecurely 64 * capabilities and may be doing so insecurely. 56 * 65 * 57 * The remedy is to either upgrade your versio 66 * The remedy is to either upgrade your version of libcap (to 2.10+, 58 * if the application is linked against it), o 67 * if the application is linked against it), or recompile your 59 * application with modern kernel headers and 68 * application with modern kernel headers and this warning will go 60 * away. 69 * away. 61 */ 70 */ 62 71 63 static void warn_deprecated_v2(void) 72 static void warn_deprecated_v2(void) 64 { 73 { 65 char name[sizeof(current->comm)]; !! 74 static int warned; >> 75 >> 76 if (!warned) { >> 77 char name[sizeof(current->comm)]; 66 78 67 pr_info_once("warning: `%s' uses depre !! 79 printk(KERN_INFO "warning: `%s' uses deprecated v2" 68 get_task_comm(name, curre !! 80 " capabilities in a way that may be insecure.\n", >> 81 get_task_comm(name, current)); >> 82 warned = 1; >> 83 } 69 } 84 } 70 85 71 /* 86 /* 72 * Version check. Return the number of u32s in 87 * Version check. Return the number of u32s in each capability flag 73 * array, or a negative value on error. 88 * array, or a negative value on error. 74 */ 89 */ 75 static int cap_validate_magic(cap_user_header_ 90 static int cap_validate_magic(cap_user_header_t header, unsigned *tocopy) 76 { 91 { 77 __u32 version; 92 __u32 version; 78 93 79 if (get_user(version, &header->version 94 if (get_user(version, &header->version)) 80 return -EFAULT; 95 return -EFAULT; 81 96 82 switch (version) { 97 switch (version) { 83 case _LINUX_CAPABILITY_VERSION_1: 98 case _LINUX_CAPABILITY_VERSION_1: 84 warn_legacy_capability_use(); 99 warn_legacy_capability_use(); 85 *tocopy = _LINUX_CAPABILITY_U3 100 *tocopy = _LINUX_CAPABILITY_U32S_1; 86 break; 101 break; 87 case _LINUX_CAPABILITY_VERSION_2: 102 case _LINUX_CAPABILITY_VERSION_2: 88 warn_deprecated_v2(); 103 warn_deprecated_v2(); 89 fallthrough; /* v3 is other !! 104 /* >> 105 * fall through - v3 is otherwise equivalent to v2. >> 106 */ 90 case _LINUX_CAPABILITY_VERSION_3: 107 case _LINUX_CAPABILITY_VERSION_3: 91 *tocopy = _LINUX_CAPABILITY_U3 108 *tocopy = _LINUX_CAPABILITY_U32S_3; 92 break; 109 break; 93 default: 110 default: 94 if (put_user((u32)_KERNEL_CAPA 111 if (put_user((u32)_KERNEL_CAPABILITY_VERSION, &header->version)) 95 return -EFAULT; 112 return -EFAULT; 96 return -EINVAL; 113 return -EINVAL; 97 } 114 } 98 115 99 return 0; 116 return 0; 100 } 117 } 101 118 102 /* 119 /* 103 * The only thing that can change the capabili 120 * The only thing that can change the capabilities of the current 104 * process is the current process. As such, we 121 * process is the current process. As such, we can't be in this code 105 * at the same time as we are in the process o 122 * at the same time as we are in the process of setting capabilities 106 * in this process. The net result is that we 123 * in this process. The net result is that we can limit our use of 107 * locks to when we are reading the caps of an 124 * locks to when we are reading the caps of another process. 108 */ 125 */ 109 static inline int cap_get_target_pid(pid_t pid 126 static inline int cap_get_target_pid(pid_t pid, kernel_cap_t *pEp, 110 kernel_ca 127 kernel_cap_t *pIp, kernel_cap_t *pPp) 111 { 128 { 112 int ret; 129 int ret; 113 130 114 if (pid && (pid != task_pid_vnr(curren 131 if (pid && (pid != task_pid_vnr(current))) { 115 const struct task_struct *targ !! 132 struct task_struct *target; 116 133 117 rcu_read_lock(); 134 rcu_read_lock(); 118 135 119 target = find_task_by_vpid(pid 136 target = find_task_by_vpid(pid); 120 if (!target) 137 if (!target) 121 ret = -ESRCH; 138 ret = -ESRCH; 122 else 139 else 123 ret = security_capget( 140 ret = security_capget(target, pEp, pIp, pPp); 124 141 125 rcu_read_unlock(); 142 rcu_read_unlock(); 126 } else 143 } else 127 ret = security_capget(current, 144 ret = security_capget(current, pEp, pIp, pPp); 128 145 129 return ret; 146 return ret; 130 } 147 } 131 148 132 /** 149 /** 133 * sys_capget - get the capabilities of a give 150 * sys_capget - get the capabilities of a given process. 134 * @header: pointer to struct that contains ca 151 * @header: pointer to struct that contains capability version and 135 * target pid data 152 * target pid data 136 * @dataptr: pointer to struct that contains t 153 * @dataptr: pointer to struct that contains the effective, permitted, 137 * and inheritable capabilities that are 154 * and inheritable capabilities that are returned 138 * 155 * 139 * Returns 0 on success and < 0 on error. 156 * Returns 0 on success and < 0 on error. 140 */ 157 */ 141 SYSCALL_DEFINE2(capget, cap_user_header_t, hea 158 SYSCALL_DEFINE2(capget, cap_user_header_t, header, cap_user_data_t, dataptr) 142 { 159 { 143 int ret = 0; 160 int ret = 0; 144 pid_t pid; 161 pid_t pid; 145 unsigned tocopy; 162 unsigned tocopy; 146 kernel_cap_t pE, pI, pP; 163 kernel_cap_t pE, pI, pP; 147 struct __user_cap_data_struct kdata[2] << 148 164 149 ret = cap_validate_magic(header, &toco 165 ret = cap_validate_magic(header, &tocopy); 150 if ((dataptr == NULL) || (ret != 0)) 166 if ((dataptr == NULL) || (ret != 0)) 151 return ((dataptr == NULL) && ( 167 return ((dataptr == NULL) && (ret == -EINVAL)) ? 0 : ret; 152 168 153 if (get_user(pid, &header->pid)) 169 if (get_user(pid, &header->pid)) 154 return -EFAULT; 170 return -EFAULT; 155 171 156 if (pid < 0) 172 if (pid < 0) 157 return -EINVAL; 173 return -EINVAL; 158 174 159 ret = cap_get_target_pid(pid, &pE, &pI 175 ret = cap_get_target_pid(pid, &pE, &pI, &pP); 160 if (ret) !! 176 if (!ret) { 161 return ret; !! 177 struct __user_cap_data_struct kdata[_KERNEL_CAPABILITY_U32S]; 162 !! 178 unsigned i; 163 /* !! 179 164 * Annoying legacy format with 64-bit !! 180 for (i = 0; i < tocopy; i++) { 165 * as two sets of 32-bit fields, so we !! 181 kdata[i].effective = pE.cap[i]; 166 * capability values up. !! 182 kdata[i].permitted = pP.cap[i]; 167 */ !! 183 kdata[i].inheritable = pI.cap[i]; 168 kdata[0].effective = pE.val; kdata[1 !! 184 } 169 kdata[0].permitted = pP.val; kdata[1 !! 185 170 kdata[0].inheritable = pI.val; kdata[1 !! 186 /* 171 !! 187 * Note, in the case, tocopy < _KERNEL_CAPABILITY_U32S, 172 /* !! 188 * we silently drop the upper capabilities here. This 173 * Note, in the case, tocopy < _KERNEL !! 189 * has the effect of making older libcap 174 * we silently drop the upper capabili !! 190 * implementations implicitly drop upper capability 175 * has the effect of making older libc !! 191 * bits when they perform a: capget/modify/capset 176 * implementations implicitly drop upp !! 192 * sequence. 177 * bits when they perform a: capget/mo !! 193 * 178 * sequence. !! 194 * This behavior is considered fail-safe 179 * !! 195 * behavior. Upgrading the application to a newer 180 * This behavior is considered fail-sa !! 196 * version of libcap will enable access to the newer 181 * behavior. Upgrading the application !! 197 * capabilities. 182 * version of libcap will enable acces !! 198 * 183 * capabilities. !! 199 * An alternative would be to return an error here 184 * !! 200 * (-ERANGE), but that causes legacy applications to 185 * An alternative would be to return a !! 201 * unexpectidly fail; the capget/modify/capset aborts 186 * (-ERANGE), but that causes legacy a !! 202 * before modification is attempted and the application 187 * unexpectedly fail; the capget/modif !! 203 * fails. 188 * before modification is attempted an !! 204 */ 189 * fails. !! 205 if (copy_to_user(dataptr, kdata, tocopy 190 */ !! 206 * sizeof(struct __user_cap_data_struct))) { 191 if (copy_to_user(dataptr, kdata, tocop !! 207 return -EFAULT; 192 return -EFAULT; !! 208 } 193 !! 209 } 194 return 0; << 195 } << 196 210 197 static kernel_cap_t mk_kernel_cap(u32 low, u32 !! 211 return ret; 198 { << 199 return (kernel_cap_t) { (low | ((u64)h << 200 } 212 } 201 213 202 /** 214 /** 203 * sys_capset - set capabilities for a process 215 * sys_capset - set capabilities for a process or (*) a group of processes 204 * @header: pointer to struct that contains ca 216 * @header: pointer to struct that contains capability version and 205 * target pid data 217 * target pid data 206 * @data: pointer to struct that contains the 218 * @data: pointer to struct that contains the effective, permitted, 207 * and inheritable capabilities 219 * and inheritable capabilities 208 * 220 * 209 * Set capabilities for the current process on 221 * Set capabilities for the current process only. The ability to any other 210 * process(es) has been deprecated and removed 222 * process(es) has been deprecated and removed. 211 * 223 * 212 * The restrictions on setting capabilities ar 224 * The restrictions on setting capabilities are specified as: 213 * 225 * 214 * I: any raised capabilities must be a subset 226 * I: any raised capabilities must be a subset of the old permitted 215 * P: any raised capabilities must be a subset 227 * P: any raised capabilities must be a subset of the old permitted 216 * E: must be set to a subset of new permitted 228 * E: must be set to a subset of new permitted 217 * 229 * 218 * Returns 0 on success and < 0 on error. 230 * Returns 0 on success and < 0 on error. 219 */ 231 */ 220 SYSCALL_DEFINE2(capset, cap_user_header_t, hea 232 SYSCALL_DEFINE2(capset, cap_user_header_t, header, const cap_user_data_t, data) 221 { 233 { 222 struct __user_cap_data_struct kdata[2] !! 234 struct __user_cap_data_struct kdata[_KERNEL_CAPABILITY_U32S]; 223 unsigned tocopy, copybytes; !! 235 unsigned i, tocopy, copybytes; 224 kernel_cap_t inheritable, permitted, e 236 kernel_cap_t inheritable, permitted, effective; 225 struct cred *new; 237 struct cred *new; 226 int ret; 238 int ret; 227 pid_t pid; 239 pid_t pid; 228 240 229 ret = cap_validate_magic(header, &toco 241 ret = cap_validate_magic(header, &tocopy); 230 if (ret != 0) 242 if (ret != 0) 231 return ret; 243 return ret; 232 244 233 if (get_user(pid, &header->pid)) 245 if (get_user(pid, &header->pid)) 234 return -EFAULT; 246 return -EFAULT; 235 247 236 /* may only affect current now */ 248 /* may only affect current now */ 237 if (pid != 0 && pid != task_pid_vnr(cu 249 if (pid != 0 && pid != task_pid_vnr(current)) 238 return -EPERM; 250 return -EPERM; 239 251 240 copybytes = tocopy * sizeof(struct __u 252 copybytes = tocopy * sizeof(struct __user_cap_data_struct); 241 if (copybytes > sizeof(kdata)) 253 if (copybytes > sizeof(kdata)) 242 return -EFAULT; 254 return -EFAULT; 243 255 244 if (copy_from_user(&kdata, data, copyb 256 if (copy_from_user(&kdata, data, copybytes)) 245 return -EFAULT; 257 return -EFAULT; 246 258 247 effective = mk_kernel_cap(kdata[0].e !! 259 for (i = 0; i < tocopy; i++) { 248 permitted = mk_kernel_cap(kdata[0].p !! 260 effective.cap[i] = kdata[i].effective; 249 inheritable = mk_kernel_cap(kdata[0].i !! 261 permitted.cap[i] = kdata[i].permitted; >> 262 inheritable.cap[i] = kdata[i].inheritable; >> 263 } >> 264 while (i < _KERNEL_CAPABILITY_U32S) { >> 265 effective.cap[i] = 0; >> 266 permitted.cap[i] = 0; >> 267 inheritable.cap[i] = 0; >> 268 i++; >> 269 } >> 270 >> 271 effective.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK; >> 272 permitted.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK; >> 273 inheritable.cap[CAP_LAST_U32] &= CAP_LAST_U32_VALID_MASK; 250 274 251 new = prepare_creds(); 275 new = prepare_creds(); 252 if (!new) 276 if (!new) 253 return -ENOMEM; 277 return -ENOMEM; 254 278 255 ret = security_capset(new, current_cre 279 ret = security_capset(new, current_cred(), 256 &effective, &inh 280 &effective, &inheritable, &permitted); 257 if (ret < 0) 281 if (ret < 0) 258 goto error; 282 goto error; 259 283 260 audit_log_capset(new, current_cred()); !! 284 audit_log_capset(pid, new, current_cred()); 261 285 262 return commit_creds(new); 286 return commit_creds(new); 263 287 264 error: 288 error: 265 abort_creds(new); 289 abort_creds(new); 266 return ret; 290 return ret; 267 } 291 } 268 292 269 /** 293 /** 270 * has_ns_capability - Does a task have a capa 294 * has_ns_capability - Does a task have a capability in a specific user ns 271 * @t: The task in question 295 * @t: The task in question 272 * @ns: target user namespace 296 * @ns: target user namespace 273 * @cap: The capability to be tested for 297 * @cap: The capability to be tested for 274 * 298 * 275 * Return true if the specified task has the g 299 * Return true if the specified task has the given superior capability 276 * currently in effect to the specified user n 300 * currently in effect to the specified user namespace, false if not. 277 * 301 * 278 * Note that this does not set PF_SUPERPRIV on 302 * Note that this does not set PF_SUPERPRIV on the task. 279 */ 303 */ 280 bool has_ns_capability(struct task_struct *t, 304 bool has_ns_capability(struct task_struct *t, 281 struct user_namespace * 305 struct user_namespace *ns, int cap) 282 { 306 { 283 int ret; 307 int ret; 284 308 285 rcu_read_lock(); 309 rcu_read_lock(); 286 ret = security_capable(__task_cred(t), !! 310 ret = security_capable(__task_cred(t), ns, cap); 287 rcu_read_unlock(); 311 rcu_read_unlock(); 288 312 289 return (ret == 0); 313 return (ret == 0); 290 } 314 } 291 315 292 /** 316 /** 293 * has_capability - Does a task have a capabil 317 * has_capability - Does a task have a capability in init_user_ns 294 * @t: The task in question 318 * @t: The task in question 295 * @cap: The capability to be tested for 319 * @cap: The capability to be tested for 296 * 320 * 297 * Return true if the specified task has the g 321 * Return true if the specified task has the given superior capability 298 * currently in effect to the initial user nam 322 * currently in effect to the initial user namespace, false if not. 299 * 323 * 300 * Note that this does not set PF_SUPERPRIV on 324 * Note that this does not set PF_SUPERPRIV on the task. 301 */ 325 */ 302 bool has_capability(struct task_struct *t, int 326 bool has_capability(struct task_struct *t, int cap) 303 { 327 { 304 return has_ns_capability(t, &init_user 328 return has_ns_capability(t, &init_user_ns, cap); 305 } 329 } 306 EXPORT_SYMBOL(has_capability); << 307 330 308 /** 331 /** 309 * has_ns_capability_noaudit - Does a task hav 332 * has_ns_capability_noaudit - Does a task have a capability (unaudited) 310 * in a specific user ns. 333 * in a specific user ns. 311 * @t: The task in question 334 * @t: The task in question 312 * @ns: target user namespace 335 * @ns: target user namespace 313 * @cap: The capability to be tested for 336 * @cap: The capability to be tested for 314 * 337 * 315 * Return true if the specified task has the g 338 * Return true if the specified task has the given superior capability 316 * currently in effect to the specified user n 339 * currently in effect to the specified user namespace, false if not. 317 * Do not write an audit message for the check 340 * Do not write an audit message for the check. 318 * 341 * 319 * Note that this does not set PF_SUPERPRIV on 342 * Note that this does not set PF_SUPERPRIV on the task. 320 */ 343 */ 321 bool has_ns_capability_noaudit(struct task_str 344 bool has_ns_capability_noaudit(struct task_struct *t, 322 struct user_nam 345 struct user_namespace *ns, int cap) 323 { 346 { 324 int ret; 347 int ret; 325 348 326 rcu_read_lock(); 349 rcu_read_lock(); 327 ret = security_capable(__task_cred(t), !! 350 ret = security_capable_noaudit(__task_cred(t), ns, cap); 328 rcu_read_unlock(); 351 rcu_read_unlock(); 329 352 330 return (ret == 0); 353 return (ret == 0); 331 } 354 } 332 355 333 /** 356 /** 334 * has_capability_noaudit - Does a task have a 357 * has_capability_noaudit - Does a task have a capability (unaudited) in the 335 * initial user ns 358 * initial user ns 336 * @t: The task in question 359 * @t: The task in question 337 * @cap: The capability to be tested for 360 * @cap: The capability to be tested for 338 * 361 * 339 * Return true if the specified task has the g 362 * Return true if the specified task has the given superior capability 340 * currently in effect to init_user_ns, false 363 * currently in effect to init_user_ns, false if not. Don't write an 341 * audit message for the check. 364 * audit message for the check. 342 * 365 * 343 * Note that this does not set PF_SUPERPRIV on 366 * Note that this does not set PF_SUPERPRIV on the task. 344 */ 367 */ 345 bool has_capability_noaudit(struct task_struct 368 bool has_capability_noaudit(struct task_struct *t, int cap) 346 { 369 { 347 return has_ns_capability_noaudit(t, &i 370 return has_ns_capability_noaudit(t, &init_user_ns, cap); 348 } 371 } 349 EXPORT_SYMBOL(has_capability_noaudit); << 350 << 351 static bool ns_capable_common(struct user_name << 352 int cap, << 353 unsigned int opt << 354 { << 355 int capable; << 356 << 357 if (unlikely(!cap_valid(cap))) { << 358 pr_crit("capable() called with << 359 BUG(); << 360 } << 361 << 362 capable = security_capable(current_cre << 363 if (capable == 0) { << 364 current->flags |= PF_SUPERPRIV << 365 return true; << 366 } << 367 return false; << 368 } << 369 372 370 /** 373 /** 371 * ns_capable - Determine if the current task 374 * ns_capable - Determine if the current task has a superior capability in effect 372 * @ns: The usernamespace we want the capabil 375 * @ns: The usernamespace we want the capability in 373 * @cap: The capability to be tested for 376 * @cap: The capability to be tested for 374 * 377 * 375 * Return true if the current task has the giv 378 * Return true if the current task has the given superior capability currently 376 * available for use, false if not. 379 * available for use, false if not. 377 * 380 * 378 * This sets PF_SUPERPRIV on the task if the c 381 * This sets PF_SUPERPRIV on the task if the capability is available on the 379 * assumption that it's about to be used. 382 * assumption that it's about to be used. 380 */ 383 */ 381 bool ns_capable(struct user_namespace *ns, int 384 bool ns_capable(struct user_namespace *ns, int cap) 382 { 385 { 383 return ns_capable_common(ns, cap, CAP_ !! 386 if (unlikely(!cap_valid(cap))) { >> 387 printk(KERN_CRIT "capable() called with invalid cap=%u\n", cap); >> 388 BUG(); >> 389 } >> 390 >> 391 if (security_capable(current_cred(), ns, cap) == 0) { >> 392 current->flags |= PF_SUPERPRIV; >> 393 return true; >> 394 } >> 395 return false; 384 } 396 } 385 EXPORT_SYMBOL(ns_capable); 397 EXPORT_SYMBOL(ns_capable); 386 398 387 /** 399 /** 388 * ns_capable_noaudit - Determine if the curre !! 400 * file_ns_capable - Determine if the file's opener had a capability in effect 389 * (unaudited) in effect !! 401 * @file: The file we want to check 390 * @ns: The usernamespace we want the capabil 402 * @ns: The usernamespace we want the capability in 391 * @cap: The capability to be tested for 403 * @cap: The capability to be tested for 392 * 404 * 393 * Return true if the current task has the giv !! 405 * Return true if task that opened the file had a capability in effect 394 * available for use, false if not. !! 406 * when the file was opened. 395 * 407 * 396 * This sets PF_SUPERPRIV on the task if the c !! 408 * This does not set PF_SUPERPRIV because the caller may not 397 * assumption that it's about to be used. !! 409 * actually be privileged. 398 */ 410 */ 399 bool ns_capable_noaudit(struct user_namespace !! 411 bool file_ns_capable(const struct file *file, struct user_namespace *ns, int cap) 400 { 412 { 401 return ns_capable_common(ns, cap, CAP_ !! 413 if (WARN_ON_ONCE(!cap_valid(cap))) 402 } !! 414 return false; 403 EXPORT_SYMBOL(ns_capable_noaudit); << 404 415 405 /** !! 416 if (security_capable(file->f_cred, ns, cap) == 0) 406 * ns_capable_setid - Determine if the current !! 417 return true; 407 * in effect, while signalling that this check !! 418 408 * setid or setgroups syscall. !! 419 return false; 409 * @ns: The usernamespace we want the capabil << 410 * @cap: The capability to be tested for << 411 * << 412 * Return true if the current task has the giv << 413 * available for use, false if not. << 414 * << 415 * This sets PF_SUPERPRIV on the task if the c << 416 * assumption that it's about to be used. << 417 */ << 418 bool ns_capable_setid(struct user_namespace *n << 419 { << 420 return ns_capable_common(ns, cap, CAP_ << 421 } 420 } 422 EXPORT_SYMBOL(ns_capable_setid); !! 421 EXPORT_SYMBOL(file_ns_capable); 423 422 424 /** 423 /** 425 * capable - Determine if the current task has 424 * capable - Determine if the current task has a superior capability in effect 426 * @cap: The capability to be tested for 425 * @cap: The capability to be tested for 427 * 426 * 428 * Return true if the current task has the giv 427 * Return true if the current task has the given superior capability currently 429 * available for use, false if not. 428 * available for use, false if not. 430 * 429 * 431 * This sets PF_SUPERPRIV on the task if the c 430 * This sets PF_SUPERPRIV on the task if the capability is available on the 432 * assumption that it's about to be used. 431 * assumption that it's about to be used. 433 */ 432 */ 434 bool capable(int cap) 433 bool capable(int cap) 435 { 434 { 436 return ns_capable(&init_user_ns, cap); 435 return ns_capable(&init_user_ns, cap); 437 } 436 } 438 EXPORT_SYMBOL(capable); 437 EXPORT_SYMBOL(capable); 439 #endif /* CONFIG_MULTIUSER */ << 440 438 441 /** 439 /** 442 * file_ns_capable - Determine if the file's o !! 440 * nsown_capable - Check superior capability to one's own user_ns 443 * @file: The file we want to check !! 441 * @cap: The capability in question 444 * @ns: The usernamespace we want the capabil << 445 * @cap: The capability to be tested for << 446 * << 447 * Return true if task that opened the file ha << 448 * when the file was opened. << 449 * << 450 * This does not set PF_SUPERPRIV because the << 451 * actually be privileged. << 452 */ << 453 bool file_ns_capable(const struct file *file, << 454 int cap) << 455 { << 456 << 457 if (WARN_ON_ONCE(!cap_valid(cap))) << 458 return false; << 459 << 460 if (security_capable(file->f_cred, ns, << 461 return true; << 462 << 463 return false; << 464 } << 465 EXPORT_SYMBOL(file_ns_capable); << 466 << 467 /** << 468 * privileged_wrt_inode_uidgid - Do capabiliti << 469 * @ns: The user namespace in question << 470 * @idmap: idmap of the mount @inode was found << 471 * @inode: The inode in question << 472 * 442 * 473 * Return true if the inode uid and gid are wi !! 443 * Return true if the current task has the given superior capability >> 444 * targeted at its own user namespace. 474 */ 445 */ 475 bool privileged_wrt_inode_uidgid(struct user_n !! 446 bool nsown_capable(int cap) 476 struct mnt_id << 477 const struct << 478 { 447 { 479 return vfsuid_has_mapping(ns, i_uid_in !! 448 return ns_capable(current_user_ns(), cap); 480 vfsgid_has_mapping(ns, i_gid_in << 481 } 449 } 482 450 483 /** 451 /** 484 * capable_wrt_inode_uidgid - Check nsown_capa 452 * capable_wrt_inode_uidgid - Check nsown_capable and uid and gid mapped 485 * @idmap: idmap of the mount @inode was found << 486 * @inode: The inode in question 453 * @inode: The inode in question 487 * @cap: The capability in question 454 * @cap: The capability in question 488 * 455 * 489 * Return true if the current task has the giv 456 * Return true if the current task has the given capability targeted at 490 * its own user namespace and that the given i 457 * its own user namespace and that the given inode's uid and gid are 491 * mapped into the current user namespace. 458 * mapped into the current user namespace. 492 */ 459 */ 493 bool capable_wrt_inode_uidgid(struct mnt_idmap !! 460 bool capable_wrt_inode_uidgid(const struct inode *inode, int cap) 494 const struct ino << 495 { 461 { 496 struct user_namespace *ns = current_us 462 struct user_namespace *ns = current_user_ns(); 497 463 498 return ns_capable(ns, cap) && !! 464 return ns_capable(ns, cap) && kuid_has_mapping(ns, inode->i_uid) && 499 privileged_wrt_inode_uidgid(ns, !! 465 kgid_has_mapping(ns, inode->i_gid); 500 } << 501 EXPORT_SYMBOL(capable_wrt_inode_uidgid); << 502 << 503 /** << 504 * ptracer_capable - Determine if the ptracer << 505 * @tsk: The task that may be ptraced << 506 * @ns: The user namespace to search for CAP_S << 507 * << 508 * Return true if the task that is ptracing th << 509 * in the specified user namespace. << 510 */ << 511 bool ptracer_capable(struct task_struct *tsk, << 512 { << 513 int ret = 0; /* An absent tracer adds << 514 const struct cred *cred; << 515 << 516 rcu_read_lock(); << 517 cred = rcu_dereference(tsk->ptracer_cr << 518 if (cred) << 519 ret = security_capable(cred, n << 520 CAP_OPT << 521 rcu_read_unlock(); << 522 return (ret == 0); << 523 } 466 } 524 467
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.