File Index
Files and directories
Sign in
FILE

cred.h

File preview with syntax highlighting.

linux-6.19.14/include/linux/cred.h C
  1/* SPDX-License-Identifier: GPL-2.0-or-later */
  2/* Credentials management - see Documentation/security/credentials.rst
  3 *
  4 * Copyright (C) 2008 Red Hat, Inc. All Rights Reserved.
  5 * Written by David Howells (dhowells@redhat.com)
  6 */
  7
  8#ifndef _LINUX_CRED_H
  9#define _LINUX_CRED_H
 10
 11#include <linux/capability.h>
 12#include <linux/init.h>
 13#include <linux/key.h>
 14#include <linux/atomic.h>
 15#include <linux/refcount.h>
 16#include <linux/uidgid.h>
 17#include <linux/sched.h>
 18#include <linux/sched/user.h>
 19
 20struct cred;
 21struct inode;
 22
 23extern struct task_struct init_task;
 24
 25/*
 26 * COW Supplementary groups list
 27 */
 28struct group_info {
 29	refcount_t	usage;
 30	int		ngroups;
 31	kgid_t		gid[];
 32} __randomize_layout;
 33
 34/**
 35 * get_group_info - Get a reference to a group info structure
 36 * @group_info: The group info to reference
 37 *
 38 * This gets a reference to a set of supplementary groups.
 39 *
 40 * If the caller is accessing a task's credentials, they must hold the RCU read
 41 * lock when reading.
 42 */
 43static inline struct group_info *get_group_info(struct group_info *gi)
 44{
 45	refcount_inc(&gi->usage);
 46	return gi;
 47}
 48
 49/**
 50 * put_group_info - Release a reference to a group info structure
 51 * @group_info: The group info to release
 52 */
 53#define put_group_info(group_info)			\
 54do {							\
 55	if (refcount_dec_and_test(&(group_info)->usage))	\
 56		groups_free(group_info);		\
 57} while (0)
 58
 59#ifdef CONFIG_MULTIUSER
 60extern struct group_info *groups_alloc(int);
 61extern void groups_free(struct group_info *);
 62
 63extern int in_group_p(kgid_t);
 64extern int in_egroup_p(kgid_t);
 65extern int groups_search(const struct group_info *, kgid_t);
 66
 67extern int set_current_groups(struct group_info *);
 68extern void set_groups(struct cred *, struct group_info *);
 69extern bool may_setgroups(void);
 70extern void groups_sort(struct group_info *);
 71#else
 72static inline void groups_free(struct group_info *group_info)
 73{
 74}
 75
 76static inline int in_group_p(kgid_t grp)
 77{
 78        return 1;
 79}
 80static inline int in_egroup_p(kgid_t grp)
 81{
 82        return 1;
 83}
 84static inline int groups_search(const struct group_info *group_info, kgid_t grp)
 85{
 86	return 1;
 87}
 88#endif
 89
 90/*
 91 * The security context of a task
 92 *
 93 * The parts of the context break down into two categories:
 94 *
 95 *  (1) The objective context of a task.  These parts are used when some other
 96 *	task is attempting to affect this one.
 97 *
 98 *  (2) The subjective context.  These details are used when the task is acting
 99 *	upon another object, be that a file, a task, a key or whatever.
100 *
101 * Note that some members of this structure belong to both categories - the
102 * LSM security pointer for instance.
103 *
104 * A task has two security pointers.  task->real_cred points to the objective
105 * context that defines that task's actual details.  The objective part of this
106 * context is used whenever that task is acted upon.
107 *
108 * task->cred points to the subjective context that defines the details of how
109 * that task is going to act upon another object.  This may be overridden
110 * temporarily to point to another security context, but normally points to the
111 * same context as task->real_cred.
112 */
113struct cred {
114	atomic_long_t	usage;
115	kuid_t		uid;		/* real UID of the task */
116	kgid_t		gid;		/* real GID of the task */
117	kuid_t		suid;		/* saved UID of the task */
118	kgid_t		sgid;		/* saved GID of the task */
119	kuid_t		euid;		/* effective UID of the task */
120	kgid_t		egid;		/* effective GID of the task */
121	kuid_t		fsuid;		/* UID for VFS ops */
122	kgid_t		fsgid;		/* GID for VFS ops */
123	unsigned	securebits;	/* SUID-less security management */
124	kernel_cap_t	cap_inheritable; /* caps our children can inherit */
125	kernel_cap_t	cap_permitted;	/* caps we're permitted */
126	kernel_cap_t	cap_effective;	/* caps we can actually use */
127	kernel_cap_t	cap_bset;	/* capability bounding set */
128	kernel_cap_t	cap_ambient;	/* Ambient capability set */
129#ifdef CONFIG_KEYS
130	unsigned char	jit_keyring;	/* default keyring to attach requested
131					 * keys to */
132	struct key	*session_keyring; /* keyring inherited over fork */
133	struct key	*process_keyring; /* keyring private to this process */
134	struct key	*thread_keyring; /* keyring private to this thread */
135	struct key	*request_key_auth; /* assumed request_key authority */
136#endif
137#ifdef CONFIG_SECURITY
138	void		*security;	/* LSM security */
139#endif
140	struct user_struct *user;	/* real user ID subscription */
141	struct user_namespace *user_ns; /* user_ns the caps and keyrings are relative to. */
142	struct ucounts *ucounts;
143	struct group_info *group_info;	/* supplementary groups for euid/fsgid */
144	/* RCU deletion */
145	union {
146		int non_rcu;			/* Can we skip RCU deletion? */
147		struct rcu_head	rcu;		/* RCU deletion hook */
148	};
149} __randomize_layout;
150
151extern void __put_cred(struct cred *);
152extern void exit_creds(struct task_struct *);
153extern int copy_creds(struct task_struct *, u64);
154extern const struct cred *get_task_cred(struct task_struct *);
155extern struct cred *cred_alloc_blank(void);
156extern struct cred *prepare_creds(void);
157extern struct cred *prepare_exec_creds(void);
158extern int commit_creds(struct cred *);
159extern void abort_creds(struct cred *);
160extern struct cred *prepare_kernel_cred(struct task_struct *);
161static inline const struct cred *kernel_cred(void)
162{
163	/* shut up sparse */
164	return rcu_dereference_raw(init_task.cred);
165}
166extern int set_security_override(struct cred *, u32);
167extern int set_security_override_from_ctx(struct cred *, const char *);
168extern int set_create_files_as(struct cred *, struct inode *);
169extern int cred_fscmp(const struct cred *, const struct cred *);
170extern void __init cred_init(void);
171extern int set_cred_ucounts(struct cred *);
172
173static inline bool cap_ambient_invariant_ok(const struct cred *cred)
174{
175	return cap_issubset(cred->cap_ambient,
176			    cap_intersect(cred->cap_permitted,
177					  cred->cap_inheritable));
178}
179
180static inline const struct cred *override_creds(const struct cred *override_cred)
181{
182	return rcu_replace_pointer(current->cred, override_cred, 1);
183}
184
185static inline const struct cred *revert_creds(const struct cred *revert_cred)
186{
187	return rcu_replace_pointer(current->cred, revert_cred, 1);
188}
189
190DEFINE_CLASS(override_creds,
191	     const struct cred *,
192	     revert_creds(_T),
193	     override_creds(override_cred), const struct cred *override_cred)
194
195#define scoped_with_creds(cred) \
196	scoped_class(override_creds, __UNIQUE_ID(label), cred)
197
198#define scoped_with_kernel_creds() scoped_with_creds(kernel_cred())
199
200/**
201 * get_cred_many - Get references on a set of credentials
202 * @cred: The credentials to reference
203 * @nr: Number of references to acquire
204 *
205 * Get references on the specified set of credentials.  The caller must release
206 * all acquired reference.  If %NULL is passed, it is returned with no action.
207 *
208 * This is used to deal with a committed set of credentials.  Although the
209 * pointer is const, this will temporarily discard the const and increment the
210 * usage count.  The purpose of this is to attempt to catch at compile time the
211 * accidental alteration of a set of credentials that should be considered
212 * immutable.
213 */
214static inline const struct cred *get_cred_many(const struct cred *cred, int nr)
215{
216	struct cred *nonconst_cred = (struct cred *) cred;
217	if (!cred)
218		return cred;
219	nonconst_cred->non_rcu = 0;
220	atomic_long_add(nr, &nonconst_cred->usage);
221	return cred;
222}
223
224/*
225 * get_cred - Get a reference on a set of credentials
226 * @cred: The credentials to reference
227 *
228 * Get a reference on the specified set of credentials.  The caller must
229 * release the reference.  If %NULL is passed, it is returned with no action.
230 *
231 * This is used to deal with a committed set of credentials.
232 */
233static inline const struct cred *get_cred(const struct cred *cred)
234{
235	return get_cred_many(cred, 1);
236}
237
238static inline const struct cred *get_cred_rcu(const struct cred *cred)
239{
240	struct cred *nonconst_cred = (struct cred *) cred;
241	if (!cred)
242		return NULL;
243	if (!atomic_long_inc_not_zero(&nonconst_cred->usage))
244		return NULL;
245	nonconst_cred->non_rcu = 0;
246	return cred;
247}
248
249/**
250 * put_cred - Release a reference to a set of credentials
251 * @cred: The credentials to release
252 * @nr: Number of references to release
253 *
254 * Release a reference to a set of credentials, deleting them when the last ref
255 * is released.  If %NULL is passed, nothing is done.
256 *
257 * This takes a const pointer to a set of credentials because the credentials
258 * on task_struct are attached by const pointers to prevent accidental
259 * alteration of otherwise immutable credential sets.
260 */
261static inline void put_cred_many(const struct cred *_cred, int nr)
262{
263	struct cred *cred = (struct cred *) _cred;
264
265	if (cred) {
266		if (atomic_long_sub_and_test(nr, &cred->usage))
267			__put_cred(cred);
268	}
269}
270
271/*
272 * put_cred - Release a reference to a set of credentials
273 * @cred: The credentials to release
274 *
275 * Release a reference to a set of credentials, deleting them when the last ref
276 * is released.  If %NULL is passed, nothing is done.
277 */
278static inline void put_cred(const struct cred *cred)
279{
280	put_cred_many(cred, 1);
281}
282
283DEFINE_CLASS(prepare_creds,
284	      struct cred *,
285	      if (_T) put_cred(_T),
286	      prepare_creds(), void)
287
288DEFINE_FREE(put_cred, struct cred *, if (!IS_ERR_OR_NULL(_T)) put_cred(_T))
289
290/**
291 * current_cred - Access the current task's subjective credentials
292 *
293 * Access the subjective credentials of the current task.  RCU-safe,
294 * since nobody else can modify it.
295 */
296#define current_cred() \
297	rcu_dereference_protected(current->cred, 1)
298
299/**
300 * current_real_cred - Access the current task's objective credentials
301 *
302 * Access the objective credentials of the current task.  RCU-safe,
303 * since nobody else can modify it.
304 */
305#define current_real_cred() \
306	rcu_dereference_protected(current->real_cred, 1)
307
308/**
309 * __task_cred - Access a task's objective credentials
310 * @task: The task to query
311 *
312 * Access the objective credentials of a task.  The caller must hold the RCU
313 * readlock.
314 *
315 * The result of this function should not be passed directly to get_cred();
316 * rather get_task_cred() should be used instead.
317 */
318#define __task_cred(task)	\
319	rcu_dereference((task)->real_cred)
320
321/**
322 * get_current_cred - Get the current task's subjective credentials
323 *
324 * Get the subjective credentials of the current task, pinning them so that
325 * they can't go away.  Accessing the current task's credentials directly is
326 * not permitted.
327 */
328#define get_current_cred()				\
329	(get_cred(current_cred()))
330
331/**
332 * get_current_user - Get the current task's user_struct
333 *
334 * Get the user record of the current task, pinning it so that it can't go
335 * away.
336 */
337#define get_current_user()				\
338({							\
339	struct user_struct *__u;			\
340	const struct cred *__cred;			\
341	__cred = current_cred();			\
342	__u = get_uid(__cred->user);			\
343	__u;						\
344})
345
346/**
347 * get_current_groups - Get the current task's supplementary group list
348 *
349 * Get the supplementary group list of the current task, pinning it so that it
350 * can't go away.
351 */
352#define get_current_groups()				\
353({							\
354	struct group_info *__groups;			\
355	const struct cred *__cred;			\
356	__cred = current_cred();			\
357	__groups = get_group_info(__cred->group_info);	\
358	__groups;					\
359})
360
361#define task_cred_xxx(task, xxx)			\
362({							\
363	__typeof__(((struct cred *)NULL)->xxx) ___val;	\
364	rcu_read_lock();				\
365	___val = __task_cred((task))->xxx;		\
366	rcu_read_unlock();				\
367	___val;						\
368})
369
370#define task_uid(task)		(task_cred_xxx((task), uid))
371#define task_euid(task)		(task_cred_xxx((task), euid))
372#define task_ucounts(task)	(task_cred_xxx((task), ucounts))
373
374#define current_cred_xxx(xxx)			\
375({						\
376	current_cred()->xxx;			\
377})
378
379#define current_uid()		(current_cred_xxx(uid))
380#define current_gid()		(current_cred_xxx(gid))
381#define current_euid()		(current_cred_xxx(euid))
382#define current_egid()		(current_cred_xxx(egid))
383#define current_suid()		(current_cred_xxx(suid))
384#define current_sgid()		(current_cred_xxx(sgid))
385#define current_fsuid() 	(current_cred_xxx(fsuid))
386#define current_fsgid() 	(current_cred_xxx(fsgid))
387#define current_cap()		(current_cred_xxx(cap_effective))
388#define current_user()		(current_cred_xxx(user))
389#define current_ucounts()	(current_cred_xxx(ucounts))
390
391extern struct user_namespace init_user_ns;
392#ifdef CONFIG_USER_NS
393#define current_user_ns()	(current_cred_xxx(user_ns))
394#else
395static inline struct user_namespace *current_user_ns(void)
396{
397	return &init_user_ns;
398}
399#endif
400
401
402#define current_uid_gid(_uid, _gid)		\
403do {						\
404	const struct cred *__cred;		\
405	__cred = current_cred();		\
406	*(_uid) = __cred->uid;			\
407	*(_gid) = __cred->gid;			\
408} while(0)
409
410#define current_euid_egid(_euid, _egid)		\
411do {						\
412	const struct cred *__cred;		\
413	__cred = current_cred();		\
414	*(_euid) = __cred->euid;		\
415	*(_egid) = __cred->egid;		\
416} while(0)
417
418#define current_fsuid_fsgid(_fsuid, _fsgid)	\
419do {						\
420	const struct cred *__cred;		\
421	__cred = current_cred();		\
422	*(_fsuid) = __cred->fsuid;		\
423	*(_fsgid) = __cred->fsgid;		\
424} while(0)
425
426#endif /* _LINUX_CRED_H */
~/ Read-only file preview.