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