Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */
2 : : /*
3 : : * Security server interface.
4 : : *
5 : : * Author : Stephen Smalley, <sds@tycho.nsa.gov>
6 : : *
7 : : */
8 : :
9 : : #ifndef _SELINUX_SECURITY_H_
10 : : #define _SELINUX_SECURITY_H_
11 : :
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>
18 : : #include "flask.h"
19 : :
20 : : #define SECSID_NULL 0x00000000 /* unspecified SID */
21 : : #define SECSID_WILD 0xffffffff /* wildcard SID */
22 : : #define SECCLASS_NULL 0x0000 /* no class */
23 : :
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
44 : :
45 : : /* Range of policy versions we understand*/
46 : : #define POLICYDB_VERSION_MIN POLICYDB_VERSION_BASE
47 : : #define POLICYDB_VERSION_MAX POLICYDB_VERSION_GLBLUB
48 : :
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
63 : :
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"
69 : :
70 : : struct netlbl_lsm_secattr;
71 : :
72 : : extern int selinux_enabled_boot;
73 : :
74 : : /* Policy capabilities */
75 : : enum {
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_MAX
83 : : };
84 : : #define POLICYDB_CAPABILITY_MAX (__POLICYDB_CAPABILITY_MAX - 1)
85 : :
86 : : extern const char *selinux_policycap_names[__POLICYDB_CAPABILITY_MAX];
87 : :
88 : : /*
89 : : * type_datum properties
90 : : * available at the kernel policy version >= POLICYDB_VERSION_BOUNDARY
91 : : */
92 : : #define TYPEDATUM_PROPERTY_PRIMARY 0x0001
93 : : #define TYPEDATUM_PROPERTY_ATTRIBUTE 0x0002
94 : :
95 : : /* limitation of boundary depth */
96 : : #define POLICYDB_BOUNDS_MAXDEPTH 4
97 : :
98 : : struct selinux_avc;
99 : : struct selinux_ss;
100 : :
101 : : struct selinux_state {
102 : : #ifdef CONFIG_SECURITY_SELINUX_DISABLE
103 : : bool disabled;
104 : : #endif
105 : : #ifdef CONFIG_SECURITY_SELINUX_DEVELOP
106 : : bool enforcing;
107 : : #endif
108 : : bool checkreqprot;
109 : : bool initialized;
110 : : bool policycap[__POLICYDB_CAPABILITY_MAX];
111 : : struct selinux_avc *avc;
112 : : struct selinux_ss *ss;
113 : : } __randomize_layout;
114 : :
115 : : void selinux_ss_init(struct selinux_ss **ss);
116 : : void selinux_avc_init(struct selinux_avc **avc);
117 : :
118 : : extern struct selinux_state selinux_state;
119 : :
120 : 1317036 : static inline bool selinux_initialized(const struct selinux_state *state)
121 : : {
122 : : /* do a synchronized load to avoid race conditions */
123 [ - - - + : 1317036 : return smp_load_acquire(&state->initialized);
- - - + +
- - + + -
- + - - +
- - - + -
- - - - +
- - - - -
- - ]
124 : : }
125 : :
126 : 0 : static inline void selinux_mark_initialized(struct selinux_state *state)
127 : : {
128 : : /* do a synchronized write to avoid race conditions */
129 : 0 : smp_store_release(&state->initialized, true);
130 : : }
131 : :
132 : : #ifdef CONFIG_SECURITY_SELINUX_DEVELOP
133 : 3 : static inline bool enforcing_enabled(struct selinux_state *state)
134 : : {
135 [ - - # # : 3 : return READ_ONCE(state->enforcing);
# # ]
136 : : }
137 : :
138 : 3 : static inline void enforcing_set(struct selinux_state *state, bool value)
139 : : {
140 [ # # ]: 3 : WRITE_ONCE(state->enforcing, value);
141 : : }
142 : : #else
143 : : static inline bool enforcing_enabled(struct selinux_state *state)
144 : : {
145 : : return true;
146 : : }
147 : :
148 : : static inline void enforcing_set(struct selinux_state *state, bool value)
149 : : {
150 : : }
151 : : #endif
152 : :
153 : : #ifdef CONFIG_SECURITY_SELINUX_DISABLE
154 : 0 : static inline bool selinux_disabled(struct selinux_state *state)
155 : : {
156 [ # # ]: 0 : return READ_ONCE(state->disabled);
157 : : }
158 : :
159 : 0 : static inline void selinux_mark_disabled(struct selinux_state *state)
160 : : {
161 : 0 : WRITE_ONCE(state->disabled, true);
162 : : }
163 : : #else
164 : : static inline bool selinux_disabled(struct selinux_state *state)
165 : : {
166 : : return false;
167 : : }
168 : : #endif
169 : :
170 : 9 : static inline bool selinux_policycap_netpeer(void)
171 : : {
172 : 9 : struct selinux_state *state = &selinux_state;
173 : :
174 [ + - - - : 9 : return state->policycap[POLICYDB_CAPABILITY_NETPEER];
- - ]
175 : : }
176 : :
177 : 77766 : static inline bool selinux_policycap_openperm(void)
178 : : {
179 : 77766 : struct selinux_state *state = &selinux_state;
180 : :
181 [ - + - + ]: 77766 : return state->policycap[POLICYDB_CAPABILITY_OPENPERM];
182 : : }
183 : :
184 : 1842 : static inline bool selinux_policycap_extsockclass(void)
185 : : {
186 : 1842 : struct selinux_state *state = &selinux_state;
187 : :
188 [ - - - - : 1842 : return state->policycap[POLICYDB_CAPABILITY_EXTSOCKCLASS];
- - + + +
- - - - ]
189 : : }
190 : :
191 : 9 : static inline bool selinux_policycap_alwaysnetwork(void)
192 : : {
193 : 9 : struct selinux_state *state = &selinux_state;
194 : :
195 [ - - - - : 9 : return state->policycap[POLICYDB_CAPABILITY_ALWAYSNETWORK];
+ - - - -
- - - - -
- - - - ]
196 : : }
197 : :
198 : : static inline bool selinux_policycap_cgroupseclabel(void)
199 : : {
200 : : struct selinux_state *state = &selinux_state;
201 : :
202 : : return state->policycap[POLICYDB_CAPABILITY_CGROUPSECLABEL];
203 : : }
204 : :
205 : : static inline bool selinux_policycap_nnp_nosuid_transition(void)
206 : : {
207 : : struct selinux_state *state = &selinux_state;
208 : :
209 : : return state->policycap[POLICYDB_CAPABILITY_NNP_NOSUID_TRANSITION];
210 : : }
211 : :
212 : : int security_mls_enabled(struct selinux_state *state);
213 : : int security_load_policy(struct selinux_state *state,
214 : : void *data, size_t len);
215 : : int security_read_policy(struct selinux_state *state,
216 : : void **data, size_t *len);
217 : : size_t security_policydb_len(struct selinux_state *state);
218 : :
219 : : int security_policycap_supported(struct selinux_state *state,
220 : : unsigned int req_cap);
221 : :
222 : : #define SEL_VEC_MAX 32
223 : : struct av_decision {
224 : : u32 allowed;
225 : : u32 auditallow;
226 : : u32 auditdeny;
227 : : u32 seqno;
228 : : u32 flags;
229 : : };
230 : :
231 : : #define XPERMS_ALLOWED 1
232 : : #define XPERMS_AUDITALLOW 2
233 : : #define XPERMS_DONTAUDIT 4
234 : :
235 : : #define security_xperm_set(perms, x) (perms[x >> 5] |= 1 << (x & 0x1f))
236 : : #define security_xperm_test(perms, x) (1 & (perms[x >> 5] >> (x & 0x1f)))
237 : : struct extended_perms_data {
238 : : u32 p[8];
239 : : };
240 : :
241 : : struct extended_perms_decision {
242 : : u8 used;
243 : : u8 driver;
244 : : struct extended_perms_data *allowed;
245 : : struct extended_perms_data *auditallow;
246 : : struct extended_perms_data *dontaudit;
247 : : };
248 : :
249 : : struct extended_perms {
250 : : u16 len; /* length associated decision chain */
251 : : struct extended_perms_data drivers; /* flag drivers that are used */
252 : : };
253 : :
254 : : /* definitions of av_decision.flags */
255 : : #define AVD_FLAGS_PERMISSIVE 0x0001
256 : :
257 : : void security_compute_av(struct selinux_state *state,
258 : : u32 ssid, u32 tsid,
259 : : u16 tclass, struct av_decision *avd,
260 : : struct extended_perms *xperms);
261 : :
262 : : void security_compute_xperms_decision(struct selinux_state *state,
263 : : u32 ssid, u32 tsid, u16 tclass,
264 : : u8 driver,
265 : : struct extended_perms_decision *xpermd);
266 : :
267 : : void security_compute_av_user(struct selinux_state *state,
268 : : u32 ssid, u32 tsid,
269 : : u16 tclass, struct av_decision *avd);
270 : :
271 : : int security_transition_sid(struct selinux_state *state,
272 : : u32 ssid, u32 tsid, u16 tclass,
273 : : const struct qstr *qstr, u32 *out_sid);
274 : :
275 : : int security_transition_sid_user(struct selinux_state *state,
276 : : u32 ssid, u32 tsid, u16 tclass,
277 : : const char *objname, u32 *out_sid);
278 : :
279 : : int security_member_sid(struct selinux_state *state, u32 ssid, u32 tsid,
280 : : u16 tclass, u32 *out_sid);
281 : :
282 : : int security_change_sid(struct selinux_state *state, u32 ssid, u32 tsid,
283 : : u16 tclass, u32 *out_sid);
284 : :
285 : : int security_sid_to_context(struct selinux_state *state, u32 sid,
286 : : char **scontext, u32 *scontext_len);
287 : :
288 : : int security_sid_to_context_force(struct selinux_state *state,
289 : : u32 sid, char **scontext, u32 *scontext_len);
290 : :
291 : : int security_sid_to_context_inval(struct selinux_state *state,
292 : : u32 sid, char **scontext, u32 *scontext_len);
293 : :
294 : : int security_context_to_sid(struct selinux_state *state,
295 : : const char *scontext, u32 scontext_len,
296 : : u32 *out_sid, gfp_t gfp);
297 : :
298 : : int security_context_str_to_sid(struct selinux_state *state,
299 : : const char *scontext, u32 *out_sid, gfp_t gfp);
300 : :
301 : : int security_context_to_sid_default(struct selinux_state *state,
302 : : const char *scontext, u32 scontext_len,
303 : : u32 *out_sid, u32 def_sid, gfp_t gfp_flags);
304 : :
305 : : int security_context_to_sid_force(struct selinux_state *state,
306 : : const char *scontext, u32 scontext_len,
307 : : u32 *sid);
308 : :
309 : : int security_get_user_sids(struct selinux_state *state,
310 : : u32 callsid, char *username,
311 : : u32 **sids, u32 *nel);
312 : :
313 : : int security_port_sid(struct selinux_state *state,
314 : : u8 protocol, u16 port, u32 *out_sid);
315 : :
316 : : int security_ib_pkey_sid(struct selinux_state *state,
317 : : u64 subnet_prefix, u16 pkey_num, u32 *out_sid);
318 : :
319 : : int security_ib_endport_sid(struct selinux_state *state,
320 : : const char *dev_name, u8 port_num, u32 *out_sid);
321 : :
322 : : int security_netif_sid(struct selinux_state *state,
323 : : char *name, u32 *if_sid);
324 : :
325 : : int security_node_sid(struct selinux_state *state,
326 : : u16 domain, void *addr, u32 addrlen,
327 : : u32 *out_sid);
328 : :
329 : : int security_validate_transition(struct selinux_state *state,
330 : : u32 oldsid, u32 newsid, u32 tasksid,
331 : : u16 tclass);
332 : :
333 : : int security_validate_transition_user(struct selinux_state *state,
334 : : u32 oldsid, u32 newsid, u32 tasksid,
335 : : u16 tclass);
336 : :
337 : : int security_bounded_transition(struct selinux_state *state,
338 : : u32 oldsid, u32 newsid);
339 : :
340 : : int security_sid_mls_copy(struct selinux_state *state,
341 : : u32 sid, u32 mls_sid, u32 *new_sid);
342 : :
343 : : int security_net_peersid_resolve(struct selinux_state *state,
344 : : u32 nlbl_sid, u32 nlbl_type,
345 : : u32 xfrm_sid,
346 : : u32 *peer_sid);
347 : :
348 : : int security_get_classes(struct selinux_state *state,
349 : : char ***classes, int *nclasses);
350 : : int security_get_permissions(struct selinux_state *state,
351 : : char *class, char ***perms, int *nperms);
352 : : int security_get_reject_unknown(struct selinux_state *state);
353 : : int security_get_allow_unknown(struct selinux_state *state);
354 : :
355 : : #define SECURITY_FS_USE_XATTR 1 /* use xattr */
356 : : #define SECURITY_FS_USE_TRANS 2 /* use transition SIDs, e.g. devpts/tmpfs */
357 : : #define SECURITY_FS_USE_TASK 3 /* use task SIDs, e.g. pipefs/sockfs */
358 : : #define SECURITY_FS_USE_GENFS 4 /* use the genfs support */
359 : : #define SECURITY_FS_USE_NONE 5 /* no labeling support */
360 : : #define SECURITY_FS_USE_MNTPOINT 6 /* use mountpoint labeling */
361 : : #define SECURITY_FS_USE_NATIVE 7 /* use native label support */
362 : : #define SECURITY_FS_USE_MAX 7 /* Highest SECURITY_FS_USE_XXX */
363 : :
364 : : int security_fs_use(struct selinux_state *state, struct super_block *sb);
365 : :
366 : : int security_genfs_sid(struct selinux_state *state,
367 : : const char *fstype, char *name, u16 sclass,
368 : : u32 *sid);
369 : :
370 : : #ifdef CONFIG_NETLABEL
371 : : int security_netlbl_secattr_to_sid(struct selinux_state *state,
372 : : struct netlbl_lsm_secattr *secattr,
373 : : u32 *sid);
374 : :
375 : : int security_netlbl_sid_to_secattr(struct selinux_state *state,
376 : : u32 sid,
377 : : struct netlbl_lsm_secattr *secattr);
378 : : #else
379 : : static inline int security_netlbl_secattr_to_sid(struct selinux_state *state,
380 : : struct netlbl_lsm_secattr *secattr,
381 : : u32 *sid)
382 : : {
383 : : return -EIDRM;
384 : : }
385 : :
386 : : static inline int security_netlbl_sid_to_secattr(struct selinux_state *state,
387 : : u32 sid,
388 : : struct netlbl_lsm_secattr *secattr)
389 : : {
390 : : return -ENOENT;
391 : : }
392 : : #endif /* CONFIG_NETLABEL */
393 : :
394 : : const char *security_get_initial_sid_context(u32 sid);
395 : :
396 : : /*
397 : : * status notifier using mmap interface
398 : : */
399 : : extern struct page *selinux_kernel_status_page(struct selinux_state *state);
400 : :
401 : : #define SELINUX_KERNEL_STATUS_VERSION 1
402 : : struct selinux_kernel_status {
403 : : u32 version; /* version number of thie structure */
404 : : u32 sequence; /* sequence number of seqlock logic */
405 : : u32 enforcing; /* current setting of enforcing mode */
406 : : u32 policyload; /* times of policy reloaded */
407 : : u32 deny_unknown; /* current setting of deny_unknown */
408 : : /*
409 : : * The version > 0 supports above members.
410 : : */
411 : : } __packed;
412 : :
413 : : extern void selinux_status_update_setenforce(struct selinux_state *state,
414 : : int enforcing);
415 : : extern void selinux_status_update_policyload(struct selinux_state *state,
416 : : int seqno);
417 : : extern void selinux_complete_init(void);
418 : : extern int selinux_disable(struct selinux_state *state);
419 : : extern void exit_sel_fs(void);
420 : : extern struct path selinux_null;
421 : : extern struct vfsmount *selinuxfs_mount;
422 : : extern void selnl_notify_setenforce(int val);
423 : : extern void selnl_notify_policyload(u32 seqno);
424 : : extern int selinux_nlmsg_lookup(u16 sclass, u16 nlmsg_type, u32 *perm);
425 : :
426 : : extern void avtab_cache_init(void);
427 : : extern void ebitmap_cache_init(void);
428 : : extern void hashtab_cache_init(void);
429 : : extern int security_sidtab_hash_stats(struct selinux_state *state, char *page);
430 : :
431 : : #endif /* _SELINUX_SECURITY_H_ */
|