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