Blame view
include/linux/cred.h
11.8 KB
d410fa4ef Create Documentat... |
1 |
/* Credentials management - see Documentation/security/credentials.txt |
9e2b2dc41 CRED: Introduce c... |
2 3 4 5 6 7 8 9 10 11 12 13 |
* * Copyright (C) 2008 Red Hat, Inc. All Rights Reserved. * Written by David Howells (dhowells@redhat.com) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public Licence * as published by the Free Software Foundation; either version * 2 of the Licence, or (at your option) any later version. */ #ifndef _LINUX_CRED_H #define _LINUX_CRED_H |
b6dff3ec5 CRED: Separate ta... |
14 |
#include <linux/capability.h> |
b2e1feaf0 cred: #include in... |
15 |
#include <linux/init.h> |
b6dff3ec5 CRED: Separate ta... |
16 |
#include <linux/key.h> |
ed868a569 Creds: creds->sec... |
17 |
#include <linux/selinux.h> |
60063497a atomic: use <linu... |
18 |
#include <linux/atomic.h> |
b6dff3ec5 CRED: Separate ta... |
19 20 21 |
struct user_struct; struct cred; |
3a3b7ce93 CRED: Allow kerne... |
22 |
struct inode; |
b6dff3ec5 CRED: Separate ta... |
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
/* * COW Supplementary groups list */ #define NGROUPS_SMALL 32 #define NGROUPS_PER_BLOCK ((unsigned int)(PAGE_SIZE / sizeof(gid_t))) struct group_info { atomic_t usage; int ngroups; int nblocks; gid_t small_block[NGROUPS_SMALL]; gid_t *blocks[0]; }; /** * get_group_info - Get a reference to a group info structure * @group_info: The group info to reference * |
86a264abe CRED: Wrap curren... |
42 43 44 45 |
* This gets a reference to a set of supplementary groups. * * If the caller is accessing a task's credentials, they must hold the RCU read * lock when reading. |
b6dff3ec5 CRED: Separate ta... |
46 |
*/ |
86a264abe CRED: Wrap curren... |
47 48 49 50 51 |
static inline struct group_info *get_group_info(struct group_info *gi) { atomic_inc(&gi->usage); return gi; } |
b6dff3ec5 CRED: Separate ta... |
52 53 54 55 56 57 58 59 60 61 62 63 |
/** * put_group_info - Release a reference to a group info structure * @group_info: The group info to release */ #define put_group_info(group_info) \ do { \ if (atomic_dec_and_test(&(group_info)->usage)) \ groups_free(group_info); \ } while (0) extern struct group_info *groups_alloc(int); |
18b6e0414 User namespaces: ... |
64 |
extern struct group_info init_groups; |
b6dff3ec5 CRED: Separate ta... |
65 66 67 |
extern void groups_free(struct group_info *); extern int set_current_groups(struct group_info *); extern int set_groups(struct cred *, struct group_info *); |
86a264abe CRED: Wrap curren... |
68 |
extern int groups_search(const struct group_info *, gid_t); |
b6dff3ec5 CRED: Separate ta... |
69 70 71 72 73 74 75 76 77 |
/* access the groups "array" with this macro */ #define GROUP_AT(gi, i) \ ((gi)->blocks[(i) / NGROUPS_PER_BLOCK][(i) % NGROUPS_PER_BLOCK]) extern int in_group_p(gid_t); extern int in_egroup_p(gid_t); /* |
bb952bb98 CRED: Separate pe... |
78 79 80 81 82 83 84 85 |
* The common credentials for a thread group * - shared by CLONE_THREAD */ #ifdef CONFIG_KEYS struct thread_group_cred { atomic_t usage; pid_t tgid; /* thread group process ID */ spinlock_t lock; |
e63ba744a keys: __rcu annot... |
86 |
struct key __rcu *session_keyring; /* keyring inherited over fork */ |
bb952bb98 CRED: Separate pe... |
87 88 89 90 91 92 |
struct key *process_keyring; /* keyring private to this process */ struct rcu_head rcu; /* RCU deletion hook */ }; #endif /* |
b6dff3ec5 CRED: Separate ta... |
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
* The security context of a task * * The parts of the context break down into two categories: * * (1) The objective context of a task. These parts are used when some other * task is attempting to affect this one. * * (2) The subjective context. These details are used when the task is acting * upon another object, be that a file, a task, a key or whatever. * * Note that some members of this structure belong to both categories - the * LSM security pointer for instance. * * A task has two security pointers. task->real_cred points to the objective * context that defines that task's actual details. The objective part of this * context is used whenever that task is acted upon. * * task->cred points to the subjective context that defines the details of how * that task is going to act upon another object. This may be overridden * temporarily to point to another security context, but normally points to the * same context as task->real_cred. */ struct cred { atomic_t usage; |
e0e817392 CRED: Add some co... |
117 118 119 120 121 122 123 |
#ifdef CONFIG_DEBUG_CREDENTIALS atomic_t subscribers; /* number of processes subscribed */ void *put_addr; unsigned magic; #define CRED_MAGIC 0x43736564 #define CRED_MAGIC_DEAD 0x44656144 #endif |
b6dff3ec5 CRED: Separate ta... |
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
uid_t uid; /* real UID of the task */ gid_t gid; /* real GID of the task */ uid_t suid; /* saved UID of the task */ gid_t sgid; /* saved GID of the task */ uid_t euid; /* effective UID of the task */ gid_t egid; /* effective GID of the task */ uid_t fsuid; /* UID for VFS ops */ gid_t fsgid; /* GID for VFS ops */ unsigned securebits; /* SUID-less security management */ kernel_cap_t cap_inheritable; /* caps our children can inherit */ kernel_cap_t cap_permitted; /* caps we're permitted */ kernel_cap_t cap_effective; /* caps we can actually use */ kernel_cap_t cap_bset; /* capability bounding set */ #ifdef CONFIG_KEYS unsigned char jit_keyring; /* default keyring to attach requested * keys to */ struct key *thread_keyring; /* keyring private to this thread */ struct key *request_key_auth; /* assumed request_key authority */ |
bb952bb98 CRED: Separate pe... |
142 |
struct thread_group_cred *tgcred; /* thread-group shared credentials */ |
b6dff3ec5 CRED: Separate ta... |
143 144 145 146 147 |
#endif #ifdef CONFIG_SECURITY void *security; /* subjective LSM security */ #endif struct user_struct *user; /* real user ID subscription */ |
47a150edc Cache user_ns in ... |
148 |
struct user_namespace *user_ns; /* cached user->user_ns */ |
b6dff3ec5 CRED: Separate ta... |
149 150 |
struct group_info *group_info; /* supplementary groups for euid/fsgid */ struct rcu_head rcu; /* RCU deletion hook */ |
b6dff3ec5 CRED: Separate ta... |
151 |
}; |
f1752eec6 CRED: Detach the ... |
152 |
extern void __put_cred(struct cred *); |
e0e817392 CRED: Add some co... |
153 |
extern void exit_creds(struct task_struct *); |
f1752eec6 CRED: Detach the ... |
154 |
extern int copy_creds(struct task_struct *, unsigned long); |
de09a9771 CRED: Fix get_tas... |
155 |
extern const struct cred *get_task_cred(struct task_struct *); |
ee18d64c1 KEYS: Add a keyct... |
156 |
extern struct cred *cred_alloc_blank(void); |
d84f4f992 CRED: Inaugurate ... |
157 |
extern struct cred *prepare_creds(void); |
a6f76f23d CRED: Make execve... |
158 |
extern struct cred *prepare_exec_creds(void); |
d84f4f992 CRED: Inaugurate ... |
159 160 |
extern int commit_creds(struct cred *); extern void abort_creds(struct cred *); |
3b11a1dec CRED: Differentia... |
161 162 |
extern const struct cred *override_creds(const struct cred *); extern void revert_creds(const struct cred *); |
3a3b7ce93 CRED: Allow kerne... |
163 164 165 166 167 |
extern struct cred *prepare_kernel_cred(struct task_struct *); extern int change_create_files_as(struct cred *, struct inode *); extern int set_security_override(struct cred *, u32); extern int set_security_override_from_ctx(struct cred *, const char *); extern int set_create_files_as(struct cred *, struct inode *); |
d84f4f992 CRED: Inaugurate ... |
168 |
extern void __init cred_init(void); |
e0e817392 CRED: Add some co... |
169 170 171 172 173 174 175 |
/* * check for validity of credentials */ #ifdef CONFIG_DEBUG_CREDENTIALS extern void __invalid_creds(const struct cred *, const char *, unsigned); extern void __validate_process_creds(struct task_struct *, const char *, unsigned); |
74908a000 include/linux/cre... |
176 |
extern bool creds_are_invalid(const struct cred *cred); |
e0e817392 CRED: Add some co... |
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 |
static inline void __validate_creds(const struct cred *cred, const char *file, unsigned line) { if (unlikely(creds_are_invalid(cred))) __invalid_creds(cred, file, line); } #define validate_creds(cred) \ do { \ __validate_creds((cred), __FILE__, __LINE__); \ } while(0) #define validate_process_creds() \ do { \ __validate_process_creds(current, __FILE__, __LINE__); \ } while(0) extern void validate_creds_for_do_exit(struct task_struct *); #else static inline void validate_creds(const struct cred *cred) { } static inline void validate_creds_for_do_exit(struct task_struct *tsk) { } static inline void validate_process_creds(void) { } #endif |
d84f4f992 CRED: Inaugurate ... |
207 208 209 210 211 212 213 214 215 216 217 218 |
/** * get_new_cred - Get a reference on a new set of credentials * @cred: The new credentials to reference * * Get a reference on the specified set of new credentials. The caller must * release the reference. */ static inline struct cred *get_new_cred(struct cred *cred) { atomic_inc(&cred->usage); return cred; } |
f1752eec6 CRED: Detach the ... |
219 220 221 222 223 224 225 |
/** * get_cred - Get a reference on a set of credentials * @cred: The credentials to reference * * Get a reference on the specified set of credentials. The caller must * release the reference. |
98870ab0a CRED: Documentation |
226 227 228 229 230 231 |
* * This is used to deal with a committed set of credentials. Although the * pointer is const, this will temporarily discard the const and increment the * usage count. The purpose of this is to attempt to catch at compile time the * accidental alteration of a set of credentials that should be considered * immutable. |
f1752eec6 CRED: Detach the ... |
232 |
*/ |
d84f4f992 CRED: Inaugurate ... |
233 |
static inline const struct cred *get_cred(const struct cred *cred) |
f1752eec6 CRED: Detach the ... |
234 |
{ |
1c388ad05 include/linux/cre... |
235 |
struct cred *nonconst_cred = (struct cred *) cred; |
e0e817392 CRED: Add some co... |
236 |
validate_creds(cred); |
1c388ad05 include/linux/cre... |
237 |
return get_new_cred(nonconst_cred); |
f1752eec6 CRED: Detach the ... |
238 239 240 241 242 243 244 245 |
} /** * put_cred - Release a reference to a set of credentials * @cred: The credentials to release * * Release a reference to a set of credentials, deleting them when the last ref * is released. |
98870ab0a CRED: Documentation |
246 247 248 249 |
* * This takes a const pointer to a set of credentials because the credentials * on task_struct are attached by const pointers to prevent accidental * alteration of otherwise immutable credential sets. |
f1752eec6 CRED: Detach the ... |
250 |
*/ |
c69e8d9c0 CRED: Use RCU to ... |
251 |
static inline void put_cred(const struct cred *_cred) |
f1752eec6 CRED: Detach the ... |
252 |
{ |
c69e8d9c0 CRED: Use RCU to ... |
253 |
struct cred *cred = (struct cred *) _cred; |
d84f4f992 CRED: Inaugurate ... |
254 |
|
e0e817392 CRED: Add some co... |
255 |
validate_creds(cred); |
f1752eec6 CRED: Detach the ... |
256 257 258 |
if (atomic_dec_and_test(&(cred)->usage)) __put_cred(cred); } |
86a264abe CRED: Wrap curren... |
259 |
/** |
3b11a1dec CRED: Differentia... |
260 |
* current_cred - Access the current task's subjective credentials |
86a264abe CRED: Wrap curren... |
261 |
* |
329551484 fix rcu annotatio... |
262 263 |
* Access the subjective credentials of the current task. RCU-safe, * since nobody else can modify it. |
86a264abe CRED: Wrap curren... |
264 265 |
*/ #define current_cred() \ |
27e4e4362 CRED: Restore con... |
266 |
rcu_dereference_protected(current->cred, 1) |
86a264abe CRED: Wrap curren... |
267 268 |
/** |
3b11a1dec CRED: Differentia... |
269 |
* __task_cred - Access a task's objective credentials |
86a264abe CRED: Wrap curren... |
270 271 |
* @task: The task to query * |
3b11a1dec CRED: Differentia... |
272 |
* Access the objective credentials of a task. The caller must hold the RCU |
8f92054e7 CRED: Fix __task_... |
273 |
* readlock or the task must be dead and unable to change its own credentials. |
86a264abe CRED: Wrap curren... |
274 |
* |
8f92054e7 CRED: Fix __task_... |
275 276 |
* The result of this function should not be passed directly to get_cred(); * rather get_task_cred() should be used instead. |
86a264abe CRED: Wrap curren... |
277 |
*/ |
8f92054e7 CRED: Fix __task_... |
278 279 280 281 |
#define __task_cred(task) \ ({ \ const struct task_struct *__t = (task); \ rcu_dereference_check(__t->real_cred, \ |
8f92054e7 CRED: Fix __task_... |
282 283 |
task_is_dead(__t)); \ }) |
86a264abe CRED: Wrap curren... |
284 285 |
/** |
3b11a1dec CRED: Differentia... |
286 |
* get_current_cred - Get the current task's subjective credentials |
86a264abe CRED: Wrap curren... |
287 |
* |
3b11a1dec CRED: Differentia... |
288 289 290 |
* Get the subjective credentials of the current task, pinning them so that * they can't go away. Accessing the current task's credentials directly is * not permitted. |
86a264abe CRED: Wrap curren... |
291 292 293 294 295 296 297 298 299 300 301 302 303 |
*/ #define get_current_cred() \ (get_cred(current_cred())) /** * get_current_user - Get the current task's user_struct * * Get the user record of the current task, pinning it so that it can't go * away. */ #define get_current_user() \ ({ \ struct user_struct *__u; \ |
638a84390 cred: use 'const'... |
304 |
const struct cred *__cred; \ |
329551484 fix rcu annotatio... |
305 |
__cred = current_cred(); \ |
86a264abe CRED: Wrap curren... |
306 307 308 309 310 311 312 313 314 315 316 317 318 |
__u = get_uid(__cred->user); \ __u; \ }) /** * get_current_groups - Get the current task's supplementary group list * * Get the supplementary group list of the current task, pinning it so that it * can't go away. */ #define get_current_groups() \ ({ \ struct group_info *__groups; \ |
638a84390 cred: use 'const'... |
319 |
const struct cred *__cred; \ |
329551484 fix rcu annotatio... |
320 |
__cred = current_cred(); \ |
86a264abe CRED: Wrap curren... |
321 322 323 |
__groups = get_group_info(__cred->group_info); \ __groups; \ }) |
d84f4f992 CRED: Inaugurate ... |
324 325 326 327 328 329 330 |
#define task_cred_xxx(task, xxx) \ ({ \ __typeof__(((struct cred *)NULL)->xxx) ___val; \ rcu_read_lock(); \ ___val = __task_cred((task))->xxx; \ rcu_read_unlock(); \ ___val; \ |
86a264abe CRED: Wrap curren... |
331 332 333 334 335 336 337 |
}) #define task_uid(task) (task_cred_xxx((task), uid)) #define task_euid(task) (task_cred_xxx((task), euid)) #define current_cred_xxx(xxx) \ ({ \ |
329551484 fix rcu annotatio... |
338 |
current_cred()->xxx; \ |
86a264abe CRED: Wrap curren... |
339 340 341 342 343 344 345 346 347 348 349 350 351 |
}) #define current_uid() (current_cred_xxx(uid)) #define current_gid() (current_cred_xxx(gid)) #define current_euid() (current_cred_xxx(euid)) #define current_egid() (current_cred_xxx(egid)) #define current_suid() (current_cred_xxx(suid)) #define current_sgid() (current_cred_xxx(sgid)) #define current_fsuid() (current_cred_xxx(fsuid)) #define current_fsgid() (current_cred_xxx(fsgid)) #define current_cap() (current_cred_xxx(cap_effective)) #define current_user() (current_cred_xxx(user)) #define current_security() (current_cred_xxx(security)) |
47a150edc Cache user_ns in ... |
352 |
#ifdef CONFIG_USER_NS |
f1c84dae0 capabilities: rem... |
353 354 |
#define current_user_ns() (current_cred_xxx(user_ns)) #define task_user_ns(task) (task_cred_xxx((task), user_ns)) |
47a150edc Cache user_ns in ... |
355 356 |
#else extern struct user_namespace init_user_ns; |
f1c84dae0 capabilities: rem... |
357 358 |
#define current_user_ns() (&init_user_ns) #define task_user_ns(task) (&init_user_ns) |
47a150edc Cache user_ns in ... |
359 |
#endif |
3486740a4 userns: security:... |
360 |
|
86a264abe CRED: Wrap curren... |
361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 |
#define current_uid_gid(_uid, _gid) \ do { \ const struct cred *__cred; \ __cred = current_cred(); \ *(_uid) = __cred->uid; \ *(_gid) = __cred->gid; \ } while(0) #define current_euid_egid(_euid, _egid) \ do { \ const struct cred *__cred; \ __cred = current_cred(); \ *(_euid) = __cred->euid; \ *(_egid) = __cred->egid; \ } while(0) #define current_fsuid_fsgid(_fsuid, _fsgid) \ do { \ const struct cred *__cred; \ __cred = current_cred(); \ *(_fsuid) = __cred->fsuid; \ *(_fsgid) = __cred->fsgid; \ } while(0) |
9e2b2dc41 CRED: Introduce c... |
384 |
#endif /* _LINUX_CRED_H */ |