1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Security server interface.
5 * Author : Stephen Smalley, <sds@tycho.nsa.gov>
9 #ifndef _SELINUX_SECURITY_H_
10 #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 #include <linux/refcount.h>
17 #include <linux/workqueue.h>
20 #define SECSID_NULL 0x00000000 /* unspecified SID */
21 #define SECSID_WILD 0xffffffff /* wildcard SID */
22 #define SECCLASS_NULL 0x0000 /* no class */
24 /* Identify specific policy version changes */
25 #define POLICYDB_VERSION_BASE 15
26 #define POLICYDB_VERSION_BOOL 16
27 #define POLICYDB_VERSION_IPV6 17
28 #define POLICYDB_VERSION_NLCLASS 18
29 #define POLICYDB_VERSION_VALIDATETRANS 19
30 #define POLICYDB_VERSION_MLS 19
31 #define POLICYDB_VERSION_AVTAB 20
32 #define POLICYDB_VERSION_RANGETRANS 21
33 #define POLICYDB_VERSION_POLCAP 22
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
45 /* Range of policy versions we understand*/
46 #define POLICYDB_VERSION_MIN POLICYDB_VERSION_BASE
47 #define POLICYDB_VERSION_MAX POLICYDB_VERSION_GLBLUB
49 /* Mask for just the mount related flags */
50 #define SE_MNTMASK 0x0f
51 /* 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 #define CONTEXT_MNT 0x01
54 #define FSCONTEXT_MNT 0x02
55 #define ROOTCONTEXT_MNT 0x04
56 #define DEFCONTEXT_MNT 0x08
57 #define SBLABEL_MNT 0x10
58 /* Non-mount related flags */
59 #define SE_SBINITIALIZED 0x0100
60 #define SE_SBPROC 0x0200
61 #define SE_SBGENFS 0x0400
62 #define SE_SBGENFS_XATTR 0x0800
64 #define CONTEXT_STR "context"
65 #define FSCONTEXT_STR "fscontext"
66 #define ROOTCONTEXT_STR "rootcontext"
67 #define DEFCONTEXT_STR "defcontext"
68 #define SECLABEL_STR "seclabel"
70 struct netlbl_lsm_secattr
;
72 extern int selinux_enabled_boot
;
74 /* Policy capabilities */
76 POLICYDB_CAPABILITY_NETPEER
,
77 POLICYDB_CAPABILITY_OPENPERM
,
78 POLICYDB_CAPABILITY_EXTSOCKCLASS
,
79 POLICYDB_CAPABILITY_ALWAYSNETWORK
,
80 POLICYDB_CAPABILITY_CGROUPSECLABEL
,
81 POLICYDB_CAPABILITY_NNP_NOSUID_TRANSITION
,
82 POLICYDB_CAPABILITY_GENFS_SECLABEL_SYMLINKS
,
83 __POLICYDB_CAPABILITY_MAX
85 #define POLICYDB_CAPABILITY_MAX (__POLICYDB_CAPABILITY_MAX - 1)
87 extern const char *selinux_policycap_names
[__POLICYDB_CAPABILITY_MAX
];
90 * type_datum properties
91 * available at the kernel policy version >= POLICYDB_VERSION_BOUNDARY
93 #define TYPEDATUM_PROPERTY_PRIMARY 0x0001
94 #define TYPEDATUM_PROPERTY_ATTRIBUTE 0x0002
96 /* limitation of boundary depth */
97 #define POLICYDB_BOUNDS_MAXDEPTH 4
102 struct selinux_state
{
103 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
106 #ifdef CONFIG_SECURITY_SELINUX_DEVELOP
111 bool policycap
[__POLICYDB_CAPABILITY_MAX
];
113 struct page
*status_page
;
114 struct mutex status_lock
;
116 struct selinux_avc
*avc
;
117 struct selinux_ss
*ss
;
118 } __randomize_layout
;
120 void selinux_ss_init(struct selinux_ss
**ss
);
121 void selinux_avc_init(struct selinux_avc
**avc
);
123 extern struct selinux_state selinux_state
;
125 static inline bool selinux_initialized(const struct selinux_state
*state
)
127 /* do a synchronized load to avoid race conditions */
128 return smp_load_acquire(&state
->initialized
);
131 static inline void selinux_mark_initialized(struct selinux_state
*state
)
133 /* do a synchronized write to avoid race conditions */
134 smp_store_release(&state
->initialized
, true);
137 #ifdef CONFIG_SECURITY_SELINUX_DEVELOP
138 static inline bool enforcing_enabled(struct selinux_state
*state
)
140 return READ_ONCE(state
->enforcing
);
143 static inline void enforcing_set(struct selinux_state
*state
, bool value
)
145 WRITE_ONCE(state
->enforcing
, value
);
148 static inline bool enforcing_enabled(struct selinux_state
*state
)
153 static inline void enforcing_set(struct selinux_state
*state
, bool value
)
158 #ifdef CONFIG_SECURITY_SELINUX_DISABLE
159 static inline bool selinux_disabled(struct selinux_state
*state
)
161 return READ_ONCE(state
->disabled
);
164 static inline void selinux_mark_disabled(struct selinux_state
*state
)
166 WRITE_ONCE(state
->disabled
, true);
169 static inline bool selinux_disabled(struct selinux_state
*state
)
175 static inline bool selinux_policycap_netpeer(void)
177 struct selinux_state
*state
= &selinux_state
;
179 return state
->policycap
[POLICYDB_CAPABILITY_NETPEER
];
182 static inline bool selinux_policycap_openperm(void)
184 struct selinux_state
*state
= &selinux_state
;
186 return state
->policycap
[POLICYDB_CAPABILITY_OPENPERM
];
189 static inline bool selinux_policycap_extsockclass(void)
191 struct selinux_state
*state
= &selinux_state
;
193 return state
->policycap
[POLICYDB_CAPABILITY_EXTSOCKCLASS
];
196 static inline bool selinux_policycap_alwaysnetwork(void)
198 struct selinux_state
*state
= &selinux_state
;
200 return state
->policycap
[POLICYDB_CAPABILITY_ALWAYSNETWORK
];
203 static inline bool selinux_policycap_cgroupseclabel(void)
205 struct selinux_state
*state
= &selinux_state
;
207 return state
->policycap
[POLICYDB_CAPABILITY_CGROUPSECLABEL
];
210 static inline bool selinux_policycap_nnp_nosuid_transition(void)
212 struct selinux_state
*state
= &selinux_state
;
214 return state
->policycap
[POLICYDB_CAPABILITY_NNP_NOSUID_TRANSITION
];
217 static inline bool selinux_policycap_genfs_seclabel_symlinks(void)
219 struct selinux_state
*state
= &selinux_state
;
221 return state
->policycap
[POLICYDB_CAPABILITY_GENFS_SECLABEL_SYMLINKS
];
224 int security_mls_enabled(struct selinux_state
*state
);
225 int security_load_policy(struct selinux_state
*state
,
226 void *data
, size_t len
);
227 int security_read_policy(struct selinux_state
*state
,
228 void **data
, size_t *len
);
229 size_t security_policydb_len(struct selinux_state
*state
);
231 int security_policycap_supported(struct selinux_state
*state
,
232 unsigned int req_cap
);
234 #define SEL_VEC_MAX 32
243 #define XPERMS_ALLOWED 1
244 #define XPERMS_AUDITALLOW 2
245 #define XPERMS_DONTAUDIT 4
247 #define security_xperm_set(perms, x) (perms[x >> 5] |= 1 << (x & 0x1f))
248 #define security_xperm_test(perms, x) (1 & (perms[x >> 5] >> (x & 0x1f)))
249 struct extended_perms_data
{
253 struct extended_perms_decision
{
256 struct extended_perms_data
*allowed
;
257 struct extended_perms_data
*auditallow
;
258 struct extended_perms_data
*dontaudit
;
261 struct extended_perms
{
262 u16 len
; /* length associated decision chain */
263 struct extended_perms_data drivers
; /* flag drivers that are used */
266 /* definitions of av_decision.flags */
267 #define AVD_FLAGS_PERMISSIVE 0x0001
269 void security_compute_av(struct selinux_state
*state
,
271 u16 tclass
, struct av_decision
*avd
,
272 struct extended_perms
*xperms
);
274 void security_compute_xperms_decision(struct selinux_state
*state
,
275 u32 ssid
, u32 tsid
, u16 tclass
,
277 struct extended_perms_decision
*xpermd
);
279 void security_compute_av_user(struct selinux_state
*state
,
281 u16 tclass
, struct av_decision
*avd
);
283 int security_transition_sid(struct selinux_state
*state
,
284 u32 ssid
, u32 tsid
, u16 tclass
,
285 const struct qstr
*qstr
, u32
*out_sid
);
287 int security_transition_sid_user(struct selinux_state
*state
,
288 u32 ssid
, u32 tsid
, u16 tclass
,
289 const char *objname
, u32
*out_sid
);
291 int security_member_sid(struct selinux_state
*state
, u32 ssid
, u32 tsid
,
292 u16 tclass
, u32
*out_sid
);
294 int security_change_sid(struct selinux_state
*state
, u32 ssid
, u32 tsid
,
295 u16 tclass
, u32
*out_sid
);
297 int security_sid_to_context(struct selinux_state
*state
, u32 sid
,
298 char **scontext
, u32
*scontext_len
);
300 int security_sid_to_context_force(struct selinux_state
*state
,
301 u32 sid
, char **scontext
, u32
*scontext_len
);
303 int security_sid_to_context_inval(struct selinux_state
*state
,
304 u32 sid
, char **scontext
, u32
*scontext_len
);
306 int security_context_to_sid(struct selinux_state
*state
,
307 const char *scontext
, u32 scontext_len
,
308 u32
*out_sid
, gfp_t gfp
);
310 int security_context_str_to_sid(struct selinux_state
*state
,
311 const char *scontext
, u32
*out_sid
, gfp_t gfp
);
313 int security_context_to_sid_default(struct selinux_state
*state
,
314 const char *scontext
, u32 scontext_len
,
315 u32
*out_sid
, u32 def_sid
, gfp_t gfp_flags
);
317 int security_context_to_sid_force(struct selinux_state
*state
,
318 const char *scontext
, u32 scontext_len
,
321 int security_get_user_sids(struct selinux_state
*state
,
322 u32 callsid
, char *username
,
323 u32
**sids
, u32
*nel
);
325 int security_port_sid(struct selinux_state
*state
,
326 u8 protocol
, u16 port
, u32
*out_sid
);
328 int security_ib_pkey_sid(struct selinux_state
*state
,
329 u64 subnet_prefix
, u16 pkey_num
, u32
*out_sid
);
331 int security_ib_endport_sid(struct selinux_state
*state
,
332 const char *dev_name
, u8 port_num
, u32
*out_sid
);
334 int security_netif_sid(struct selinux_state
*state
,
335 char *name
, u32
*if_sid
);
337 int security_node_sid(struct selinux_state
*state
,
338 u16 domain
, void *addr
, u32 addrlen
,
341 int security_validate_transition(struct selinux_state
*state
,
342 u32 oldsid
, u32 newsid
, u32 tasksid
,
345 int security_validate_transition_user(struct selinux_state
*state
,
346 u32 oldsid
, u32 newsid
, u32 tasksid
,
349 int security_bounded_transition(struct selinux_state
*state
,
350 u32 oldsid
, u32 newsid
);
352 int security_sid_mls_copy(struct selinux_state
*state
,
353 u32 sid
, u32 mls_sid
, u32
*new_sid
);
355 int security_net_peersid_resolve(struct selinux_state
*state
,
356 u32 nlbl_sid
, u32 nlbl_type
,
360 int security_get_classes(struct selinux_state
*state
,
361 char ***classes
, int *nclasses
);
362 int security_get_permissions(struct selinux_state
*state
,
363 char *class, char ***perms
, int *nperms
);
364 int security_get_reject_unknown(struct selinux_state
*state
);
365 int security_get_allow_unknown(struct selinux_state
*state
);
367 #define SECURITY_FS_USE_XATTR 1 /* use xattr */
368 #define SECURITY_FS_USE_TRANS 2 /* use transition SIDs, e.g. devpts/tmpfs */
369 #define SECURITY_FS_USE_TASK 3 /* use task SIDs, e.g. pipefs/sockfs */
370 #define SECURITY_FS_USE_GENFS 4 /* use the genfs support */
371 #define SECURITY_FS_USE_NONE 5 /* no labeling support */
372 #define SECURITY_FS_USE_MNTPOINT 6 /* use mountpoint labeling */
373 #define SECURITY_FS_USE_NATIVE 7 /* use native label support */
374 #define SECURITY_FS_USE_MAX 7 /* Highest SECURITY_FS_USE_XXX */
376 int security_fs_use(struct selinux_state
*state
, struct super_block
*sb
);
378 int security_genfs_sid(struct selinux_state
*state
,
379 const char *fstype
, char *name
, u16 sclass
,
382 #ifdef CONFIG_NETLABEL
383 int security_netlbl_secattr_to_sid(struct selinux_state
*state
,
384 struct netlbl_lsm_secattr
*secattr
,
387 int security_netlbl_sid_to_secattr(struct selinux_state
*state
,
389 struct netlbl_lsm_secattr
*secattr
);
391 static inline int security_netlbl_secattr_to_sid(struct selinux_state
*state
,
392 struct netlbl_lsm_secattr
*secattr
,
398 static inline int security_netlbl_sid_to_secattr(struct selinux_state
*state
,
400 struct netlbl_lsm_secattr
*secattr
)
404 #endif /* CONFIG_NETLABEL */
406 const char *security_get_initial_sid_context(u32 sid
);
409 * status notifier using mmap interface
411 extern struct page
*selinux_kernel_status_page(struct selinux_state
*state
);
413 #define SELINUX_KERNEL_STATUS_VERSION 1
414 struct selinux_kernel_status
{
415 u32 version
; /* version number of thie structure */
416 u32 sequence
; /* sequence number of seqlock logic */
417 u32 enforcing
; /* current setting of enforcing mode */
418 u32 policyload
; /* times of policy reloaded */
419 u32 deny_unknown
; /* current setting of deny_unknown */
421 * The version > 0 supports above members.
425 extern void selinux_status_update_setenforce(struct selinux_state
*state
,
427 extern void selinux_status_update_policyload(struct selinux_state
*state
,
429 extern void selinux_complete_init(void);
430 extern int selinux_disable(struct selinux_state
*state
);
431 extern void exit_sel_fs(void);
432 extern struct path selinux_null
;
433 extern struct vfsmount
*selinuxfs_mount
;
434 extern void selnl_notify_setenforce(int val
);
435 extern void selnl_notify_policyload(u32 seqno
);
436 extern int selinux_nlmsg_lookup(u16 sclass
, u16 nlmsg_type
, u32
*perm
);
438 extern void avtab_cache_init(void);
439 extern void ebitmap_cache_init(void);
440 extern void hashtab_cache_init(void);
441 extern int security_sidtab_hash_stats(struct selinux_state
*state
, char *page
);
443 #endif /* _SELINUX_SECURITY_H_ */