1 // SPDX-License-Identifier: GPL-2.0-only
3 * Implementation of the security services.
5 * Authors : Stephen Smalley, <sds@tycho.nsa.gov>
6 * James Morris <jmorris@redhat.com>
8 * Updated: Trusted Computer Solutions, Inc. <dgoeddel@trustedcs.com>
10 * Support for enhanced MLS infrastructure.
11 * Support for context based audit filters.
13 * Updated: Frank Mayer <mayerf@tresys.com> and Karl MacMillan <kmacmillan@tresys.com>
15 * Added conditional policy language extensions
17 * Updated: Hewlett-Packard <paul@paul-moore.com>
19 * Added support for NetLabel
20 * Added support for the policy capability bitmap
22 * Updated: Chad Sellers <csellers@tresys.com>
24 * Added validation of kernel classes and permissions
26 * Updated: KaiGai Kohei <kaigai@ak.jp.nec.com>
28 * Added support for bounds domain and audit messaged on masked permissions
30 * Updated: Guido Trentalancia <guido@trentalancia.com>
32 * Added support for runtime switching of the policy type
34 * Copyright (C) 2008, 2009 NEC Corporation
35 * Copyright (C) 2006, 2007 Hewlett-Packard Development Company, L.P.
36 * Copyright (C) 2004-2006 Trusted Computer Solutions, Inc.
37 * Copyright (C) 2003 - 2004, 2006 Tresys Technology, LLC
38 * Copyright (C) 2003 Red Hat, Inc., James Morris <jmorris@redhat.com>
40 #include <linux/kernel.h>
41 #include <linux/slab.h>
42 #include <linux/string.h>
43 #include <linux/spinlock.h>
44 #include <linux/rcupdate.h>
45 #include <linux/errno.h>
47 #include <linux/sched.h>
48 #include <linux/audit.h>
49 #include <linux/mutex.h>
50 #include <linux/vmalloc.h>
51 #include <net/netlabel.h>
61 #include "conditional.h"
69 /* Policy capability names */
70 const char *selinux_policycap_names
[__POLICYDB_CAPABILITY_MAX
] = {
71 "network_peer_controls",
73 "extended_socket_class",
74 "always_check_network",
76 "nnp_nosuid_transition"
79 static struct selinux_ss selinux_ss
;
81 void selinux_ss_init(struct selinux_ss
**ss
)
83 rwlock_init(&selinux_ss
.policy_rwlock
);
84 mutex_init(&selinux_ss
.status_lock
);
88 /* Forward declaration. */
89 static int context_struct_to_string(struct policydb
*policydb
,
90 struct context
*context
,
94 static void context_struct_compute_av(struct policydb
*policydb
,
95 struct context
*scontext
,
96 struct context
*tcontext
,
98 struct av_decision
*avd
,
99 struct extended_perms
*xperms
);
101 static int selinux_set_mapping(struct policydb
*pol
,
102 struct security_class_mapping
*map
,
103 struct selinux_map
*out_map
)
107 bool print_unknown_handle
= false;
109 /* Find number of classes in the input mapping */
116 /* Allocate space for the class records, plus one for class zero */
117 out_map
->mapping
= kcalloc(++i
, sizeof(*out_map
->mapping
), GFP_ATOMIC
);
118 if (!out_map
->mapping
)
121 /* Store the raw class and permission values */
123 while (map
[j
].name
) {
124 struct security_class_mapping
*p_in
= map
+ (j
++);
125 struct selinux_mapping
*p_out
= out_map
->mapping
+ j
;
127 /* An empty class string skips ahead */
128 if (!strcmp(p_in
->name
, "")) {
129 p_out
->num_perms
= 0;
133 p_out
->value
= string_to_security_class(pol
, p_in
->name
);
135 pr_info("SELinux: Class %s not defined in policy.\n",
137 if (pol
->reject_unknown
)
139 p_out
->num_perms
= 0;
140 print_unknown_handle
= true;
145 while (p_in
->perms
[k
]) {
146 /* An empty permission string skips ahead */
147 if (!*p_in
->perms
[k
]) {
151 p_out
->perms
[k
] = string_to_av_perm(pol
, p_out
->value
,
153 if (!p_out
->perms
[k
]) {
154 pr_info("SELinux: Permission %s in class %s not defined in policy.\n",
155 p_in
->perms
[k
], p_in
->name
);
156 if (pol
->reject_unknown
)
158 print_unknown_handle
= true;
163 p_out
->num_perms
= k
;
166 if (print_unknown_handle
)
167 pr_info("SELinux: the above unknown classes and permissions will be %s\n",
168 pol
->allow_unknown
? "allowed" : "denied");
173 kfree(out_map
->mapping
);
174 out_map
->mapping
= NULL
;
179 * Get real, policy values from mapped values
182 static u16
unmap_class(struct selinux_map
*map
, u16 tclass
)
184 if (tclass
< map
->size
)
185 return map
->mapping
[tclass
].value
;
191 * Get kernel value for class from its policy value
193 static u16
map_class(struct selinux_map
*map
, u16 pol_value
)
197 for (i
= 1; i
< map
->size
; i
++) {
198 if (map
->mapping
[i
].value
== pol_value
)
202 return SECCLASS_NULL
;
205 static void map_decision(struct selinux_map
*map
,
206 u16 tclass
, struct av_decision
*avd
,
209 if (tclass
< map
->size
) {
210 struct selinux_mapping
*mapping
= &map
->mapping
[tclass
];
211 unsigned int i
, n
= mapping
->num_perms
;
214 for (i
= 0, result
= 0; i
< n
; i
++) {
215 if (avd
->allowed
& mapping
->perms
[i
])
217 if (allow_unknown
&& !mapping
->perms
[i
])
220 avd
->allowed
= result
;
222 for (i
= 0, result
= 0; i
< n
; i
++)
223 if (avd
->auditallow
& mapping
->perms
[i
])
225 avd
->auditallow
= result
;
227 for (i
= 0, result
= 0; i
< n
; i
++) {
228 if (avd
->auditdeny
& mapping
->perms
[i
])
230 if (!allow_unknown
&& !mapping
->perms
[i
])
234 * In case the kernel has a bug and requests a permission
235 * between num_perms and the maximum permission number, we
236 * should audit that denial
238 for (; i
< (sizeof(u32
)*8); i
++)
240 avd
->auditdeny
= result
;
244 int security_mls_enabled(struct selinux_state
*state
)
246 struct policydb
*p
= &state
->ss
->policydb
;
248 return p
->mls_enabled
;
252 * Return the boolean value of a constraint expression
253 * when it is applied to the specified source and target
256 * xcontext is a special beast... It is used by the validatetrans rules
257 * only. For these rules, scontext is the context before the transition,
258 * tcontext is the context after the transition, and xcontext is the context
259 * of the process performing the transition. All other callers of
260 * constraint_expr_eval should pass in NULL for xcontext.
262 static int constraint_expr_eval(struct policydb
*policydb
,
263 struct context
*scontext
,
264 struct context
*tcontext
,
265 struct context
*xcontext
,
266 struct constraint_expr
*cexpr
)
270 struct role_datum
*r1
, *r2
;
271 struct mls_level
*l1
, *l2
;
272 struct constraint_expr
*e
;
273 int s
[CEXPR_MAXDEPTH
];
276 for (e
= cexpr
; e
; e
= e
->next
) {
277 switch (e
->expr_type
) {
293 if (sp
== (CEXPR_MAXDEPTH
- 1))
297 val1
= scontext
->user
;
298 val2
= tcontext
->user
;
301 val1
= scontext
->type
;
302 val2
= tcontext
->type
;
305 val1
= scontext
->role
;
306 val2
= tcontext
->role
;
307 r1
= policydb
->role_val_to_struct
[val1
- 1];
308 r2
= policydb
->role_val_to_struct
[val2
- 1];
311 s
[++sp
] = ebitmap_get_bit(&r1
->dominates
,
315 s
[++sp
] = ebitmap_get_bit(&r2
->dominates
,
319 s
[++sp
] = (!ebitmap_get_bit(&r1
->dominates
,
321 !ebitmap_get_bit(&r2
->dominates
,
329 l1
= &(scontext
->range
.level
[0]);
330 l2
= &(tcontext
->range
.level
[0]);
333 l1
= &(scontext
->range
.level
[0]);
334 l2
= &(tcontext
->range
.level
[1]);
337 l1
= &(scontext
->range
.level
[1]);
338 l2
= &(tcontext
->range
.level
[0]);
341 l1
= &(scontext
->range
.level
[1]);
342 l2
= &(tcontext
->range
.level
[1]);
345 l1
= &(scontext
->range
.level
[0]);
346 l2
= &(scontext
->range
.level
[1]);
349 l1
= &(tcontext
->range
.level
[0]);
350 l2
= &(tcontext
->range
.level
[1]);
355 s
[++sp
] = mls_level_eq(l1
, l2
);
358 s
[++sp
] = !mls_level_eq(l1
, l2
);
361 s
[++sp
] = mls_level_dom(l1
, l2
);
364 s
[++sp
] = mls_level_dom(l2
, l1
);
367 s
[++sp
] = mls_level_incomp(l2
, l1
);
381 s
[++sp
] = (val1
== val2
);
384 s
[++sp
] = (val1
!= val2
);
392 if (sp
== (CEXPR_MAXDEPTH
-1))
395 if (e
->attr
& CEXPR_TARGET
)
397 else if (e
->attr
& CEXPR_XTARGET
) {
404 if (e
->attr
& CEXPR_USER
)
406 else if (e
->attr
& CEXPR_ROLE
)
408 else if (e
->attr
& CEXPR_TYPE
)
417 s
[++sp
] = ebitmap_get_bit(&e
->names
, val1
- 1);
420 s
[++sp
] = !ebitmap_get_bit(&e
->names
, val1
- 1);
438 * security_dump_masked_av - dumps masked permissions during
439 * security_compute_av due to RBAC, MLS/Constraint and Type bounds.
441 static int dump_masked_av_helper(void *k
, void *d
, void *args
)
443 struct perm_datum
*pdatum
= d
;
444 char **permission_names
= args
;
446 BUG_ON(pdatum
->value
< 1 || pdatum
->value
> 32);
448 permission_names
[pdatum
->value
- 1] = (char *)k
;
453 static void security_dump_masked_av(struct policydb
*policydb
,
454 struct context
*scontext
,
455 struct context
*tcontext
,
460 struct common_datum
*common_dat
;
461 struct class_datum
*tclass_dat
;
462 struct audit_buffer
*ab
;
464 char *scontext_name
= NULL
;
465 char *tcontext_name
= NULL
;
466 char *permission_names
[32];
469 bool need_comma
= false;
474 tclass_name
= sym_name(policydb
, SYM_CLASSES
, tclass
- 1);
475 tclass_dat
= policydb
->class_val_to_struct
[tclass
- 1];
476 common_dat
= tclass_dat
->comdatum
;
478 /* init permission_names */
480 hashtab_map(common_dat
->permissions
.table
,
481 dump_masked_av_helper
, permission_names
) < 0)
484 if (hashtab_map(tclass_dat
->permissions
.table
,
485 dump_masked_av_helper
, permission_names
) < 0)
488 /* get scontext/tcontext in text form */
489 if (context_struct_to_string(policydb
, scontext
,
490 &scontext_name
, &length
) < 0)
493 if (context_struct_to_string(policydb
, tcontext
,
494 &tcontext_name
, &length
) < 0)
497 /* audit a message */
498 ab
= audit_log_start(audit_context(),
499 GFP_ATOMIC
, AUDIT_SELINUX_ERR
);
503 audit_log_format(ab
, "op=security_compute_av reason=%s "
504 "scontext=%s tcontext=%s tclass=%s perms=",
505 reason
, scontext_name
, tcontext_name
, tclass_name
);
507 for (index
= 0; index
< 32; index
++) {
508 u32 mask
= (1 << index
);
510 if ((mask
& permissions
) == 0)
513 audit_log_format(ab
, "%s%s",
514 need_comma
? "," : "",
515 permission_names
[index
]
516 ? permission_names
[index
] : "????");
521 /* release scontext/tcontext */
522 kfree(tcontext_name
);
523 kfree(scontext_name
);
529 * security_boundary_permission - drops violated permissions
530 * on boundary constraint.
532 static void type_attribute_bounds_av(struct policydb
*policydb
,
533 struct context
*scontext
,
534 struct context
*tcontext
,
536 struct av_decision
*avd
)
538 struct context lo_scontext
;
539 struct context lo_tcontext
, *tcontextp
= tcontext
;
540 struct av_decision lo_avd
;
541 struct type_datum
*source
;
542 struct type_datum
*target
;
545 source
= policydb
->type_val_to_struct
[scontext
->type
- 1];
551 target
= policydb
->type_val_to_struct
[tcontext
->type
- 1];
554 memset(&lo_avd
, 0, sizeof(lo_avd
));
556 memcpy(&lo_scontext
, scontext
, sizeof(lo_scontext
));
557 lo_scontext
.type
= source
->bounds
;
559 if (target
->bounds
) {
560 memcpy(&lo_tcontext
, tcontext
, sizeof(lo_tcontext
));
561 lo_tcontext
.type
= target
->bounds
;
562 tcontextp
= &lo_tcontext
;
565 context_struct_compute_av(policydb
, &lo_scontext
,
571 masked
= ~lo_avd
.allowed
& avd
->allowed
;
574 return; /* no masked permission */
576 /* mask violated permissions */
577 avd
->allowed
&= ~masked
;
579 /* audit masked permissions */
580 security_dump_masked_av(policydb
, scontext
, tcontext
,
581 tclass
, masked
, "bounds");
585 * flag which drivers have permissions
586 * only looking for ioctl based extended permssions
588 void services_compute_xperms_drivers(
589 struct extended_perms
*xperms
,
590 struct avtab_node
*node
)
594 if (node
->datum
.u
.xperms
->specified
== AVTAB_XPERMS_IOCTLDRIVER
) {
595 /* if one or more driver has all permissions allowed */
596 for (i
= 0; i
< ARRAY_SIZE(xperms
->drivers
.p
); i
++)
597 xperms
->drivers
.p
[i
] |= node
->datum
.u
.xperms
->perms
.p
[i
];
598 } else if (node
->datum
.u
.xperms
->specified
== AVTAB_XPERMS_IOCTLFUNCTION
) {
599 /* if allowing permissions within a driver */
600 security_xperm_set(xperms
->drivers
.p
,
601 node
->datum
.u
.xperms
->driver
);
604 /* If no ioctl commands are allowed, ignore auditallow and auditdeny */
605 if (node
->key
.specified
& AVTAB_XPERMS_ALLOWED
)
610 * Compute access vectors and extended permissions based on a context
611 * structure pair for the permissions in a particular class.
613 static void context_struct_compute_av(struct policydb
*policydb
,
614 struct context
*scontext
,
615 struct context
*tcontext
,
617 struct av_decision
*avd
,
618 struct extended_perms
*xperms
)
620 struct constraint_node
*constraint
;
621 struct role_allow
*ra
;
622 struct avtab_key avkey
;
623 struct avtab_node
*node
;
624 struct class_datum
*tclass_datum
;
625 struct ebitmap
*sattr
, *tattr
;
626 struct ebitmap_node
*snode
, *tnode
;
631 avd
->auditdeny
= 0xffffffff;
633 memset(&xperms
->drivers
, 0, sizeof(xperms
->drivers
));
637 if (unlikely(!tclass
|| tclass
> policydb
->p_classes
.nprim
)) {
638 if (printk_ratelimit())
639 pr_warn("SELinux: Invalid class %hu\n", tclass
);
643 tclass_datum
= policydb
->class_val_to_struct
[tclass
- 1];
646 * If a specific type enforcement rule was defined for
647 * this permission check, then use it.
649 avkey
.target_class
= tclass
;
650 avkey
.specified
= AVTAB_AV
| AVTAB_XPERMS
;
651 sattr
= &policydb
->type_attr_map_array
[scontext
->type
- 1];
652 tattr
= &policydb
->type_attr_map_array
[tcontext
->type
- 1];
653 ebitmap_for_each_positive_bit(sattr
, snode
, i
) {
654 ebitmap_for_each_positive_bit(tattr
, tnode
, j
) {
655 avkey
.source_type
= i
+ 1;
656 avkey
.target_type
= j
+ 1;
657 for (node
= avtab_search_node(&policydb
->te_avtab
,
660 node
= avtab_search_node_next(node
, avkey
.specified
)) {
661 if (node
->key
.specified
== AVTAB_ALLOWED
)
662 avd
->allowed
|= node
->datum
.u
.data
;
663 else if (node
->key
.specified
== AVTAB_AUDITALLOW
)
664 avd
->auditallow
|= node
->datum
.u
.data
;
665 else if (node
->key
.specified
== AVTAB_AUDITDENY
)
666 avd
->auditdeny
&= node
->datum
.u
.data
;
667 else if (xperms
&& (node
->key
.specified
& AVTAB_XPERMS
))
668 services_compute_xperms_drivers(xperms
, node
);
671 /* Check conditional av table for additional permissions */
672 cond_compute_av(&policydb
->te_cond_avtab
, &avkey
,
679 * Remove any permissions prohibited by a constraint (this includes
682 constraint
= tclass_datum
->constraints
;
684 if ((constraint
->permissions
& (avd
->allowed
)) &&
685 !constraint_expr_eval(policydb
, scontext
, tcontext
, NULL
,
687 avd
->allowed
&= ~(constraint
->permissions
);
689 constraint
= constraint
->next
;
693 * If checking process transition permission and the
694 * role is changing, then check the (current_role, new_role)
697 if (tclass
== policydb
->process_class
&&
698 (avd
->allowed
& policydb
->process_trans_perms
) &&
699 scontext
->role
!= tcontext
->role
) {
700 for (ra
= policydb
->role_allow
; ra
; ra
= ra
->next
) {
701 if (scontext
->role
== ra
->role
&&
702 tcontext
->role
== ra
->new_role
)
706 avd
->allowed
&= ~policydb
->process_trans_perms
;
710 * If the given source and target types have boundary
711 * constraint, lazy checks have to mask any violated
712 * permission and notice it to userspace via audit.
714 type_attribute_bounds_av(policydb
, scontext
, tcontext
,
718 static int security_validtrans_handle_fail(struct selinux_state
*state
,
719 struct context
*ocontext
,
720 struct context
*ncontext
,
721 struct context
*tcontext
,
724 struct policydb
*p
= &state
->ss
->policydb
;
725 char *o
= NULL
, *n
= NULL
, *t
= NULL
;
726 u32 olen
, nlen
, tlen
;
728 if (context_struct_to_string(p
, ocontext
, &o
, &olen
))
730 if (context_struct_to_string(p
, ncontext
, &n
, &nlen
))
732 if (context_struct_to_string(p
, tcontext
, &t
, &tlen
))
734 audit_log(audit_context(), GFP_ATOMIC
, AUDIT_SELINUX_ERR
,
735 "op=security_validate_transition seresult=denied"
736 " oldcontext=%s newcontext=%s taskcontext=%s tclass=%s",
737 o
, n
, t
, sym_name(p
, SYM_CLASSES
, tclass
-1));
743 if (!enforcing_enabled(state
))
748 static int security_compute_validatetrans(struct selinux_state
*state
,
749 u32 oldsid
, u32 newsid
, u32 tasksid
,
750 u16 orig_tclass
, bool user
)
752 struct policydb
*policydb
;
753 struct sidtab
*sidtab
;
754 struct context
*ocontext
;
755 struct context
*ncontext
;
756 struct context
*tcontext
;
757 struct class_datum
*tclass_datum
;
758 struct constraint_node
*constraint
;
763 if (!state
->initialized
)
766 read_lock(&state
->ss
->policy_rwlock
);
768 policydb
= &state
->ss
->policydb
;
769 sidtab
= state
->ss
->sidtab
;
772 tclass
= unmap_class(&state
->ss
->map
, orig_tclass
);
774 tclass
= orig_tclass
;
776 if (!tclass
|| tclass
> policydb
->p_classes
.nprim
) {
780 tclass_datum
= policydb
->class_val_to_struct
[tclass
- 1];
782 ocontext
= sidtab_search(sidtab
, oldsid
);
784 pr_err("SELinux: %s: unrecognized SID %d\n",
790 ncontext
= sidtab_search(sidtab
, newsid
);
792 pr_err("SELinux: %s: unrecognized SID %d\n",
798 tcontext
= sidtab_search(sidtab
, tasksid
);
800 pr_err("SELinux: %s: unrecognized SID %d\n",
806 constraint
= tclass_datum
->validatetrans
;
808 if (!constraint_expr_eval(policydb
, ocontext
, ncontext
,
809 tcontext
, constraint
->expr
)) {
813 rc
= security_validtrans_handle_fail(state
,
820 constraint
= constraint
->next
;
824 read_unlock(&state
->ss
->policy_rwlock
);
828 int security_validate_transition_user(struct selinux_state
*state
,
829 u32 oldsid
, u32 newsid
, u32 tasksid
,
832 return security_compute_validatetrans(state
, oldsid
, newsid
, tasksid
,
836 int security_validate_transition(struct selinux_state
*state
,
837 u32 oldsid
, u32 newsid
, u32 tasksid
,
840 return security_compute_validatetrans(state
, oldsid
, newsid
, tasksid
,
845 * security_bounded_transition - check whether the given
846 * transition is directed to bounded, or not.
847 * It returns 0, if @newsid is bounded by @oldsid.
848 * Otherwise, it returns error code.
850 * @oldsid : current security identifier
851 * @newsid : destinated security identifier
853 int security_bounded_transition(struct selinux_state
*state
,
854 u32 old_sid
, u32 new_sid
)
856 struct policydb
*policydb
;
857 struct sidtab
*sidtab
;
858 struct context
*old_context
, *new_context
;
859 struct type_datum
*type
;
863 if (!state
->initialized
)
866 read_lock(&state
->ss
->policy_rwlock
);
868 policydb
= &state
->ss
->policydb
;
869 sidtab
= state
->ss
->sidtab
;
872 old_context
= sidtab_search(sidtab
, old_sid
);
874 pr_err("SELinux: %s: unrecognized SID %u\n",
880 new_context
= sidtab_search(sidtab
, new_sid
);
882 pr_err("SELinux: %s: unrecognized SID %u\n",
888 /* type/domain unchanged */
889 if (old_context
->type
== new_context
->type
)
892 index
= new_context
->type
;
894 type
= policydb
->type_val_to_struct
[index
- 1];
897 /* not bounded anymore */
902 /* @newsid is bounded by @oldsid */
904 if (type
->bounds
== old_context
->type
)
907 index
= type
->bounds
;
911 char *old_name
= NULL
;
912 char *new_name
= NULL
;
915 if (!context_struct_to_string(policydb
, old_context
,
916 &old_name
, &length
) &&
917 !context_struct_to_string(policydb
, new_context
,
918 &new_name
, &length
)) {
919 audit_log(audit_context(),
920 GFP_ATOMIC
, AUDIT_SELINUX_ERR
,
921 "op=security_bounded_transition "
923 "oldcontext=%s newcontext=%s",
930 read_unlock(&state
->ss
->policy_rwlock
);
935 static void avd_init(struct selinux_state
*state
, struct av_decision
*avd
)
939 avd
->auditdeny
= 0xffffffff;
940 avd
->seqno
= state
->ss
->latest_granting
;
944 void services_compute_xperms_decision(struct extended_perms_decision
*xpermd
,
945 struct avtab_node
*node
)
949 if (node
->datum
.u
.xperms
->specified
== AVTAB_XPERMS_IOCTLFUNCTION
) {
950 if (xpermd
->driver
!= node
->datum
.u
.xperms
->driver
)
952 } else if (node
->datum
.u
.xperms
->specified
== AVTAB_XPERMS_IOCTLDRIVER
) {
953 if (!security_xperm_test(node
->datum
.u
.xperms
->perms
.p
,
960 if (node
->key
.specified
== AVTAB_XPERMS_ALLOWED
) {
961 xpermd
->used
|= XPERMS_ALLOWED
;
962 if (node
->datum
.u
.xperms
->specified
== AVTAB_XPERMS_IOCTLDRIVER
) {
963 memset(xpermd
->allowed
->p
, 0xff,
964 sizeof(xpermd
->allowed
->p
));
966 if (node
->datum
.u
.xperms
->specified
== AVTAB_XPERMS_IOCTLFUNCTION
) {
967 for (i
= 0; i
< ARRAY_SIZE(xpermd
->allowed
->p
); i
++)
968 xpermd
->allowed
->p
[i
] |=
969 node
->datum
.u
.xperms
->perms
.p
[i
];
971 } else if (node
->key
.specified
== AVTAB_XPERMS_AUDITALLOW
) {
972 xpermd
->used
|= XPERMS_AUDITALLOW
;
973 if (node
->datum
.u
.xperms
->specified
== AVTAB_XPERMS_IOCTLDRIVER
) {
974 memset(xpermd
->auditallow
->p
, 0xff,
975 sizeof(xpermd
->auditallow
->p
));
977 if (node
->datum
.u
.xperms
->specified
== AVTAB_XPERMS_IOCTLFUNCTION
) {
978 for (i
= 0; i
< ARRAY_SIZE(xpermd
->auditallow
->p
); i
++)
979 xpermd
->auditallow
->p
[i
] |=
980 node
->datum
.u
.xperms
->perms
.p
[i
];
982 } else if (node
->key
.specified
== AVTAB_XPERMS_DONTAUDIT
) {
983 xpermd
->used
|= XPERMS_DONTAUDIT
;
984 if (node
->datum
.u
.xperms
->specified
== AVTAB_XPERMS_IOCTLDRIVER
) {
985 memset(xpermd
->dontaudit
->p
, 0xff,
986 sizeof(xpermd
->dontaudit
->p
));
988 if (node
->datum
.u
.xperms
->specified
== AVTAB_XPERMS_IOCTLFUNCTION
) {
989 for (i
= 0; i
< ARRAY_SIZE(xpermd
->dontaudit
->p
); i
++)
990 xpermd
->dontaudit
->p
[i
] |=
991 node
->datum
.u
.xperms
->perms
.p
[i
];
998 void security_compute_xperms_decision(struct selinux_state
*state
,
1003 struct extended_perms_decision
*xpermd
)
1005 struct policydb
*policydb
;
1006 struct sidtab
*sidtab
;
1008 struct context
*scontext
, *tcontext
;
1009 struct avtab_key avkey
;
1010 struct avtab_node
*node
;
1011 struct ebitmap
*sattr
, *tattr
;
1012 struct ebitmap_node
*snode
, *tnode
;
1015 xpermd
->driver
= driver
;
1017 memset(xpermd
->allowed
->p
, 0, sizeof(xpermd
->allowed
->p
));
1018 memset(xpermd
->auditallow
->p
, 0, sizeof(xpermd
->auditallow
->p
));
1019 memset(xpermd
->dontaudit
->p
, 0, sizeof(xpermd
->dontaudit
->p
));
1021 read_lock(&state
->ss
->policy_rwlock
);
1022 if (!state
->initialized
)
1025 policydb
= &state
->ss
->policydb
;
1026 sidtab
= state
->ss
->sidtab
;
1028 scontext
= sidtab_search(sidtab
, ssid
);
1030 pr_err("SELinux: %s: unrecognized SID %d\n",
1035 tcontext
= sidtab_search(sidtab
, tsid
);
1037 pr_err("SELinux: %s: unrecognized SID %d\n",
1042 tclass
= unmap_class(&state
->ss
->map
, orig_tclass
);
1043 if (unlikely(orig_tclass
&& !tclass
)) {
1044 if (policydb
->allow_unknown
)
1050 if (unlikely(!tclass
|| tclass
> policydb
->p_classes
.nprim
)) {
1051 pr_warn_ratelimited("SELinux: Invalid class %hu\n", tclass
);
1055 avkey
.target_class
= tclass
;
1056 avkey
.specified
= AVTAB_XPERMS
;
1057 sattr
= &policydb
->type_attr_map_array
[scontext
->type
- 1];
1058 tattr
= &policydb
->type_attr_map_array
[tcontext
->type
- 1];
1059 ebitmap_for_each_positive_bit(sattr
, snode
, i
) {
1060 ebitmap_for_each_positive_bit(tattr
, tnode
, j
) {
1061 avkey
.source_type
= i
+ 1;
1062 avkey
.target_type
= j
+ 1;
1063 for (node
= avtab_search_node(&policydb
->te_avtab
,
1066 node
= avtab_search_node_next(node
, avkey
.specified
))
1067 services_compute_xperms_decision(xpermd
, node
);
1069 cond_compute_xperms(&policydb
->te_cond_avtab
,
1074 read_unlock(&state
->ss
->policy_rwlock
);
1077 memset(xpermd
->allowed
->p
, 0xff, sizeof(xpermd
->allowed
->p
));
1082 * security_compute_av - Compute access vector decisions.
1083 * @ssid: source security identifier
1084 * @tsid: target security identifier
1085 * @tclass: target security class
1086 * @avd: access vector decisions
1087 * @xperms: extended permissions
1089 * Compute a set of access vector decisions based on the
1090 * SID pair (@ssid, @tsid) for the permissions in @tclass.
1092 void security_compute_av(struct selinux_state
*state
,
1096 struct av_decision
*avd
,
1097 struct extended_perms
*xperms
)
1099 struct policydb
*policydb
;
1100 struct sidtab
*sidtab
;
1102 struct context
*scontext
= NULL
, *tcontext
= NULL
;
1104 read_lock(&state
->ss
->policy_rwlock
);
1105 avd_init(state
, avd
);
1107 if (!state
->initialized
)
1110 policydb
= &state
->ss
->policydb
;
1111 sidtab
= state
->ss
->sidtab
;
1113 scontext
= sidtab_search(sidtab
, ssid
);
1115 pr_err("SELinux: %s: unrecognized SID %d\n",
1120 /* permissive domain? */
1121 if (ebitmap_get_bit(&policydb
->permissive_map
, scontext
->type
))
1122 avd
->flags
|= AVD_FLAGS_PERMISSIVE
;
1124 tcontext
= sidtab_search(sidtab
, tsid
);
1126 pr_err("SELinux: %s: unrecognized SID %d\n",
1131 tclass
= unmap_class(&state
->ss
->map
, orig_tclass
);
1132 if (unlikely(orig_tclass
&& !tclass
)) {
1133 if (policydb
->allow_unknown
)
1137 context_struct_compute_av(policydb
, scontext
, tcontext
, tclass
, avd
,
1139 map_decision(&state
->ss
->map
, orig_tclass
, avd
,
1140 policydb
->allow_unknown
);
1142 read_unlock(&state
->ss
->policy_rwlock
);
1145 avd
->allowed
= 0xffffffff;
1149 void security_compute_av_user(struct selinux_state
*state
,
1153 struct av_decision
*avd
)
1155 struct policydb
*policydb
;
1156 struct sidtab
*sidtab
;
1157 struct context
*scontext
= NULL
, *tcontext
= NULL
;
1159 read_lock(&state
->ss
->policy_rwlock
);
1160 avd_init(state
, avd
);
1161 if (!state
->initialized
)
1164 policydb
= &state
->ss
->policydb
;
1165 sidtab
= state
->ss
->sidtab
;
1167 scontext
= sidtab_search(sidtab
, ssid
);
1169 pr_err("SELinux: %s: unrecognized SID %d\n",
1174 /* permissive domain? */
1175 if (ebitmap_get_bit(&policydb
->permissive_map
, scontext
->type
))
1176 avd
->flags
|= AVD_FLAGS_PERMISSIVE
;
1178 tcontext
= sidtab_search(sidtab
, tsid
);
1180 pr_err("SELinux: %s: unrecognized SID %d\n",
1185 if (unlikely(!tclass
)) {
1186 if (policydb
->allow_unknown
)
1191 context_struct_compute_av(policydb
, scontext
, tcontext
, tclass
, avd
,
1194 read_unlock(&state
->ss
->policy_rwlock
);
1197 avd
->allowed
= 0xffffffff;
1202 * Write the security context string representation of
1203 * the context structure `context' into a dynamically
1204 * allocated string of the correct size. Set `*scontext'
1205 * to point to this string and set `*scontext_len' to
1206 * the length of the string.
1208 static int context_struct_to_string(struct policydb
*p
,
1209 struct context
*context
,
1210 char **scontext
, u32
*scontext_len
)
1219 *scontext_len
= context
->len
;
1221 *scontext
= kstrdup(context
->str
, GFP_ATOMIC
);
1228 /* Compute the size of the context. */
1229 *scontext_len
+= strlen(sym_name(p
, SYM_USERS
, context
->user
- 1)) + 1;
1230 *scontext_len
+= strlen(sym_name(p
, SYM_ROLES
, context
->role
- 1)) + 1;
1231 *scontext_len
+= strlen(sym_name(p
, SYM_TYPES
, context
->type
- 1)) + 1;
1232 *scontext_len
+= mls_compute_context_len(p
, context
);
1237 /* Allocate space for the context; caller must free this space. */
1238 scontextp
= kmalloc(*scontext_len
, GFP_ATOMIC
);
1241 *scontext
= scontextp
;
1244 * Copy the user name, role name and type name into the context.
1246 scontextp
+= sprintf(scontextp
, "%s:%s:%s",
1247 sym_name(p
, SYM_USERS
, context
->user
- 1),
1248 sym_name(p
, SYM_ROLES
, context
->role
- 1),
1249 sym_name(p
, SYM_TYPES
, context
->type
- 1));
1251 mls_sid_to_context(p
, context
, &scontextp
);
1258 #include "initial_sid_to_string.h"
1260 const char *security_get_initial_sid_context(u32 sid
)
1262 if (unlikely(sid
> SECINITSID_NUM
))
1264 return initial_sid_to_string
[sid
];
1267 static int security_sid_to_context_core(struct selinux_state
*state
,
1268 u32 sid
, char **scontext
,
1269 u32
*scontext_len
, int force
,
1272 struct policydb
*policydb
;
1273 struct sidtab
*sidtab
;
1274 struct context
*context
;
1281 if (!state
->initialized
) {
1282 if (sid
<= SECINITSID_NUM
) {
1285 *scontext_len
= strlen(initial_sid_to_string
[sid
]) + 1;
1288 scontextp
= kmemdup(initial_sid_to_string
[sid
],
1289 *scontext_len
, GFP_ATOMIC
);
1294 *scontext
= scontextp
;
1297 pr_err("SELinux: %s: called before initial "
1298 "load_policy on unknown SID %d\n", __func__
, sid
);
1302 read_lock(&state
->ss
->policy_rwlock
);
1303 policydb
= &state
->ss
->policydb
;
1304 sidtab
= state
->ss
->sidtab
;
1306 context
= sidtab_search_force(sidtab
, sid
);
1308 context
= sidtab_search(sidtab
, sid
);
1310 pr_err("SELinux: %s: unrecognized SID %d\n",
1315 if (only_invalid
&& !context
->len
)
1318 rc
= context_struct_to_string(policydb
, context
, scontext
,
1321 read_unlock(&state
->ss
->policy_rwlock
);
1328 * security_sid_to_context - Obtain a context for a given SID.
1329 * @sid: security identifier, SID
1330 * @scontext: security context
1331 * @scontext_len: length in bytes
1333 * Write the string representation of the context associated with @sid
1334 * into a dynamically allocated string of the correct size. Set @scontext
1335 * to point to this string and set @scontext_len to the length of the string.
1337 int security_sid_to_context(struct selinux_state
*state
,
1338 u32 sid
, char **scontext
, u32
*scontext_len
)
1340 return security_sid_to_context_core(state
, sid
, scontext
,
1341 scontext_len
, 0, 0);
1344 int security_sid_to_context_force(struct selinux_state
*state
, u32 sid
,
1345 char **scontext
, u32
*scontext_len
)
1347 return security_sid_to_context_core(state
, sid
, scontext
,
1348 scontext_len
, 1, 0);
1352 * security_sid_to_context_inval - Obtain a context for a given SID if it
1354 * @sid: security identifier, SID
1355 * @scontext: security context
1356 * @scontext_len: length in bytes
1358 * Write the string representation of the context associated with @sid
1359 * into a dynamically allocated string of the correct size, but only if the
1360 * context is invalid in the current policy. Set @scontext to point to
1361 * this string (or NULL if the context is valid) and set @scontext_len to
1362 * the length of the string (or 0 if the context is valid).
1364 int security_sid_to_context_inval(struct selinux_state
*state
, u32 sid
,
1365 char **scontext
, u32
*scontext_len
)
1367 return security_sid_to_context_core(state
, sid
, scontext
,
1368 scontext_len
, 1, 1);
1372 * Caveat: Mutates scontext.
1374 static int string_to_context_struct(struct policydb
*pol
,
1375 struct sidtab
*sidtabp
,
1377 struct context
*ctx
,
1380 struct role_datum
*role
;
1381 struct type_datum
*typdatum
;
1382 struct user_datum
*usrdatum
;
1383 char *scontextp
, *p
, oldc
;
1388 /* Parse the security context. */
1391 scontextp
= (char *) scontext
;
1393 /* Extract the user. */
1395 while (*p
&& *p
!= ':')
1403 usrdatum
= hashtab_search(pol
->p_users
.table
, scontextp
);
1407 ctx
->user
= usrdatum
->value
;
1411 while (*p
&& *p
!= ':')
1419 role
= hashtab_search(pol
->p_roles
.table
, scontextp
);
1422 ctx
->role
= role
->value
;
1426 while (*p
&& *p
!= ':')
1431 typdatum
= hashtab_search(pol
->p_types
.table
, scontextp
);
1432 if (!typdatum
|| typdatum
->attribute
)
1435 ctx
->type
= typdatum
->value
;
1437 rc
= mls_context_to_sid(pol
, oldc
, p
, ctx
, sidtabp
, def_sid
);
1441 /* Check the validity of the new context. */
1443 if (!policydb_context_isvalid(pol
, ctx
))
1448 context_destroy(ctx
);
1452 static int security_context_to_sid_core(struct selinux_state
*state
,
1453 const char *scontext
, u32 scontext_len
,
1454 u32
*sid
, u32 def_sid
, gfp_t gfp_flags
,
1457 struct policydb
*policydb
;
1458 struct sidtab
*sidtab
;
1459 char *scontext2
, *str
= NULL
;
1460 struct context context
;
1463 /* An empty security context is never valid. */
1467 /* Copy the string to allow changes and ensure a NUL terminator */
1468 scontext2
= kmemdup_nul(scontext
, scontext_len
, gfp_flags
);
1472 if (!state
->initialized
) {
1475 for (i
= 1; i
< SECINITSID_NUM
; i
++) {
1476 if (!strcmp(initial_sid_to_string
[i
], scontext2
)) {
1481 *sid
= SECINITSID_KERNEL
;
1487 /* Save another copy for storing in uninterpreted form */
1489 str
= kstrdup(scontext2
, gfp_flags
);
1493 read_lock(&state
->ss
->policy_rwlock
);
1494 policydb
= &state
->ss
->policydb
;
1495 sidtab
= state
->ss
->sidtab
;
1496 rc
= string_to_context_struct(policydb
, sidtab
, scontext2
,
1498 if (rc
== -EINVAL
&& force
) {
1500 context
.len
= strlen(str
) + 1;
1504 rc
= sidtab_context_to_sid(sidtab
, &context
, sid
);
1505 context_destroy(&context
);
1507 read_unlock(&state
->ss
->policy_rwlock
);
1515 * security_context_to_sid - Obtain a SID for a given security context.
1516 * @scontext: security context
1517 * @scontext_len: length in bytes
1518 * @sid: security identifier, SID
1519 * @gfp: context for the allocation
1521 * Obtains a SID associated with the security context that
1522 * has the string representation specified by @scontext.
1523 * Returns -%EINVAL if the context is invalid, -%ENOMEM if insufficient
1524 * memory is available, or 0 on success.
1526 int security_context_to_sid(struct selinux_state
*state
,
1527 const char *scontext
, u32 scontext_len
, u32
*sid
,
1530 return security_context_to_sid_core(state
, scontext
, scontext_len
,
1531 sid
, SECSID_NULL
, gfp
, 0);
1534 int security_context_str_to_sid(struct selinux_state
*state
,
1535 const char *scontext
, u32
*sid
, gfp_t gfp
)
1537 return security_context_to_sid(state
, scontext
, strlen(scontext
),
1542 * security_context_to_sid_default - Obtain a SID for a given security context,
1543 * falling back to specified default if needed.
1545 * @scontext: security context
1546 * @scontext_len: length in bytes
1547 * @sid: security identifier, SID
1548 * @def_sid: default SID to assign on error
1550 * Obtains a SID associated with the security context that
1551 * has the string representation specified by @scontext.
1552 * The default SID is passed to the MLS layer to be used to allow
1553 * kernel labeling of the MLS field if the MLS field is not present
1554 * (for upgrading to MLS without full relabel).
1555 * Implicitly forces adding of the context even if it cannot be mapped yet.
1556 * Returns -%EINVAL if the context is invalid, -%ENOMEM if insufficient
1557 * memory is available, or 0 on success.
1559 int security_context_to_sid_default(struct selinux_state
*state
,
1560 const char *scontext
, u32 scontext_len
,
1561 u32
*sid
, u32 def_sid
, gfp_t gfp_flags
)
1563 return security_context_to_sid_core(state
, scontext
, scontext_len
,
1564 sid
, def_sid
, gfp_flags
, 1);
1567 int security_context_to_sid_force(struct selinux_state
*state
,
1568 const char *scontext
, u32 scontext_len
,
1571 return security_context_to_sid_core(state
, scontext
, scontext_len
,
1572 sid
, SECSID_NULL
, GFP_KERNEL
, 1);
1575 static int compute_sid_handle_invalid_context(
1576 struct selinux_state
*state
,
1577 struct context
*scontext
,
1578 struct context
*tcontext
,
1580 struct context
*newcontext
)
1582 struct policydb
*policydb
= &state
->ss
->policydb
;
1583 char *s
= NULL
, *t
= NULL
, *n
= NULL
;
1584 u32 slen
, tlen
, nlen
;
1585 struct audit_buffer
*ab
;
1587 if (context_struct_to_string(policydb
, scontext
, &s
, &slen
))
1589 if (context_struct_to_string(policydb
, tcontext
, &t
, &tlen
))
1591 if (context_struct_to_string(policydb
, newcontext
, &n
, &nlen
))
1593 ab
= audit_log_start(audit_context(), GFP_ATOMIC
, AUDIT_SELINUX_ERR
);
1594 audit_log_format(ab
,
1595 "op=security_compute_sid invalid_context=");
1596 /* no need to record the NUL with untrusted strings */
1597 audit_log_n_untrustedstring(ab
, n
, nlen
- 1);
1598 audit_log_format(ab
, " scontext=%s tcontext=%s tclass=%s",
1599 s
, t
, sym_name(policydb
, SYM_CLASSES
, tclass
-1));
1605 if (!enforcing_enabled(state
))
1610 static void filename_compute_type(struct policydb
*policydb
,
1611 struct context
*newcontext
,
1612 u32 stype
, u32 ttype
, u16 tclass
,
1613 const char *objname
)
1615 struct filename_trans ft
;
1616 struct filename_trans_datum
*otype
;
1619 * Most filename trans rules are going to live in specific directories
1620 * like /dev or /var/run. This bitmap will quickly skip rule searches
1621 * if the ttype does not contain any rules.
1623 if (!ebitmap_get_bit(&policydb
->filename_trans_ttypes
, ttype
))
1631 otype
= hashtab_search(policydb
->filename_trans
, &ft
);
1633 newcontext
->type
= otype
->otype
;
1636 static int security_compute_sid(struct selinux_state
*state
,
1641 const char *objname
,
1645 struct policydb
*policydb
;
1646 struct sidtab
*sidtab
;
1647 struct class_datum
*cladatum
= NULL
;
1648 struct context
*scontext
= NULL
, *tcontext
= NULL
, newcontext
;
1649 struct role_trans
*roletr
= NULL
;
1650 struct avtab_key avkey
;
1651 struct avtab_datum
*avdatum
;
1652 struct avtab_node
*node
;
1657 if (!state
->initialized
) {
1658 switch (orig_tclass
) {
1659 case SECCLASS_PROCESS
: /* kernel value */
1669 context_init(&newcontext
);
1671 read_lock(&state
->ss
->policy_rwlock
);
1674 tclass
= unmap_class(&state
->ss
->map
, orig_tclass
);
1675 sock
= security_is_socket_class(orig_tclass
);
1677 tclass
= orig_tclass
;
1678 sock
= security_is_socket_class(map_class(&state
->ss
->map
,
1682 policydb
= &state
->ss
->policydb
;
1683 sidtab
= state
->ss
->sidtab
;
1685 scontext
= sidtab_search(sidtab
, ssid
);
1687 pr_err("SELinux: %s: unrecognized SID %d\n",
1692 tcontext
= sidtab_search(sidtab
, tsid
);
1694 pr_err("SELinux: %s: unrecognized SID %d\n",
1700 if (tclass
&& tclass
<= policydb
->p_classes
.nprim
)
1701 cladatum
= policydb
->class_val_to_struct
[tclass
- 1];
1703 /* Set the user identity. */
1704 switch (specified
) {
1705 case AVTAB_TRANSITION
:
1707 if (cladatum
&& cladatum
->default_user
== DEFAULT_TARGET
) {
1708 newcontext
.user
= tcontext
->user
;
1710 /* notice this gets both DEFAULT_SOURCE and unset */
1711 /* Use the process user identity. */
1712 newcontext
.user
= scontext
->user
;
1716 /* Use the related object owner. */
1717 newcontext
.user
= tcontext
->user
;
1721 /* Set the role to default values. */
1722 if (cladatum
&& cladatum
->default_role
== DEFAULT_SOURCE
) {
1723 newcontext
.role
= scontext
->role
;
1724 } else if (cladatum
&& cladatum
->default_role
== DEFAULT_TARGET
) {
1725 newcontext
.role
= tcontext
->role
;
1727 if ((tclass
== policydb
->process_class
) || (sock
== true))
1728 newcontext
.role
= scontext
->role
;
1730 newcontext
.role
= OBJECT_R_VAL
;
1733 /* Set the type to default values. */
1734 if (cladatum
&& cladatum
->default_type
== DEFAULT_SOURCE
) {
1735 newcontext
.type
= scontext
->type
;
1736 } else if (cladatum
&& cladatum
->default_type
== DEFAULT_TARGET
) {
1737 newcontext
.type
= tcontext
->type
;
1739 if ((tclass
== policydb
->process_class
) || (sock
== true)) {
1740 /* Use the type of process. */
1741 newcontext
.type
= scontext
->type
;
1743 /* Use the type of the related object. */
1744 newcontext
.type
= tcontext
->type
;
1748 /* Look for a type transition/member/change rule. */
1749 avkey
.source_type
= scontext
->type
;
1750 avkey
.target_type
= tcontext
->type
;
1751 avkey
.target_class
= tclass
;
1752 avkey
.specified
= specified
;
1753 avdatum
= avtab_search(&policydb
->te_avtab
, &avkey
);
1755 /* If no permanent rule, also check for enabled conditional rules */
1757 node
= avtab_search_node(&policydb
->te_cond_avtab
, &avkey
);
1758 for (; node
; node
= avtab_search_node_next(node
, specified
)) {
1759 if (node
->key
.specified
& AVTAB_ENABLED
) {
1760 avdatum
= &node
->datum
;
1767 /* Use the type from the type transition/member/change rule. */
1768 newcontext
.type
= avdatum
->u
.data
;
1771 /* if we have a objname this is a file trans check so check those rules */
1773 filename_compute_type(policydb
, &newcontext
, scontext
->type
,
1774 tcontext
->type
, tclass
, objname
);
1776 /* Check for class-specific changes. */
1777 if (specified
& AVTAB_TRANSITION
) {
1778 /* Look for a role transition rule. */
1779 for (roletr
= policydb
->role_tr
; roletr
;
1780 roletr
= roletr
->next
) {
1781 if ((roletr
->role
== scontext
->role
) &&
1782 (roletr
->type
== tcontext
->type
) &&
1783 (roletr
->tclass
== tclass
)) {
1784 /* Use the role transition rule. */
1785 newcontext
.role
= roletr
->new_role
;
1791 /* Set the MLS attributes.
1792 This is done last because it may allocate memory. */
1793 rc
= mls_compute_sid(policydb
, scontext
, tcontext
, tclass
, specified
,
1798 /* Check the validity of the context. */
1799 if (!policydb_context_isvalid(policydb
, &newcontext
)) {
1800 rc
= compute_sid_handle_invalid_context(state
, scontext
,
1807 /* Obtain the sid for the context. */
1808 rc
= sidtab_context_to_sid(sidtab
, &newcontext
, out_sid
);
1810 read_unlock(&state
->ss
->policy_rwlock
);
1811 context_destroy(&newcontext
);
1817 * security_transition_sid - Compute the SID for a new subject/object.
1818 * @ssid: source security identifier
1819 * @tsid: target security identifier
1820 * @tclass: target security class
1821 * @out_sid: security identifier for new subject/object
1823 * Compute a SID to use for labeling a new subject or object in the
1824 * class @tclass based on a SID pair (@ssid, @tsid).
1825 * Return -%EINVAL if any of the parameters are invalid, -%ENOMEM
1826 * if insufficient memory is available, or %0 if the new SID was
1827 * computed successfully.
1829 int security_transition_sid(struct selinux_state
*state
,
1830 u32 ssid
, u32 tsid
, u16 tclass
,
1831 const struct qstr
*qstr
, u32
*out_sid
)
1833 return security_compute_sid(state
, ssid
, tsid
, tclass
,
1835 qstr
? qstr
->name
: NULL
, out_sid
, true);
1838 int security_transition_sid_user(struct selinux_state
*state
,
1839 u32 ssid
, u32 tsid
, u16 tclass
,
1840 const char *objname
, u32
*out_sid
)
1842 return security_compute_sid(state
, ssid
, tsid
, tclass
,
1844 objname
, out_sid
, false);
1848 * security_member_sid - Compute the SID for member selection.
1849 * @ssid: source security identifier
1850 * @tsid: target security identifier
1851 * @tclass: target security class
1852 * @out_sid: security identifier for selected member
1854 * Compute a SID to use when selecting a member of a polyinstantiated
1855 * object of class @tclass based on a SID pair (@ssid, @tsid).
1856 * Return -%EINVAL if any of the parameters are invalid, -%ENOMEM
1857 * if insufficient memory is available, or %0 if the SID was
1858 * computed successfully.
1860 int security_member_sid(struct selinux_state
*state
,
1866 return security_compute_sid(state
, ssid
, tsid
, tclass
,
1872 * security_change_sid - Compute the SID for object relabeling.
1873 * @ssid: source security identifier
1874 * @tsid: target security identifier
1875 * @tclass: target security class
1876 * @out_sid: security identifier for selected member
1878 * Compute a SID to use for relabeling an object of class @tclass
1879 * based on a SID pair (@ssid, @tsid).
1880 * Return -%EINVAL if any of the parameters are invalid, -%ENOMEM
1881 * if insufficient memory is available, or %0 if the SID was
1882 * computed successfully.
1884 int security_change_sid(struct selinux_state
*state
,
1890 return security_compute_sid(state
,
1891 ssid
, tsid
, tclass
, AVTAB_CHANGE
, NULL
,
1895 static inline int convert_context_handle_invalid_context(
1896 struct selinux_state
*state
,
1897 struct context
*context
)
1899 struct policydb
*policydb
= &state
->ss
->policydb
;
1903 if (enforcing_enabled(state
))
1906 if (!context_struct_to_string(policydb
, context
, &s
, &len
)) {
1907 pr_warn("SELinux: Context %s would be invalid if enforcing\n",
1914 struct convert_context_args
{
1915 struct selinux_state
*state
;
1916 struct policydb
*oldp
;
1917 struct policydb
*newp
;
1921 * Convert the values in the security context
1922 * structure `oldc' from the values specified
1923 * in the policy `p->oldp' to the values specified
1924 * in the policy `p->newp', storing the new context
1925 * in `newc'. Verify that the context is valid
1926 * under the new policy.
1928 static int convert_context(struct context
*oldc
, struct context
*newc
, void *p
)
1930 struct convert_context_args
*args
;
1931 struct ocontext
*oc
;
1932 struct role_datum
*role
;
1933 struct type_datum
*typdatum
;
1934 struct user_datum
*usrdatum
;
1942 s
= kstrdup(oldc
->str
, GFP_KERNEL
);
1946 rc
= string_to_context_struct(args
->newp
, NULL
, s
,
1948 if (rc
== -EINVAL
) {
1950 * Retain string representation for later mapping.
1952 * IMPORTANT: We need to copy the contents of oldc->str
1953 * back into s again because string_to_context_struct()
1954 * may have garbled it.
1956 memcpy(s
, oldc
->str
, oldc
->len
);
1959 newc
->len
= oldc
->len
;
1964 /* Other error condition, e.g. ENOMEM. */
1965 pr_err("SELinux: Unable to map context %s, rc = %d.\n",
1969 pr_info("SELinux: Context %s became valid (mapped).\n",
1976 /* Convert the user. */
1978 usrdatum
= hashtab_search(args
->newp
->p_users
.table
,
1979 sym_name(args
->oldp
,
1980 SYM_USERS
, oldc
->user
- 1));
1983 newc
->user
= usrdatum
->value
;
1985 /* Convert the role. */
1987 role
= hashtab_search(args
->newp
->p_roles
.table
,
1988 sym_name(args
->oldp
, SYM_ROLES
, oldc
->role
- 1));
1991 newc
->role
= role
->value
;
1993 /* Convert the type. */
1995 typdatum
= hashtab_search(args
->newp
->p_types
.table
,
1996 sym_name(args
->oldp
,
1997 SYM_TYPES
, oldc
->type
- 1));
2000 newc
->type
= typdatum
->value
;
2002 /* Convert the MLS fields if dealing with MLS policies */
2003 if (args
->oldp
->mls_enabled
&& args
->newp
->mls_enabled
) {
2004 rc
= mls_convert_context(args
->oldp
, args
->newp
, oldc
, newc
);
2007 } else if (!args
->oldp
->mls_enabled
&& args
->newp
->mls_enabled
) {
2009 * Switching between non-MLS and MLS policy:
2010 * ensure that the MLS fields of the context for all
2011 * existing entries in the sidtab are filled in with a
2012 * suitable default value, likely taken from one of the
2015 oc
= args
->newp
->ocontexts
[OCON_ISID
];
2016 while (oc
&& oc
->sid
[0] != SECINITSID_UNLABELED
)
2020 pr_err("SELinux: unable to look up"
2021 " the initial SIDs list\n");
2024 rc
= mls_range_set(newc
, &oc
->context
[0].range
);
2029 /* Check the validity of the new context. */
2030 if (!policydb_context_isvalid(args
->newp
, newc
)) {
2031 rc
= convert_context_handle_invalid_context(args
->state
, oldc
);
2038 /* Map old representation to string and save it. */
2039 rc
= context_struct_to_string(args
->oldp
, oldc
, &s
, &len
);
2042 context_destroy(newc
);
2045 pr_info("SELinux: Context %s became invalid (unmapped).\n",
2050 static void security_load_policycaps(struct selinux_state
*state
)
2052 struct policydb
*p
= &state
->ss
->policydb
;
2054 struct ebitmap_node
*node
;
2056 for (i
= 0; i
< ARRAY_SIZE(state
->policycap
); i
++)
2057 state
->policycap
[i
] = ebitmap_get_bit(&p
->policycaps
, i
);
2059 for (i
= 0; i
< ARRAY_SIZE(selinux_policycap_names
); i
++)
2060 pr_info("SELinux: policy capability %s=%d\n",
2061 selinux_policycap_names
[i
],
2062 ebitmap_get_bit(&p
->policycaps
, i
));
2064 ebitmap_for_each_positive_bit(&p
->policycaps
, node
, i
) {
2065 if (i
>= ARRAY_SIZE(selinux_policycap_names
))
2066 pr_info("SELinux: unknown policy capability %u\n",
2071 static int security_preserve_bools(struct selinux_state
*state
,
2072 struct policydb
*newpolicydb
);
2075 * security_load_policy - Load a security policy configuration.
2076 * @data: binary policy data
2077 * @len: length of data in bytes
2079 * Load a new set of security policy configuration data,
2080 * validate it and convert the SID table as necessary.
2081 * This function will flush the access vector cache after
2082 * loading the new policy.
2084 int security_load_policy(struct selinux_state
*state
, void *data
, size_t len
)
2086 struct policydb
*policydb
;
2087 struct sidtab
*oldsidtab
, *newsidtab
;
2088 struct policydb
*oldpolicydb
, *newpolicydb
;
2089 struct selinux_mapping
*oldmapping
;
2090 struct selinux_map newmap
;
2091 struct sidtab_convert_params convert_params
;
2092 struct convert_context_args args
;
2095 struct policy_file file
= { data
, len
}, *fp
= &file
;
2097 oldpolicydb
= kcalloc(2, sizeof(*oldpolicydb
), GFP_KERNEL
);
2102 newpolicydb
= oldpolicydb
+ 1;
2104 policydb
= &state
->ss
->policydb
;
2106 newsidtab
= kmalloc(sizeof(*newsidtab
), GFP_KERNEL
);
2112 if (!state
->initialized
) {
2113 rc
= policydb_read(policydb
, fp
);
2119 policydb
->len
= len
;
2120 rc
= selinux_set_mapping(policydb
, secclass_map
,
2124 policydb_destroy(policydb
);
2128 rc
= policydb_load_isids(policydb
, newsidtab
);
2131 policydb_destroy(policydb
);
2135 state
->ss
->sidtab
= newsidtab
;
2136 security_load_policycaps(state
);
2137 state
->initialized
= 1;
2138 seqno
= ++state
->ss
->latest_granting
;
2139 selinux_complete_init();
2140 avc_ss_reset(state
->avc
, seqno
);
2141 selnl_notify_policyload(seqno
);
2142 selinux_status_update_policyload(state
, seqno
);
2143 selinux_netlbl_cache_invalidate();
2144 selinux_xfrm_notify_policyload();
2148 rc
= policydb_read(newpolicydb
, fp
);
2154 newpolicydb
->len
= len
;
2155 /* If switching between different policy types, log MLS status */
2156 if (policydb
->mls_enabled
&& !newpolicydb
->mls_enabled
)
2157 pr_info("SELinux: Disabling MLS support...\n");
2158 else if (!policydb
->mls_enabled
&& newpolicydb
->mls_enabled
)
2159 pr_info("SELinux: Enabling MLS support...\n");
2161 rc
= policydb_load_isids(newpolicydb
, newsidtab
);
2163 pr_err("SELinux: unable to load the initial SIDs\n");
2164 policydb_destroy(newpolicydb
);
2169 rc
= selinux_set_mapping(newpolicydb
, secclass_map
, &newmap
);
2173 rc
= security_preserve_bools(state
, newpolicydb
);
2175 pr_err("SELinux: unable to preserve booleans\n");
2179 oldsidtab
= state
->ss
->sidtab
;
2182 * Convert the internal representations of contexts
2183 * in the new SID table.
2186 args
.oldp
= policydb
;
2187 args
.newp
= newpolicydb
;
2189 convert_params
.func
= convert_context
;
2190 convert_params
.args
= &args
;
2191 convert_params
.target
= newsidtab
;
2193 rc
= sidtab_convert(oldsidtab
, &convert_params
);
2195 pr_err("SELinux: unable to convert the internal"
2196 " representation of contexts in the new SID"
2201 /* Save the old policydb and SID table to free later. */
2202 memcpy(oldpolicydb
, policydb
, sizeof(*policydb
));
2204 /* Install the new policydb and SID table. */
2205 write_lock_irq(&state
->ss
->policy_rwlock
);
2206 memcpy(policydb
, newpolicydb
, sizeof(*policydb
));
2207 state
->ss
->sidtab
= newsidtab
;
2208 security_load_policycaps(state
);
2209 oldmapping
= state
->ss
->map
.mapping
;
2210 state
->ss
->map
.mapping
= newmap
.mapping
;
2211 state
->ss
->map
.size
= newmap
.size
;
2212 seqno
= ++state
->ss
->latest_granting
;
2213 write_unlock_irq(&state
->ss
->policy_rwlock
);
2215 /* Free the old policydb and SID table. */
2216 policydb_destroy(oldpolicydb
);
2217 sidtab_destroy(oldsidtab
);
2221 avc_ss_reset(state
->avc
, seqno
);
2222 selnl_notify_policyload(seqno
);
2223 selinux_status_update_policyload(state
, seqno
);
2224 selinux_netlbl_cache_invalidate();
2225 selinux_xfrm_notify_policyload();
2231 kfree(newmap
.mapping
);
2232 sidtab_destroy(newsidtab
);
2234 policydb_destroy(newpolicydb
);
2241 size_t security_policydb_len(struct selinux_state
*state
)
2243 struct policydb
*p
= &state
->ss
->policydb
;
2246 read_lock(&state
->ss
->policy_rwlock
);
2248 read_unlock(&state
->ss
->policy_rwlock
);
2254 * security_port_sid - Obtain the SID for a port.
2255 * @protocol: protocol number
2256 * @port: port number
2257 * @out_sid: security identifier
2259 int security_port_sid(struct selinux_state
*state
,
2260 u8 protocol
, u16 port
, u32
*out_sid
)
2262 struct policydb
*policydb
;
2263 struct sidtab
*sidtab
;
2267 read_lock(&state
->ss
->policy_rwlock
);
2269 policydb
= &state
->ss
->policydb
;
2270 sidtab
= state
->ss
->sidtab
;
2272 c
= policydb
->ocontexts
[OCON_PORT
];
2274 if (c
->u
.port
.protocol
== protocol
&&
2275 c
->u
.port
.low_port
<= port
&&
2276 c
->u
.port
.high_port
>= port
)
2283 rc
= sidtab_context_to_sid(sidtab
,
2289 *out_sid
= c
->sid
[0];
2291 *out_sid
= SECINITSID_PORT
;
2295 read_unlock(&state
->ss
->policy_rwlock
);
2300 * security_pkey_sid - Obtain the SID for a pkey.
2301 * @subnet_prefix: Subnet Prefix
2302 * @pkey_num: pkey number
2303 * @out_sid: security identifier
2305 int security_ib_pkey_sid(struct selinux_state
*state
,
2306 u64 subnet_prefix
, u16 pkey_num
, u32
*out_sid
)
2308 struct policydb
*policydb
;
2309 struct sidtab
*sidtab
;
2313 read_lock(&state
->ss
->policy_rwlock
);
2315 policydb
= &state
->ss
->policydb
;
2316 sidtab
= state
->ss
->sidtab
;
2318 c
= policydb
->ocontexts
[OCON_IBPKEY
];
2320 if (c
->u
.ibpkey
.low_pkey
<= pkey_num
&&
2321 c
->u
.ibpkey
.high_pkey
>= pkey_num
&&
2322 c
->u
.ibpkey
.subnet_prefix
== subnet_prefix
)
2330 rc
= sidtab_context_to_sid(sidtab
,
2336 *out_sid
= c
->sid
[0];
2338 *out_sid
= SECINITSID_UNLABELED
;
2341 read_unlock(&state
->ss
->policy_rwlock
);
2346 * security_ib_endport_sid - Obtain the SID for a subnet management interface.
2347 * @dev_name: device name
2348 * @port: port number
2349 * @out_sid: security identifier
2351 int security_ib_endport_sid(struct selinux_state
*state
,
2352 const char *dev_name
, u8 port_num
, u32
*out_sid
)
2354 struct policydb
*policydb
;
2355 struct sidtab
*sidtab
;
2359 read_lock(&state
->ss
->policy_rwlock
);
2361 policydb
= &state
->ss
->policydb
;
2362 sidtab
= state
->ss
->sidtab
;
2364 c
= policydb
->ocontexts
[OCON_IBENDPORT
];
2366 if (c
->u
.ibendport
.port
== port_num
&&
2367 !strncmp(c
->u
.ibendport
.dev_name
,
2369 IB_DEVICE_NAME_MAX
))
2377 rc
= sidtab_context_to_sid(sidtab
,
2383 *out_sid
= c
->sid
[0];
2385 *out_sid
= SECINITSID_UNLABELED
;
2388 read_unlock(&state
->ss
->policy_rwlock
);
2393 * security_netif_sid - Obtain the SID for a network interface.
2394 * @name: interface name
2395 * @if_sid: interface SID
2397 int security_netif_sid(struct selinux_state
*state
,
2398 char *name
, u32
*if_sid
)
2400 struct policydb
*policydb
;
2401 struct sidtab
*sidtab
;
2405 read_lock(&state
->ss
->policy_rwlock
);
2407 policydb
= &state
->ss
->policydb
;
2408 sidtab
= state
->ss
->sidtab
;
2410 c
= policydb
->ocontexts
[OCON_NETIF
];
2412 if (strcmp(name
, c
->u
.name
) == 0)
2418 if (!c
->sid
[0] || !c
->sid
[1]) {
2419 rc
= sidtab_context_to_sid(sidtab
,
2424 rc
= sidtab_context_to_sid(sidtab
,
2430 *if_sid
= c
->sid
[0];
2432 *if_sid
= SECINITSID_NETIF
;
2435 read_unlock(&state
->ss
->policy_rwlock
);
2439 static int match_ipv6_addrmask(u32
*input
, u32
*addr
, u32
*mask
)
2443 for (i
= 0; i
< 4; i
++)
2444 if (addr
[i
] != (input
[i
] & mask
[i
])) {
2453 * security_node_sid - Obtain the SID for a node (host).
2454 * @domain: communication domain aka address family
2456 * @addrlen: address length in bytes
2457 * @out_sid: security identifier
2459 int security_node_sid(struct selinux_state
*state
,
2465 struct policydb
*policydb
;
2466 struct sidtab
*sidtab
;
2470 read_lock(&state
->ss
->policy_rwlock
);
2472 policydb
= &state
->ss
->policydb
;
2473 sidtab
= state
->ss
->sidtab
;
2480 if (addrlen
!= sizeof(u32
))
2483 addr
= *((u32
*)addrp
);
2485 c
= policydb
->ocontexts
[OCON_NODE
];
2487 if (c
->u
.node
.addr
== (addr
& c
->u
.node
.mask
))
2496 if (addrlen
!= sizeof(u64
) * 2)
2498 c
= policydb
->ocontexts
[OCON_NODE6
];
2500 if (match_ipv6_addrmask(addrp
, c
->u
.node6
.addr
,
2509 *out_sid
= SECINITSID_NODE
;
2515 rc
= sidtab_context_to_sid(sidtab
,
2521 *out_sid
= c
->sid
[0];
2523 *out_sid
= SECINITSID_NODE
;
2528 read_unlock(&state
->ss
->policy_rwlock
);
2535 * security_get_user_sids - Obtain reachable SIDs for a user.
2536 * @fromsid: starting SID
2537 * @username: username
2538 * @sids: array of reachable SIDs for user
2539 * @nel: number of elements in @sids
2541 * Generate the set of SIDs for legal security contexts
2542 * for a given user that can be reached by @fromsid.
2543 * Set *@sids to point to a dynamically allocated
2544 * array containing the set of SIDs. Set *@nel to the
2545 * number of elements in the array.
2548 int security_get_user_sids(struct selinux_state
*state
,
2554 struct policydb
*policydb
;
2555 struct sidtab
*sidtab
;
2556 struct context
*fromcon
, usercon
;
2557 u32
*mysids
= NULL
, *mysids2
, sid
;
2558 u32 mynel
= 0, maxnel
= SIDS_NEL
;
2559 struct user_datum
*user
;
2560 struct role_datum
*role
;
2561 struct ebitmap_node
*rnode
, *tnode
;
2567 if (!state
->initialized
)
2570 read_lock(&state
->ss
->policy_rwlock
);
2572 policydb
= &state
->ss
->policydb
;
2573 sidtab
= state
->ss
->sidtab
;
2575 context_init(&usercon
);
2578 fromcon
= sidtab_search(sidtab
, fromsid
);
2583 user
= hashtab_search(policydb
->p_users
.table
, username
);
2587 usercon
.user
= user
->value
;
2590 mysids
= kcalloc(maxnel
, sizeof(*mysids
), GFP_ATOMIC
);
2594 ebitmap_for_each_positive_bit(&user
->roles
, rnode
, i
) {
2595 role
= policydb
->role_val_to_struct
[i
];
2596 usercon
.role
= i
+ 1;
2597 ebitmap_for_each_positive_bit(&role
->types
, tnode
, j
) {
2598 usercon
.type
= j
+ 1;
2600 if (mls_setup_user_range(policydb
, fromcon
, user
,
2604 rc
= sidtab_context_to_sid(sidtab
, &usercon
, &sid
);
2607 if (mynel
< maxnel
) {
2608 mysids
[mynel
++] = sid
;
2612 mysids2
= kcalloc(maxnel
, sizeof(*mysids2
), GFP_ATOMIC
);
2615 memcpy(mysids2
, mysids
, mynel
* sizeof(*mysids2
));
2618 mysids
[mynel
++] = sid
;
2624 read_unlock(&state
->ss
->policy_rwlock
);
2631 mysids2
= kcalloc(mynel
, sizeof(*mysids2
), GFP_KERNEL
);
2636 for (i
= 0, j
= 0; i
< mynel
; i
++) {
2637 struct av_decision dummy_avd
;
2638 rc
= avc_has_perm_noaudit(state
,
2640 SECCLASS_PROCESS
, /* kernel value */
2641 PROCESS__TRANSITION
, AVC_STRICT
,
2644 mysids2
[j
++] = mysids
[i
];
2656 * __security_genfs_sid - Helper to obtain a SID for a file in a filesystem
2657 * @fstype: filesystem type
2658 * @path: path from root of mount
2659 * @sclass: file security class
2660 * @sid: SID for path
2662 * Obtain a SID to use for a file in a filesystem that
2663 * cannot support xattr or use a fixed labeling behavior like
2664 * transition SIDs or task SIDs.
2666 * The caller must acquire the policy_rwlock before calling this function.
2668 static inline int __security_genfs_sid(struct selinux_state
*state
,
2674 struct policydb
*policydb
= &state
->ss
->policydb
;
2675 struct sidtab
*sidtab
= state
->ss
->sidtab
;
2678 struct genfs
*genfs
;
2682 while (path
[0] == '/' && path
[1] == '/')
2685 sclass
= unmap_class(&state
->ss
->map
, orig_sclass
);
2686 *sid
= SECINITSID_UNLABELED
;
2688 for (genfs
= policydb
->genfs
; genfs
; genfs
= genfs
->next
) {
2689 cmp
= strcmp(fstype
, genfs
->fstype
);
2698 for (c
= genfs
->head
; c
; c
= c
->next
) {
2699 len
= strlen(c
->u
.name
);
2700 if ((!c
->v
.sclass
|| sclass
== c
->v
.sclass
) &&
2701 (strncmp(c
->u
.name
, path
, len
) == 0))
2710 rc
= sidtab_context_to_sid(sidtab
, &c
->context
[0], &c
->sid
[0]);
2722 * security_genfs_sid - Obtain a SID for a file in a filesystem
2723 * @fstype: filesystem type
2724 * @path: path from root of mount
2725 * @sclass: file security class
2726 * @sid: SID for path
2728 * Acquire policy_rwlock before calling __security_genfs_sid() and release
2731 int security_genfs_sid(struct selinux_state
*state
,
2739 read_lock(&state
->ss
->policy_rwlock
);
2740 retval
= __security_genfs_sid(state
, fstype
, path
, orig_sclass
, sid
);
2741 read_unlock(&state
->ss
->policy_rwlock
);
2746 * security_fs_use - Determine how to handle labeling for a filesystem.
2747 * @sb: superblock in question
2749 int security_fs_use(struct selinux_state
*state
, struct super_block
*sb
)
2751 struct policydb
*policydb
;
2752 struct sidtab
*sidtab
;
2755 struct superblock_security_struct
*sbsec
= sb
->s_security
;
2756 const char *fstype
= sb
->s_type
->name
;
2758 read_lock(&state
->ss
->policy_rwlock
);
2760 policydb
= &state
->ss
->policydb
;
2761 sidtab
= state
->ss
->sidtab
;
2763 c
= policydb
->ocontexts
[OCON_FSUSE
];
2765 if (strcmp(fstype
, c
->u
.name
) == 0)
2771 sbsec
->behavior
= c
->v
.behavior
;
2773 rc
= sidtab_context_to_sid(sidtab
, &c
->context
[0],
2778 sbsec
->sid
= c
->sid
[0];
2780 rc
= __security_genfs_sid(state
, fstype
, "/", SECCLASS_DIR
,
2783 sbsec
->behavior
= SECURITY_FS_USE_NONE
;
2786 sbsec
->behavior
= SECURITY_FS_USE_GENFS
;
2791 read_unlock(&state
->ss
->policy_rwlock
);
2795 int security_get_bools(struct selinux_state
*state
,
2796 int *len
, char ***names
, int **values
)
2798 struct policydb
*policydb
;
2801 if (!state
->initialized
) {
2808 read_lock(&state
->ss
->policy_rwlock
);
2810 policydb
= &state
->ss
->policydb
;
2816 *len
= policydb
->p_bools
.nprim
;
2821 *names
= kcalloc(*len
, sizeof(char *), GFP_ATOMIC
);
2826 *values
= kcalloc(*len
, sizeof(int), GFP_ATOMIC
);
2830 for (i
= 0; i
< *len
; i
++) {
2831 (*values
)[i
] = policydb
->bool_val_to_struct
[i
]->state
;
2834 (*names
)[i
] = kstrdup(sym_name(policydb
, SYM_BOOLS
, i
),
2841 read_unlock(&state
->ss
->policy_rwlock
);
2845 for (i
= 0; i
< *len
; i
++)
2853 int security_set_bools(struct selinux_state
*state
, int len
, int *values
)
2855 struct policydb
*policydb
;
2857 int lenp
, seqno
= 0;
2858 struct cond_node
*cur
;
2860 write_lock_irq(&state
->ss
->policy_rwlock
);
2862 policydb
= &state
->ss
->policydb
;
2865 lenp
= policydb
->p_bools
.nprim
;
2869 for (i
= 0; i
< len
; i
++) {
2870 if (!!values
[i
] != policydb
->bool_val_to_struct
[i
]->state
) {
2871 audit_log(audit_context(), GFP_ATOMIC
,
2872 AUDIT_MAC_CONFIG_CHANGE
,
2873 "bool=%s val=%d old_val=%d auid=%u ses=%u",
2874 sym_name(policydb
, SYM_BOOLS
, i
),
2876 policydb
->bool_val_to_struct
[i
]->state
,
2877 from_kuid(&init_user_ns
, audit_get_loginuid(current
)),
2878 audit_get_sessionid(current
));
2881 policydb
->bool_val_to_struct
[i
]->state
= 1;
2883 policydb
->bool_val_to_struct
[i
]->state
= 0;
2886 for (cur
= policydb
->cond_list
; cur
; cur
= cur
->next
) {
2887 rc
= evaluate_cond_node(policydb
, cur
);
2892 seqno
= ++state
->ss
->latest_granting
;
2895 write_unlock_irq(&state
->ss
->policy_rwlock
);
2897 avc_ss_reset(state
->avc
, seqno
);
2898 selnl_notify_policyload(seqno
);
2899 selinux_status_update_policyload(state
, seqno
);
2900 selinux_xfrm_notify_policyload();
2905 int security_get_bool_value(struct selinux_state
*state
,
2908 struct policydb
*policydb
;
2912 read_lock(&state
->ss
->policy_rwlock
);
2914 policydb
= &state
->ss
->policydb
;
2917 len
= policydb
->p_bools
.nprim
;
2921 rc
= policydb
->bool_val_to_struct
[index
]->state
;
2923 read_unlock(&state
->ss
->policy_rwlock
);
2927 static int security_preserve_bools(struct selinux_state
*state
,
2928 struct policydb
*policydb
)
2930 int rc
, nbools
= 0, *bvalues
= NULL
, i
;
2931 char **bnames
= NULL
;
2932 struct cond_bool_datum
*booldatum
;
2933 struct cond_node
*cur
;
2935 rc
= security_get_bools(state
, &nbools
, &bnames
, &bvalues
);
2938 for (i
= 0; i
< nbools
; i
++) {
2939 booldatum
= hashtab_search(policydb
->p_bools
.table
, bnames
[i
]);
2941 booldatum
->state
= bvalues
[i
];
2943 for (cur
= policydb
->cond_list
; cur
; cur
= cur
->next
) {
2944 rc
= evaluate_cond_node(policydb
, cur
);
2951 for (i
= 0; i
< nbools
; i
++)
2960 * security_sid_mls_copy() - computes a new sid based on the given
2961 * sid and the mls portion of mls_sid.
2963 int security_sid_mls_copy(struct selinux_state
*state
,
2964 u32 sid
, u32 mls_sid
, u32
*new_sid
)
2966 struct policydb
*policydb
= &state
->ss
->policydb
;
2967 struct sidtab
*sidtab
= state
->ss
->sidtab
;
2968 struct context
*context1
;
2969 struct context
*context2
;
2970 struct context newcon
;
2976 if (!state
->initialized
|| !policydb
->mls_enabled
) {
2981 context_init(&newcon
);
2983 read_lock(&state
->ss
->policy_rwlock
);
2986 context1
= sidtab_search(sidtab
, sid
);
2988 pr_err("SELinux: %s: unrecognized SID %d\n",
2994 context2
= sidtab_search(sidtab
, mls_sid
);
2996 pr_err("SELinux: %s: unrecognized SID %d\n",
3001 newcon
.user
= context1
->user
;
3002 newcon
.role
= context1
->role
;
3003 newcon
.type
= context1
->type
;
3004 rc
= mls_context_cpy(&newcon
, context2
);
3008 /* Check the validity of the new context. */
3009 if (!policydb_context_isvalid(policydb
, &newcon
)) {
3010 rc
= convert_context_handle_invalid_context(state
, &newcon
);
3012 if (!context_struct_to_string(policydb
, &newcon
, &s
,
3014 struct audit_buffer
*ab
;
3016 ab
= audit_log_start(audit_context(),
3019 audit_log_format(ab
,
3020 "op=security_sid_mls_copy invalid_context=");
3021 /* don't record NUL with untrusted strings */
3022 audit_log_n_untrustedstring(ab
, s
, len
- 1);
3030 rc
= sidtab_context_to_sid(sidtab
, &newcon
, new_sid
);
3032 read_unlock(&state
->ss
->policy_rwlock
);
3033 context_destroy(&newcon
);
3039 * security_net_peersid_resolve - Compare and resolve two network peer SIDs
3040 * @nlbl_sid: NetLabel SID
3041 * @nlbl_type: NetLabel labeling protocol type
3042 * @xfrm_sid: XFRM SID
3045 * Compare the @nlbl_sid and @xfrm_sid values and if the two SIDs can be
3046 * resolved into a single SID it is returned via @peer_sid and the function
3047 * returns zero. Otherwise @peer_sid is set to SECSID_NULL and the function
3048 * returns a negative value. A table summarizing the behavior is below:
3050 * | function return | @sid
3051 * ------------------------------+-----------------+-----------------
3052 * no peer labels | 0 | SECSID_NULL
3053 * single peer label | 0 | <peer_label>
3054 * multiple, consistent labels | 0 | <peer_label>
3055 * multiple, inconsistent labels | -<errno> | SECSID_NULL
3058 int security_net_peersid_resolve(struct selinux_state
*state
,
3059 u32 nlbl_sid
, u32 nlbl_type
,
3063 struct policydb
*policydb
= &state
->ss
->policydb
;
3064 struct sidtab
*sidtab
= state
->ss
->sidtab
;
3066 struct context
*nlbl_ctx
;
3067 struct context
*xfrm_ctx
;
3069 *peer_sid
= SECSID_NULL
;
3071 /* handle the common (which also happens to be the set of easy) cases
3072 * right away, these two if statements catch everything involving a
3073 * single or absent peer SID/label */
3074 if (xfrm_sid
== SECSID_NULL
) {
3075 *peer_sid
= nlbl_sid
;
3078 /* NOTE: an nlbl_type == NETLBL_NLTYPE_UNLABELED is a "fallback" label
3079 * and is treated as if nlbl_sid == SECSID_NULL when a XFRM SID/label
3081 if (nlbl_sid
== SECSID_NULL
|| nlbl_type
== NETLBL_NLTYPE_UNLABELED
) {
3082 *peer_sid
= xfrm_sid
;
3087 * We don't need to check initialized here since the only way both
3088 * nlbl_sid and xfrm_sid are not equal to SECSID_NULL would be if the
3089 * security server was initialized and state->initialized was true.
3091 if (!policydb
->mls_enabled
)
3094 read_lock(&state
->ss
->policy_rwlock
);
3097 nlbl_ctx
= sidtab_search(sidtab
, nlbl_sid
);
3099 pr_err("SELinux: %s: unrecognized SID %d\n",
3100 __func__
, nlbl_sid
);
3104 xfrm_ctx
= sidtab_search(sidtab
, xfrm_sid
);
3106 pr_err("SELinux: %s: unrecognized SID %d\n",
3107 __func__
, xfrm_sid
);
3110 rc
= (mls_context_cmp(nlbl_ctx
, xfrm_ctx
) ? 0 : -EACCES
);
3114 /* at present NetLabel SIDs/labels really only carry MLS
3115 * information so if the MLS portion of the NetLabel SID
3116 * matches the MLS portion of the labeled XFRM SID/label
3117 * then pass along the XFRM SID as it is the most
3119 *peer_sid
= xfrm_sid
;
3121 read_unlock(&state
->ss
->policy_rwlock
);
3125 static int get_classes_callback(void *k
, void *d
, void *args
)
3127 struct class_datum
*datum
= d
;
3128 char *name
= k
, **classes
= args
;
3129 int value
= datum
->value
- 1;
3131 classes
[value
] = kstrdup(name
, GFP_ATOMIC
);
3132 if (!classes
[value
])
3138 int security_get_classes(struct selinux_state
*state
,
3139 char ***classes
, int *nclasses
)
3141 struct policydb
*policydb
= &state
->ss
->policydb
;
3144 if (!state
->initialized
) {
3150 read_lock(&state
->ss
->policy_rwlock
);
3153 *nclasses
= policydb
->p_classes
.nprim
;
3154 *classes
= kcalloc(*nclasses
, sizeof(**classes
), GFP_ATOMIC
);
3158 rc
= hashtab_map(policydb
->p_classes
.table
, get_classes_callback
,
3162 for (i
= 0; i
< *nclasses
; i
++)
3163 kfree((*classes
)[i
]);
3168 read_unlock(&state
->ss
->policy_rwlock
);
3172 static int get_permissions_callback(void *k
, void *d
, void *args
)
3174 struct perm_datum
*datum
= d
;
3175 char *name
= k
, **perms
= args
;
3176 int value
= datum
->value
- 1;
3178 perms
[value
] = kstrdup(name
, GFP_ATOMIC
);
3185 int security_get_permissions(struct selinux_state
*state
,
3186 char *class, char ***perms
, int *nperms
)
3188 struct policydb
*policydb
= &state
->ss
->policydb
;
3190 struct class_datum
*match
;
3192 read_lock(&state
->ss
->policy_rwlock
);
3195 match
= hashtab_search(policydb
->p_classes
.table
, class);
3197 pr_err("SELinux: %s: unrecognized class %s\n",
3203 *nperms
= match
->permissions
.nprim
;
3204 *perms
= kcalloc(*nperms
, sizeof(**perms
), GFP_ATOMIC
);
3208 if (match
->comdatum
) {
3209 rc
= hashtab_map(match
->comdatum
->permissions
.table
,
3210 get_permissions_callback
, *perms
);
3215 rc
= hashtab_map(match
->permissions
.table
, get_permissions_callback
,
3221 read_unlock(&state
->ss
->policy_rwlock
);
3225 read_unlock(&state
->ss
->policy_rwlock
);
3226 for (i
= 0; i
< *nperms
; i
++)
3232 int security_get_reject_unknown(struct selinux_state
*state
)
3234 return state
->ss
->policydb
.reject_unknown
;
3237 int security_get_allow_unknown(struct selinux_state
*state
)
3239 return state
->ss
->policydb
.allow_unknown
;
3243 * security_policycap_supported - Check for a specific policy capability
3244 * @req_cap: capability
3247 * This function queries the currently loaded policy to see if it supports the
3248 * capability specified by @req_cap. Returns true (1) if the capability is
3249 * supported, false (0) if it isn't supported.
3252 int security_policycap_supported(struct selinux_state
*state
,
3253 unsigned int req_cap
)
3255 struct policydb
*policydb
= &state
->ss
->policydb
;
3258 read_lock(&state
->ss
->policy_rwlock
);
3259 rc
= ebitmap_get_bit(&policydb
->policycaps
, req_cap
);
3260 read_unlock(&state
->ss
->policy_rwlock
);
3265 struct selinux_audit_rule
{
3267 struct context au_ctxt
;
3270 void selinux_audit_rule_free(void *vrule
)
3272 struct selinux_audit_rule
*rule
= vrule
;
3275 context_destroy(&rule
->au_ctxt
);
3280 int selinux_audit_rule_init(u32 field
, u32 op
, char *rulestr
, void **vrule
)
3282 struct selinux_state
*state
= &selinux_state
;
3283 struct policydb
*policydb
= &state
->ss
->policydb
;
3284 struct selinux_audit_rule
*tmprule
;
3285 struct role_datum
*roledatum
;
3286 struct type_datum
*typedatum
;
3287 struct user_datum
*userdatum
;
3288 struct selinux_audit_rule
**rule
= (struct selinux_audit_rule
**)vrule
;
3293 if (!state
->initialized
)
3297 case AUDIT_SUBJ_USER
:
3298 case AUDIT_SUBJ_ROLE
:
3299 case AUDIT_SUBJ_TYPE
:
3300 case AUDIT_OBJ_USER
:
3301 case AUDIT_OBJ_ROLE
:
3302 case AUDIT_OBJ_TYPE
:
3303 /* only 'equals' and 'not equals' fit user, role, and type */
3304 if (op
!= Audit_equal
&& op
!= Audit_not_equal
)
3307 case AUDIT_SUBJ_SEN
:
3308 case AUDIT_SUBJ_CLR
:
3309 case AUDIT_OBJ_LEV_LOW
:
3310 case AUDIT_OBJ_LEV_HIGH
:
3311 /* we do not allow a range, indicated by the presence of '-' */
3312 if (strchr(rulestr
, '-'))
3316 /* only the above fields are valid */
3320 tmprule
= kzalloc(sizeof(struct selinux_audit_rule
), GFP_KERNEL
);
3324 context_init(&tmprule
->au_ctxt
);
3326 read_lock(&state
->ss
->policy_rwlock
);
3328 tmprule
->au_seqno
= state
->ss
->latest_granting
;
3331 case AUDIT_SUBJ_USER
:
3332 case AUDIT_OBJ_USER
:
3334 userdatum
= hashtab_search(policydb
->p_users
.table
, rulestr
);
3337 tmprule
->au_ctxt
.user
= userdatum
->value
;
3339 case AUDIT_SUBJ_ROLE
:
3340 case AUDIT_OBJ_ROLE
:
3342 roledatum
= hashtab_search(policydb
->p_roles
.table
, rulestr
);
3345 tmprule
->au_ctxt
.role
= roledatum
->value
;
3347 case AUDIT_SUBJ_TYPE
:
3348 case AUDIT_OBJ_TYPE
:
3350 typedatum
= hashtab_search(policydb
->p_types
.table
, rulestr
);
3353 tmprule
->au_ctxt
.type
= typedatum
->value
;
3355 case AUDIT_SUBJ_SEN
:
3356 case AUDIT_SUBJ_CLR
:
3357 case AUDIT_OBJ_LEV_LOW
:
3358 case AUDIT_OBJ_LEV_HIGH
:
3359 rc
= mls_from_string(policydb
, rulestr
, &tmprule
->au_ctxt
,
3367 read_unlock(&state
->ss
->policy_rwlock
);
3370 selinux_audit_rule_free(tmprule
);
3379 /* Check to see if the rule contains any selinux fields */
3380 int selinux_audit_rule_known(struct audit_krule
*rule
)
3384 for (i
= 0; i
< rule
->field_count
; i
++) {
3385 struct audit_field
*f
= &rule
->fields
[i
];
3387 case AUDIT_SUBJ_USER
:
3388 case AUDIT_SUBJ_ROLE
:
3389 case AUDIT_SUBJ_TYPE
:
3390 case AUDIT_SUBJ_SEN
:
3391 case AUDIT_SUBJ_CLR
:
3392 case AUDIT_OBJ_USER
:
3393 case AUDIT_OBJ_ROLE
:
3394 case AUDIT_OBJ_TYPE
:
3395 case AUDIT_OBJ_LEV_LOW
:
3396 case AUDIT_OBJ_LEV_HIGH
:
3404 int selinux_audit_rule_match(u32 sid
, u32 field
, u32 op
, void *vrule
)
3406 struct selinux_state
*state
= &selinux_state
;
3407 struct context
*ctxt
;
3408 struct mls_level
*level
;
3409 struct selinux_audit_rule
*rule
= vrule
;
3412 if (unlikely(!rule
)) {
3413 WARN_ONCE(1, "selinux_audit_rule_match: missing rule\n");
3417 read_lock(&state
->ss
->policy_rwlock
);
3419 if (rule
->au_seqno
< state
->ss
->latest_granting
) {
3424 ctxt
= sidtab_search(state
->ss
->sidtab
, sid
);
3425 if (unlikely(!ctxt
)) {
3426 WARN_ONCE(1, "selinux_audit_rule_match: unrecognized SID %d\n",
3432 /* a field/op pair that is not caught here will simply fall through
3435 case AUDIT_SUBJ_USER
:
3436 case AUDIT_OBJ_USER
:
3439 match
= (ctxt
->user
== rule
->au_ctxt
.user
);
3441 case Audit_not_equal
:
3442 match
= (ctxt
->user
!= rule
->au_ctxt
.user
);
3446 case AUDIT_SUBJ_ROLE
:
3447 case AUDIT_OBJ_ROLE
:
3450 match
= (ctxt
->role
== rule
->au_ctxt
.role
);
3452 case Audit_not_equal
:
3453 match
= (ctxt
->role
!= rule
->au_ctxt
.role
);
3457 case AUDIT_SUBJ_TYPE
:
3458 case AUDIT_OBJ_TYPE
:
3461 match
= (ctxt
->type
== rule
->au_ctxt
.type
);
3463 case Audit_not_equal
:
3464 match
= (ctxt
->type
!= rule
->au_ctxt
.type
);
3468 case AUDIT_SUBJ_SEN
:
3469 case AUDIT_SUBJ_CLR
:
3470 case AUDIT_OBJ_LEV_LOW
:
3471 case AUDIT_OBJ_LEV_HIGH
:
3472 level
= ((field
== AUDIT_SUBJ_SEN
||
3473 field
== AUDIT_OBJ_LEV_LOW
) ?
3474 &ctxt
->range
.level
[0] : &ctxt
->range
.level
[1]);
3477 match
= mls_level_eq(&rule
->au_ctxt
.range
.level
[0],
3480 case Audit_not_equal
:
3481 match
= !mls_level_eq(&rule
->au_ctxt
.range
.level
[0],
3485 match
= (mls_level_dom(&rule
->au_ctxt
.range
.level
[0],
3487 !mls_level_eq(&rule
->au_ctxt
.range
.level
[0],
3491 match
= mls_level_dom(&rule
->au_ctxt
.range
.level
[0],
3495 match
= (mls_level_dom(level
,
3496 &rule
->au_ctxt
.range
.level
[0]) &&
3497 !mls_level_eq(level
,
3498 &rule
->au_ctxt
.range
.level
[0]));
3501 match
= mls_level_dom(level
,
3502 &rule
->au_ctxt
.range
.level
[0]);
3508 read_unlock(&state
->ss
->policy_rwlock
);
3512 static int (*aurule_callback
)(void) = audit_update_lsm_rules
;
3514 static int aurule_avc_callback(u32 event
)
3518 if (event
== AVC_CALLBACK_RESET
&& aurule_callback
)
3519 err
= aurule_callback();
3523 static int __init
aurule_init(void)
3527 err
= avc_add_callback(aurule_avc_callback
, AVC_CALLBACK_RESET
);
3529 panic("avc_add_callback() failed, error %d\n", err
);
3533 __initcall(aurule_init
);
3535 #ifdef CONFIG_NETLABEL
3537 * security_netlbl_cache_add - Add an entry to the NetLabel cache
3538 * @secattr: the NetLabel packet security attributes
3539 * @sid: the SELinux SID
3542 * Attempt to cache the context in @ctx, which was derived from the packet in
3543 * @skb, in the NetLabel subsystem cache. This function assumes @secattr has
3544 * already been initialized.
3547 static void security_netlbl_cache_add(struct netlbl_lsm_secattr
*secattr
,
3552 sid_cache
= kmalloc(sizeof(*sid_cache
), GFP_ATOMIC
);
3553 if (sid_cache
== NULL
)
3555 secattr
->cache
= netlbl_secattr_cache_alloc(GFP_ATOMIC
);
3556 if (secattr
->cache
== NULL
) {
3562 secattr
->cache
->free
= kfree
;
3563 secattr
->cache
->data
= sid_cache
;
3564 secattr
->flags
|= NETLBL_SECATTR_CACHE
;
3568 * security_netlbl_secattr_to_sid - Convert a NetLabel secattr to a SELinux SID
3569 * @secattr: the NetLabel packet security attributes
3570 * @sid: the SELinux SID
3573 * Convert the given NetLabel security attributes in @secattr into a
3574 * SELinux SID. If the @secattr field does not contain a full SELinux
3575 * SID/context then use SECINITSID_NETMSG as the foundation. If possible the
3576 * 'cache' field of @secattr is set and the CACHE flag is set; this is to
3577 * allow the @secattr to be used by NetLabel to cache the secattr to SID
3578 * conversion for future lookups. Returns zero on success, negative values on
3582 int security_netlbl_secattr_to_sid(struct selinux_state
*state
,
3583 struct netlbl_lsm_secattr
*secattr
,
3586 struct policydb
*policydb
= &state
->ss
->policydb
;
3587 struct sidtab
*sidtab
= state
->ss
->sidtab
;
3589 struct context
*ctx
;
3590 struct context ctx_new
;
3592 if (!state
->initialized
) {
3597 read_lock(&state
->ss
->policy_rwlock
);
3599 if (secattr
->flags
& NETLBL_SECATTR_CACHE
)
3600 *sid
= *(u32
*)secattr
->cache
->data
;
3601 else if (secattr
->flags
& NETLBL_SECATTR_SECID
)
3602 *sid
= secattr
->attr
.secid
;
3603 else if (secattr
->flags
& NETLBL_SECATTR_MLS_LVL
) {
3605 ctx
= sidtab_search(sidtab
, SECINITSID_NETMSG
);
3609 context_init(&ctx_new
);
3610 ctx_new
.user
= ctx
->user
;
3611 ctx_new
.role
= ctx
->role
;
3612 ctx_new
.type
= ctx
->type
;
3613 mls_import_netlbl_lvl(policydb
, &ctx_new
, secattr
);
3614 if (secattr
->flags
& NETLBL_SECATTR_MLS_CAT
) {
3615 rc
= mls_import_netlbl_cat(policydb
, &ctx_new
, secattr
);
3620 if (!mls_context_isvalid(policydb
, &ctx_new
))
3623 rc
= sidtab_context_to_sid(sidtab
, &ctx_new
, sid
);
3627 security_netlbl_cache_add(secattr
, *sid
);
3629 ebitmap_destroy(&ctx_new
.range
.level
[0].cat
);
3633 read_unlock(&state
->ss
->policy_rwlock
);
3636 ebitmap_destroy(&ctx_new
.range
.level
[0].cat
);
3638 read_unlock(&state
->ss
->policy_rwlock
);
3643 * security_netlbl_sid_to_secattr - Convert a SELinux SID to a NetLabel secattr
3644 * @sid: the SELinux SID
3645 * @secattr: the NetLabel packet security attributes
3648 * Convert the given SELinux SID in @sid into a NetLabel security attribute.
3649 * Returns zero on success, negative values on failure.
3652 int security_netlbl_sid_to_secattr(struct selinux_state
*state
,
3653 u32 sid
, struct netlbl_lsm_secattr
*secattr
)
3655 struct policydb
*policydb
= &state
->ss
->policydb
;
3657 struct context
*ctx
;
3659 if (!state
->initialized
)
3662 read_lock(&state
->ss
->policy_rwlock
);
3665 ctx
= sidtab_search(state
->ss
->sidtab
, sid
);
3670 secattr
->domain
= kstrdup(sym_name(policydb
, SYM_TYPES
, ctx
->type
- 1),
3672 if (secattr
->domain
== NULL
)
3675 secattr
->attr
.secid
= sid
;
3676 secattr
->flags
|= NETLBL_SECATTR_DOMAIN_CPY
| NETLBL_SECATTR_SECID
;
3677 mls_export_netlbl_lvl(policydb
, ctx
, secattr
);
3678 rc
= mls_export_netlbl_cat(policydb
, ctx
, secattr
);
3680 read_unlock(&state
->ss
->policy_rwlock
);
3683 #endif /* CONFIG_NETLABEL */
3686 * security_read_policy - read the policy.
3687 * @data: binary policy data
3688 * @len: length of data in bytes
3691 int security_read_policy(struct selinux_state
*state
,
3692 void **data
, size_t *len
)
3694 struct policydb
*policydb
= &state
->ss
->policydb
;
3696 struct policy_file fp
;
3698 if (!state
->initialized
)
3701 *len
= security_policydb_len(state
);
3703 *data
= vmalloc_user(*len
);
3710 read_lock(&state
->ss
->policy_rwlock
);
3711 rc
= policydb_write(policydb
, &fp
);
3712 read_unlock(&state
->ss
->policy_rwlock
);
3717 *len
= (unsigned long)fp
.data
- (unsigned long)*data
;