Blame view

include/linux/cred.h 11.8 KB
d410fa4ef   Randy Dunlap   Create Documentat...
1
  /* Credentials management - see Documentation/security/credentials.txt
9e2b2dc41   David Howells   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   David Howells   CRED: Separate ta...
14
  #include <linux/capability.h>
b2e1feaf0   Alexey Dobriyan   cred: #include in...
15
  #include <linux/init.h>
b6dff3ec5   David Howells   CRED: Separate ta...
16
  #include <linux/key.h>
ed868a569   Eric Paris   Creds: creds->sec...
17
  #include <linux/selinux.h>
60063497a   Arun Sharma   atomic: use <linu...
18
  #include <linux/atomic.h>
b6dff3ec5   David Howells   CRED: Separate ta...
19
20
21
  
  struct user_struct;
  struct cred;
3a3b7ce93   David Howells   CRED: Allow kerne...
22
  struct inode;
b6dff3ec5   David Howells   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   David Howells   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   David Howells   CRED: Separate ta...
46
   */
86a264abe   David Howells   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   David Howells   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   Serge Hallyn   User namespaces: ...
64
  extern struct group_info init_groups;
b6dff3ec5   David Howells   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   David Howells   CRED: Wrap curren...
68
  extern int groups_search(const struct group_info *, gid_t);
b6dff3ec5   David Howells   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   David Howells   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   Arnd Bergmann   keys: __rcu annot...
86
  	struct key __rcu *session_keyring;	/* keyring inherited over fork */
bb952bb98   David Howells   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   David Howells   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   David Howells   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   David Howells   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   David Howells   CRED: Separate pe...
142
  	struct thread_group_cred *tgcred; /* thread-group shared credentials */
b6dff3ec5   David Howells   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   Serge E. Hallyn   Cache user_ns in ...
148
  	struct user_namespace *user_ns; /* cached user->user_ns */
b6dff3ec5   David Howells   CRED: Separate ta...
149
150
  	struct group_info *group_info;	/* supplementary groups for euid/fsgid */
  	struct rcu_head	rcu;		/* RCU deletion hook */
b6dff3ec5   David Howells   CRED: Separate ta...
151
  };
f1752eec6   David Howells   CRED: Detach the ...
152
  extern void __put_cred(struct cred *);
e0e817392   David Howells   CRED: Add some co...
153
  extern void exit_creds(struct task_struct *);
f1752eec6   David Howells   CRED: Detach the ...
154
  extern int copy_creds(struct task_struct *, unsigned long);
de09a9771   David Howells   CRED: Fix get_tas...
155
  extern const struct cred *get_task_cred(struct task_struct *);
ee18d64c1   David Howells   KEYS: Add a keyct...
156
  extern struct cred *cred_alloc_blank(void);
d84f4f992   David Howells   CRED: Inaugurate ...
157
  extern struct cred *prepare_creds(void);
a6f76f23d   David Howells   CRED: Make execve...
158
  extern struct cred *prepare_exec_creds(void);
d84f4f992   David Howells   CRED: Inaugurate ...
159
160
  extern int commit_creds(struct cred *);
  extern void abort_creds(struct cred *);
3b11a1dec   David Howells   CRED: Differentia...
161
162
  extern const struct cred *override_creds(const struct cred *);
  extern void revert_creds(const struct cred *);
3a3b7ce93   David Howells   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   David Howells   CRED: Inaugurate ...
168
  extern void __init cred_init(void);
e0e817392   David Howells   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   Andrew Morton   include/linux/cre...
176
  extern bool creds_are_invalid(const struct cred *cred);
e0e817392   David Howells   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   David Howells   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   David Howells   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   David Howells   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   David Howells   CRED: Detach the ...
232
   */
d84f4f992   David Howells   CRED: Inaugurate ...
233
  static inline const struct cred *get_cred(const struct cred *cred)
f1752eec6   David Howells   CRED: Detach the ...
234
  {
1c388ad05   Paul Menage   include/linux/cre...
235
  	struct cred *nonconst_cred = (struct cred *) cred;
e0e817392   David Howells   CRED: Add some co...
236
  	validate_creds(cred);
1c388ad05   Paul Menage   include/linux/cre...
237
  	return get_new_cred(nonconst_cred);
f1752eec6   David Howells   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   David Howells   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   David Howells   CRED: Detach the ...
250
   */
c69e8d9c0   David Howells   CRED: Use RCU to ...
251
  static inline void put_cred(const struct cred *_cred)
f1752eec6   David Howells   CRED: Detach the ...
252
  {
c69e8d9c0   David Howells   CRED: Use RCU to ...
253
  	struct cred *cred = (struct cred *) _cred;
d84f4f992   David Howells   CRED: Inaugurate ...
254

e0e817392   David Howells   CRED: Add some co...
255
  	validate_creds(cred);
f1752eec6   David Howells   CRED: Detach the ...
256
257
258
  	if (atomic_dec_and_test(&(cred)->usage))
  		__put_cred(cred);
  }
86a264abe   David Howells   CRED: Wrap curren...
259
  /**
3b11a1dec   David Howells   CRED: Differentia...
260
   * current_cred - Access the current task's subjective credentials
86a264abe   David Howells   CRED: Wrap curren...
261
   *
329551484   Al Viro   fix rcu annotatio...
262
263
   * Access the subjective credentials of the current task.  RCU-safe,
   * since nobody else can modify it.
86a264abe   David Howells   CRED: Wrap curren...
264
265
   */
  #define current_cred() \
27e4e4362   David Howells   CRED: Restore con...
266
  	rcu_dereference_protected(current->cred, 1)
86a264abe   David Howells   CRED: Wrap curren...
267
268
  
  /**
3b11a1dec   David Howells   CRED: Differentia...
269
   * __task_cred - Access a task's objective credentials
86a264abe   David Howells   CRED: Wrap curren...
270
271
   * @task: The task to query
   *
3b11a1dec   David Howells   CRED: Differentia...
272
   * Access the objective credentials of a task.  The caller must hold the RCU
8f92054e7   David Howells   CRED: Fix __task_...
273
   * readlock or the task must be dead and unable to change its own credentials.
86a264abe   David Howells   CRED: Wrap curren...
274
   *
8f92054e7   David Howells   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   David Howells   CRED: Wrap curren...
277
   */
8f92054e7   David Howells   CRED: Fix __task_...
278
279
280
281
  #define __task_cred(task)						\
  	({								\
  		const struct task_struct *__t = (task);			\
  		rcu_dereference_check(__t->real_cred,			\
8f92054e7   David Howells   CRED: Fix __task_...
282
283
  				      task_is_dead(__t));		\
  	})
86a264abe   David Howells   CRED: Wrap curren...
284
285
  
  /**
3b11a1dec   David Howells   CRED: Differentia...
286
   * get_current_cred - Get the current task's subjective credentials
86a264abe   David Howells   CRED: Wrap curren...
287
   *
3b11a1dec   David Howells   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   David Howells   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   Linus Torvalds   cred: use 'const'...
304
  	const struct cred *__cred;			\
329551484   Al Viro   fix rcu annotatio...
305
  	__cred = current_cred();			\
86a264abe   David Howells   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   Linus Torvalds   cred: use 'const'...
319
  	const struct cred *__cred;			\
329551484   Al Viro   fix rcu annotatio...
320
  	__cred = current_cred();			\
86a264abe   David Howells   CRED: Wrap curren...
321
322
323
  	__groups = get_group_info(__cred->group_info);	\
  	__groups;					\
  })
d84f4f992   David Howells   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   David Howells   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   Al Viro   fix rcu annotatio...
338
  	current_cred()->xxx;			\
86a264abe   David Howells   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   Serge E. Hallyn   Cache user_ns in ...
352
  #ifdef CONFIG_USER_NS
f1c84dae0   Eric Paris   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   Serge E. Hallyn   Cache user_ns in ...
355
356
  #else
  extern struct user_namespace init_user_ns;
f1c84dae0   Eric Paris   capabilities: rem...
357
358
  #define current_user_ns()	(&init_user_ns)
  #define task_user_ns(task)	(&init_user_ns)
47a150edc   Serge E. Hallyn   Cache user_ns in ...
359
  #endif
3486740a4   Serge E. Hallyn   userns: security:...
360

86a264abe   David Howells   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   David Howells   CRED: Introduce c...
384
  #endif /* _LINUX_CRED_H */