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