security.h 11.6 KB
Newer Older
1
/* SPDX-License-Identifier: GPL-2.0 */
L
Linus Torvalds 已提交
2 3 4
/*
 * Security server interface.
 *
5
 * Author : Stephen Smalley, <sds@tycho.nsa.gov>
L
Linus Torvalds 已提交
6 7 8 9 10 11
 *
 */

#ifndef _SELINUX_SECURITY_H_
#define _SELINUX_SECURITY_H_

12
#include <linux/compiler.h>
13
#include <linux/dcache.h>
14
#include <linux/magic.h>
15
#include <linux/types.h>
16 17
#include <linux/refcount.h>
#include <linux/workqueue.h>
L
Linus Torvalds 已提交
18 19 20 21 22 23 24 25 26 27 28 29 30
#include "flask.h"

#define SECSID_NULL			0x00000000 /* unspecified SID */
#define SECSID_WILD			0xffffffff /* wildcard SID */
#define SECCLASS_NULL			0x0000 /* no class */

/* Identify specific policy version changes */
#define POLICYDB_VERSION_BASE		15
#define POLICYDB_VERSION_BOOL		16
#define POLICYDB_VERSION_IPV6		17
#define POLICYDB_VERSION_NLCLASS	18
#define POLICYDB_VERSION_VALIDATETRANS	19
#define POLICYDB_VERSION_MLS		19
31
#define POLICYDB_VERSION_AVTAB		20
32
#define POLICYDB_VERSION_RANGETRANS	21
33
#define POLICYDB_VERSION_POLCAP		22
E
Eric Paris 已提交
34
#define POLICYDB_VERSION_PERMISSIVE	23
35
#define POLICYDB_VERSION_BOUNDARY	24
36
#define POLICYDB_VERSION_FILENAME_TRANS	25
37
#define POLICYDB_VERSION_ROLETRANS	26
38
#define POLICYDB_VERSION_NEW_OBJECT_DEFAULTS	27
39
#define POLICYDB_VERSION_DEFAULT_TYPE	28
40
#define POLICYDB_VERSION_CONSTRAINT_NAMES	29
41
#define POLICYDB_VERSION_XPERMS_IOCTL	30
42
#define POLICYDB_VERSION_INFINIBAND		31
43
#define POLICYDB_VERSION_GLBLUB		32
L
Linus Torvalds 已提交
44 45 46

/* Range of policy versions we understand*/
#define POLICYDB_VERSION_MIN   POLICYDB_VERSION_BASE
47
#define POLICYDB_VERSION_MAX   POLICYDB_VERSION_GLBLUB
L
Linus Torvalds 已提交
48

49 50 51
/* Mask for just the mount related flags */
#define SE_MNTMASK	0x0f
/* Super block security struct flags for mount options */
52
/* BE CAREFUL, these need to be the low order bits for selinux_get_mnt_opts */
53 54 55 56
#define CONTEXT_MNT	0x01
#define FSCONTEXT_MNT	0x02
#define ROOTCONTEXT_MNT	0x04
#define DEFCONTEXT_MNT	0x08
57
#define SBLABEL_MNT	0x10
58
/* Non-mount related flags */
59 60
#define SE_SBINITIALIZED	0x0100
#define SE_SBPROC		0x0200
61
#define SE_SBGENFS		0x0400
62
#define SE_SBGENFS_XATTR	0x0800
63

64 65 66 67 68
#define CONTEXT_STR	"context"
#define FSCONTEXT_STR	"fscontext"
#define ROOTCONTEXT_STR	"rootcontext"
#define DEFCONTEXT_STR	"defcontext"
#define SECLABEL_STR "seclabel"
69

70
struct netlbl_lsm_secattr;
71

L
Linus Torvalds 已提交
72 73
extern int selinux_enabled;

74 75 76
/* Policy capabilities */
enum {
	POLICYDB_CAPABILITY_NETPEER,
E
Eric Paris 已提交
77
	POLICYDB_CAPABILITY_OPENPERM,
78
	POLICYDB_CAPABILITY_EXTSOCKCLASS,
79
	POLICYDB_CAPABILITY_ALWAYSNETWORK,
80
	POLICYDB_CAPABILITY_CGROUPSECLABEL,
81
	POLICYDB_CAPABILITY_NNP_NOSUID_TRANSITION,
82 83 84 85
	__POLICYDB_CAPABILITY_MAX
};
#define POLICYDB_CAPABILITY_MAX (__POLICYDB_CAPABILITY_MAX - 1)

86
extern const char *selinux_policycap_names[__POLICYDB_CAPABILITY_MAX];
87

88 89 90 91 92 93 94 95 96 97
/*
 * type_datum properties
 * available at the kernel policy version >= POLICYDB_VERSION_BOUNDARY
 */
#define TYPEDATUM_PROPERTY_PRIMARY	0x0001
#define TYPEDATUM_PROPERTY_ATTRIBUTE	0x0002

/* limitation of boundary depth  */
#define POLICYDB_BOUNDS_MAXDEPTH	4

S
Stephen Smalley 已提交
98
struct selinux_avc;
99 100 101 102 103 104 105 106 107 108
struct selinux_ss;

struct selinux_state {
	bool disabled;
#ifdef CONFIG_SECURITY_SELINUX_DEVELOP
	bool enforcing;
#endif
	bool checkreqprot;
	bool initialized;
	bool policycap[__POLICYDB_CAPABILITY_MAX];
S
Stephen Smalley 已提交
109
	struct selinux_avc *avc;
110 111 112 113
	struct selinux_ss *ss;
};

void selinux_ss_init(struct selinux_ss **ss);
S
Stephen Smalley 已提交
114
void selinux_avc_init(struct selinux_avc **avc);
115 116 117 118

extern struct selinux_state selinux_state;

#ifdef CONFIG_SECURITY_SELINUX_DEVELOP
119
static inline bool enforcing_enabled(struct selinux_state *state)
120 121 122 123
{
	return state->enforcing;
}

124
static inline void enforcing_set(struct selinux_state *state, bool value)
125 126 127 128
{
	state->enforcing = value;
}
#else
129
static inline bool enforcing_enabled(struct selinux_state *state)
130 131 132 133
{
	return true;
}

134
static inline void enforcing_set(struct selinux_state *state, bool value)
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
{
}
#endif

static inline bool selinux_policycap_netpeer(void)
{
	struct selinux_state *state = &selinux_state;

	return state->policycap[POLICYDB_CAPABILITY_NETPEER];
}

static inline bool selinux_policycap_openperm(void)
{
	struct selinux_state *state = &selinux_state;

	return state->policycap[POLICYDB_CAPABILITY_OPENPERM];
}
152

153 154 155 156 157 158
static inline bool selinux_policycap_extsockclass(void)
{
	struct selinux_state *state = &selinux_state;

	return state->policycap[POLICYDB_CAPABILITY_EXTSOCKCLASS];
}
L
Linus Torvalds 已提交
159

160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
static inline bool selinux_policycap_alwaysnetwork(void)
{
	struct selinux_state *state = &selinux_state;

	return state->policycap[POLICYDB_CAPABILITY_ALWAYSNETWORK];
}

static inline bool selinux_policycap_cgroupseclabel(void)
{
	struct selinux_state *state = &selinux_state;

	return state->policycap[POLICYDB_CAPABILITY_CGROUPSECLABEL];
}

static inline bool selinux_policycap_nnp_nosuid_transition(void)
{
	struct selinux_state *state = &selinux_state;

	return state->policycap[POLICYDB_CAPABILITY_NNP_NOSUID_TRANSITION];
}

int security_mls_enabled(struct selinux_state *state);
int security_load_policy(struct selinux_state *state,
			 void *data, size_t len);
int security_read_policy(struct selinux_state *state,
			 void **data, size_t *len);
size_t security_policydb_len(struct selinux_state *state);

int security_policycap_supported(struct selinux_state *state,
				 unsigned int req_cap);
190

191
#define SEL_VEC_MAX 32
L
Linus Torvalds 已提交
192 193 194 195 196
struct av_decision {
	u32 allowed;
	u32 auditallow;
	u32 auditdeny;
	u32 seqno;
197
	u32 flags;
L
Linus Torvalds 已提交
198 199
};

200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
#define XPERMS_ALLOWED 1
#define XPERMS_AUDITALLOW 2
#define XPERMS_DONTAUDIT 4

#define security_xperm_set(perms, x) (perms[x >> 5] |= 1 << (x & 0x1f))
#define security_xperm_test(perms, x) (1 & (perms[x >> 5] >> (x & 0x1f)))
struct extended_perms_data {
	u32 p[8];
};

struct extended_perms_decision {
	u8 used;
	u8 driver;
	struct extended_perms_data *allowed;
	struct extended_perms_data *auditallow;
	struct extended_perms_data *dontaudit;
};

struct extended_perms {
	u16 len;	/* length associated decision chain */
	struct extended_perms_data drivers; /* flag drivers that are used */
};

223 224
/* definitions of av_decision.flags */
#define AVD_FLAGS_PERMISSIVE	0x0001
E
Eric Paris 已提交
225

226 227
void security_compute_av(struct selinux_state *state,
			 u32 ssid, u32 tsid,
228 229 230
			 u16 tclass, struct av_decision *avd,
			 struct extended_perms *xperms);

231 232 233 234
void security_compute_xperms_decision(struct selinux_state *state,
				      u32 ssid, u32 tsid, u16 tclass,
				      u8 driver,
				      struct extended_perms_decision *xpermd);
235

236 237 238
void security_compute_av_user(struct selinux_state *state,
			      u32 ssid, u32 tsid,
			      u16 tclass, struct av_decision *avd);
L
Linus Torvalds 已提交
239

240 241
int security_transition_sid(struct selinux_state *state,
			    u32 ssid, u32 tsid, u16 tclass,
242
			    const struct qstr *qstr, u32 *out_sid);
243

244 245
int security_transition_sid_user(struct selinux_state *state,
				 u32 ssid, u32 tsid, u16 tclass,
246
				 const char *objname, u32 *out_sid);
L
Linus Torvalds 已提交
247

248 249
int security_member_sid(struct selinux_state *state, u32 ssid, u32 tsid,
			u16 tclass, u32 *out_sid);
L
Linus Torvalds 已提交
250

251 252
int security_change_sid(struct selinux_state *state, u32 ssid, u32 tsid,
			u16 tclass, u32 *out_sid);
L
Linus Torvalds 已提交
253

254 255
int security_sid_to_context(struct selinux_state *state, u32 sid,
			    char **scontext, u32 *scontext_len);
L
Linus Torvalds 已提交
256

257 258
int security_sid_to_context_force(struct selinux_state *state,
				  u32 sid, char **scontext, u32 *scontext_len);
259

260 261 262
int security_sid_to_context_inval(struct selinux_state *state,
				  u32 sid, char **scontext, u32 *scontext_len);

263 264
int security_context_to_sid(struct selinux_state *state,
			    const char *scontext, u32 scontext_len,
265
			    u32 *out_sid, gfp_t gfp);
L
Linus Torvalds 已提交
266

267 268
int security_context_str_to_sid(struct selinux_state *state,
				const char *scontext, u32 *out_sid, gfp_t gfp);
269

270 271
int security_context_to_sid_default(struct selinux_state *state,
				    const char *scontext, u32 scontext_len,
272
				    u32 *out_sid, u32 def_sid, gfp_t gfp_flags);
273

274 275
int security_context_to_sid_force(struct selinux_state *state,
				  const char *scontext, u32 scontext_len,
276 277
				  u32 *sid);

278 279
int security_get_user_sids(struct selinux_state *state,
			   u32 callsid, char *username,
L
Linus Torvalds 已提交
280 281
			   u32 **sids, u32 *nel);

282 283
int security_port_sid(struct selinux_state *state,
		      u8 protocol, u16 port, u32 *out_sid);
L
Linus Torvalds 已提交
284

285 286
int security_ib_pkey_sid(struct selinux_state *state,
			 u64 subnet_prefix, u16 pkey_num, u32 *out_sid);
287

288 289
int security_ib_endport_sid(struct selinux_state *state,
			    const char *dev_name, u8 port_num, u32 *out_sid);
290

291 292
int security_netif_sid(struct selinux_state *state,
		       char *name, u32 *if_sid);
L
Linus Torvalds 已提交
293

294 295 296
int security_node_sid(struct selinux_state *state,
		      u16 domain, void *addr, u32 addrlen,
		      u32 *out_sid);
L
Linus Torvalds 已提交
297

298 299
int security_validate_transition(struct selinux_state *state,
				 u32 oldsid, u32 newsid, u32 tasksid,
300
				 u16 tclass);
L
Linus Torvalds 已提交
301

302 303
int security_validate_transition_user(struct selinux_state *state,
				      u32 oldsid, u32 newsid, u32 tasksid,
304 305
				      u16 tclass);

306 307
int security_bounded_transition(struct selinux_state *state,
				u32 oldsid, u32 newsid);
308

309 310
int security_sid_mls_copy(struct selinux_state *state,
			  u32 sid, u32 mls_sid, u32 *new_sid);
311

312 313
int security_net_peersid_resolve(struct selinux_state *state,
				 u32 nlbl_sid, u32 nlbl_type,
314 315 316
				 u32 xfrm_sid,
				 u32 *peer_sid);

317 318 319 320 321 322
int security_get_classes(struct selinux_state *state,
			 char ***classes, int *nclasses);
int security_get_permissions(struct selinux_state *state,
			     char *class, char ***perms, int *nperms);
int security_get_reject_unknown(struct selinux_state *state);
int security_get_allow_unknown(struct selinux_state *state);
323

L
Linus Torvalds 已提交
324 325 326 327 328 329
#define SECURITY_FS_USE_XATTR		1 /* use xattr */
#define SECURITY_FS_USE_TRANS		2 /* use transition SIDs, e.g. devpts/tmpfs */
#define SECURITY_FS_USE_TASK		3 /* use task SIDs, e.g. pipefs/sockfs */
#define SECURITY_FS_USE_GENFS		4 /* use the genfs support */
#define SECURITY_FS_USE_NONE		5 /* no labeling support */
#define SECURITY_FS_USE_MNTPOINT	6 /* use mountpoint labeling */
330 331
#define SECURITY_FS_USE_NATIVE		7 /* use native label support */
#define SECURITY_FS_USE_MAX		7 /* Highest SECURITY_FS_USE_XXX */
L
Linus Torvalds 已提交
332

333
int security_fs_use(struct selinux_state *state, struct super_block *sb);
L
Linus Torvalds 已提交
334

335 336 337
int security_genfs_sid(struct selinux_state *state,
		       const char *fstype, char *name, u16 sclass,
		       u32 *sid);
L
Linus Torvalds 已提交
338

339
#ifdef CONFIG_NETLABEL
340 341
int security_netlbl_secattr_to_sid(struct selinux_state *state,
				   struct netlbl_lsm_secattr *secattr,
342 343
				   u32 *sid);

344 345
int security_netlbl_sid_to_secattr(struct selinux_state *state,
				   u32 sid,
346 347
				   struct netlbl_lsm_secattr *secattr);
#else
348
static inline int security_netlbl_secattr_to_sid(struct selinux_state *state,
349 350 351 352 353 354
					    struct netlbl_lsm_secattr *secattr,
					    u32 *sid)
{
	return -EIDRM;
}

355 356 357
static inline int security_netlbl_sid_to_secattr(struct selinux_state *state,
					 u32 sid,
					 struct netlbl_lsm_secattr *secattr)
358 359 360 361 362
{
	return -ENOENT;
}
#endif /* CONFIG_NETLABEL */

363 364
const char *security_get_initial_sid_context(u32 sid);

365 366 367
/*
 * status notifier using mmap interface
 */
368
extern struct page *selinux_kernel_status_page(struct selinux_state *state);
369 370

#define SELINUX_KERNEL_STATUS_VERSION	1
371
struct selinux_kernel_status {
372 373 374 375 376 377 378 379
	u32	version;	/* version number of thie structure */
	u32	sequence;	/* sequence number of seqlock logic */
	u32	enforcing;	/* current setting of enforcing mode */
	u32	policyload;	/* times of policy reloaded */
	u32	deny_unknown;	/* current setting of deny_unknown */
	/*
	 * The version > 0 supports above members.
	 */
380
} __packed;
381

382 383 384 385
extern void selinux_status_update_setenforce(struct selinux_state *state,
					     int enforcing);
extern void selinux_status_update_policyload(struct selinux_state *state,
					     int seqno);
386
extern void selinux_complete_init(void);
387
extern int selinux_disable(struct selinux_state *state);
388
extern void exit_sel_fs(void);
389
extern struct path selinux_null;
390
extern struct vfsmount *selinuxfs_mount;
391 392 393
extern void selnl_notify_setenforce(int val);
extern void selnl_notify_policyload(u32 seqno);
extern int selinux_nlmsg_lookup(u16 sclass, u16 nlmsg_type, u32 *perm);
394

395 396 397
extern void avtab_cache_init(void);
extern void ebitmap_cache_init(void);
extern void hashtab_cache_init(void);
L
Linus Torvalds 已提交
398

399
#endif /* _SELINUX_SECURITY_H_ */