1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2021 Microsoft Corporation
7 * Measure critical data structures maintained by SELinux
10 #include <linux/vmalloc.h>
11 #include <linux/ima.h>
16 * selinux_ima_collect_state - Read selinux configuration settings
18 * On success returns the configuration settings string.
19 * On error, returns NULL.
21 static char *selinux_ima_collect_state(void)
23 const char *on = "=1;", *off = "=0;";
25 int buf_len, len, i, rc;
27 buf_len = strlen("initialized=0;enforcing=0;checkreqprot=0;") + 1;
30 for (i = 0; i < __POLICYDB_CAP_MAX; i++)
31 buf_len += strlen(selinux_policycap_names[i]) + len;
33 buf = kzalloc(buf_len, GFP_KERNEL);
37 rc = strscpy(buf, "initialized", buf_len);
40 rc = strlcat(buf, selinux_initialized() ? on : off, buf_len);
41 WARN_ON(rc >= buf_len);
43 rc = strlcat(buf, "enforcing", buf_len);
44 WARN_ON(rc >= buf_len);
46 rc = strlcat(buf, enforcing_enabled() ? on : off, buf_len);
47 WARN_ON(rc >= buf_len);
49 rc = strlcat(buf, "checkreqprot", buf_len);
50 WARN_ON(rc >= buf_len);
52 rc = strlcat(buf, checkreqprot_get() ? on : off, buf_len);
53 WARN_ON(rc >= buf_len);
55 for (i = 0; i < __POLICYDB_CAP_MAX; i++) {
56 rc = strlcat(buf, selinux_policycap_names[i], buf_len);
57 WARN_ON(rc >= buf_len);
59 rc = strlcat(buf, selinux_state.policycap[i] ? on : off,
61 WARN_ON(rc >= buf_len);
68 * selinux_ima_measure_state_locked - Measure SELinux state and hash of policy
70 void selinux_ima_measure_state_locked(void)
72 char *state_str = NULL;
77 lockdep_assert_held(&selinux_state.policy_mutex);
79 state_str = selinux_ima_collect_state();
81 pr_err("SELinux: %s: failed to read state.\n", __func__);
85 ima_measure_critical_data("selinux", "selinux-state",
86 state_str, strlen(state_str), false,
92 * Measure SELinux policy only after initialization is completed.
94 if (!selinux_initialized())
97 rc = security_read_state_kernel(&policy, &policy_len);
99 pr_err("SELinux: %s: failed to read policy %d.\n", __func__, rc);
103 ima_measure_critical_data("selinux", "selinux-policy-hash",
104 policy, policy_len, true,
111 * selinux_ima_measure_state - Measure SELinux state and hash of policy
113 void selinux_ima_measure_state(void)
115 lockdep_assert_not_held(&selinux_state.policy_mutex);
117 mutex_lock(&selinux_state.policy_mutex);
118 selinux_ima_measure_state_locked();
119 mutex_unlock(&selinux_state.policy_mutex);