selinux.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Paul Moore <paul@paul-moore.com>
To: linux-security-module@vger.kernel.org,
	linux-integrity@vger.kernel.org, selinux@vger.kernel.org
Cc: "John Johansen" <john.johansen@canonical.com>,
	"Mimi Zohar" <zohar@linux.ibm.com>,
	"Roberto Sassu" <roberto.sassu@huawei.com>,
	"Fan Wu" <wufan@kernel.org>, "Mickaël Salaün" <mic@digikod.net>,
	"Günther Noack" <gnoack@google.com>,
	"Kees Cook" <kees@kernel.org>,
	"Micah Morton" <mortonm@chromium.org>,
	"Casey Schaufler" <casey@schaufler-ca.com>,
	"Tetsuo Handa" <penguin-kernel@I-love.SAKURA.ne.jp>,
	"Nicolas Bouchinet" <nicolas.bouchinet@oss.cyber.gouv.fr>,
	"Xiu Jianfeng" <xiujianfeng@huawei.com>
Subject: [RFC PATCH v2 31/34] ima,evm: move initcalls to the LSM framework
Date: Mon, 21 Jul 2025 19:21:34 -0400	[thread overview]
Message-ID: <20250721232142.77224-67-paul@paul-moore.com> (raw)
In-Reply-To: <20250721232142.77224-36-paul@paul-moore.com>

This patch converts IMA and EVM to use the LSM frameworks's initcall
mechanism.  There was a minor challenge in this conversion that wasn't
seen when converting the other LSMs brought about by the resource
sharing between the two related, yes independent IMA and EVM LSMs.
This was resolved by registering the same initcalls for each LSM and
including code in each registered initcall to ensure it only executes
once during each boot.

It is worth mentioning that this patch does not touch any of the
"platform certs" code that lives in the security/integrity/platform_certs
directory as the IMA/EVM maintainers have assured me that this code is
unrelated to IMA/EVM, despite the location, and will be moved to a more
relevant subsystem in the future.

Signed-off-by: Paul Moore <paul@paul-moore.com>
---
 security/integrity/Makefile       |  2 +-
 security/integrity/evm/evm_main.c |  6 ++---
 security/integrity/iint.c         |  4 +--
 security/integrity/ima/ima_main.c |  6 ++---
 security/integrity/initcalls.c    | 41 +++++++++++++++++++++++++++++++
 security/integrity/initcalls.h    | 13 ++++++++++
 6 files changed, 63 insertions(+), 9 deletions(-)
 create mode 100644 security/integrity/initcalls.c
 create mode 100644 security/integrity/initcalls.h

diff --git a/security/integrity/Makefile b/security/integrity/Makefile
index 92b63039c654..6ea330ea88b1 100644
--- a/security/integrity/Makefile
+++ b/security/integrity/Makefile
@@ -5,7 +5,7 @@
 
 obj-$(CONFIG_INTEGRITY) += integrity.o
 
-integrity-y := iint.o
+integrity-y := iint.o initcalls.o
 integrity-$(CONFIG_INTEGRITY_AUDIT) += integrity_audit.o
 integrity-$(CONFIG_INTEGRITY_SIGNATURE) += digsig.o
 integrity-$(CONFIG_INTEGRITY_ASYMMETRIC_KEYS) += digsig_asymmetric.o
diff --git a/security/integrity/evm/evm_main.c b/security/integrity/evm/evm_main.c
index db8e324ed4e6..823573bcaa27 100644
--- a/security/integrity/evm/evm_main.c
+++ b/security/integrity/evm/evm_main.c
@@ -25,6 +25,7 @@
 #include <crypto/hash.h>
 #include <crypto/hash_info.h>
 #include <crypto/utils.h>
+#include "../initcalls.h"
 #include "evm.h"
 
 int evm_initialized;
@@ -1112,7 +1113,7 @@ void __init evm_load_x509(void)
 }
 #endif
 
-static int __init init_evm(void)
+int __init init_evm(void)
 {
 	int error;
 	struct list_head *pos, *q;
@@ -1179,6 +1180,5 @@ DEFINE_LSM(evm) = {
 	.init = init_evm_lsm,
 	.order = LSM_ORDER_LAST,
 	.blobs = &evm_blob_sizes,
+	.initcall_late = integrity_late_init,
 };
-
-late_initcall(init_evm);
diff --git a/security/integrity/iint.c b/security/integrity/iint.c
index 068ac6c2ae1e..a4b88d67ff43 100644
--- a/security/integrity/iint.c
+++ b/security/integrity/iint.c
@@ -11,6 +11,7 @@
  */
 #include <linux/security.h>
 #include "integrity.h"
+#include "initcalls.h"
 
 struct dentry *integrity_dir;
 
@@ -42,7 +43,7 @@ void __init integrity_load_keys(void)
 		evm_load_x509();
 }
 
-static int __init integrity_fs_init(void)
+int __init integrity_fs_init(void)
 {
 	integrity_dir = securityfs_create_dir("integrity", NULL);
 	if (IS_ERR(integrity_dir)) {
@@ -58,4 +59,3 @@ static int __init integrity_fs_init(void)
 	return 0;
 }
 
-late_initcall(integrity_fs_init)
diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c
index ded971bdeaae..ea9c0ed12e06 100644
--- a/security/integrity/ima/ima_main.c
+++ b/security/integrity/ima/ima_main.c
@@ -27,6 +27,7 @@
 #include <linux/fs.h>
 #include <linux/iversion.h>
 #include <linux/evm.h>
+#include "../initcalls.h"
 
 #include "ima.h"
 
@@ -1182,7 +1183,7 @@ static int ima_kernel_module_request(char *kmod_name)
 
 #endif /* CONFIG_INTEGRITY_ASYMMETRIC_KEYS */
 
-static int __init init_ima(void)
+int __init init_ima(void)
 {
 	int error;
 
@@ -1257,6 +1258,5 @@ DEFINE_LSM(ima) = {
 	.init = init_ima_lsm,
 	.order = LSM_ORDER_LAST,
 	.blobs = &ima_blob_sizes,
+	.initcall_late = integrity_late_init,
 };
-
-late_initcall(init_ima);	/* Start IMA after the TPM is available */
diff --git a/security/integrity/initcalls.c b/security/integrity/initcalls.c
new file mode 100644
index 000000000000..92ec9f0aa2a7
--- /dev/null
+++ b/security/integrity/initcalls.c
@@ -0,0 +1,41 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Platform certificate / keyring initcalls
+ *
+ */
+
+#include <linux/init.h>
+
+#include "initcalls.h"
+
+/**
+ * integrity_late_init - late_initcalls for IMA/EVM
+ *
+ * This helper function wraps all of the late_initcalls for both IMA and EVM.
+ * It can be called multiple times, e.g. once from IMA and once from EVM,
+ * without problem as it maintains an internal static state variable which
+ * ensures that any setup/initialization is only done once.
+ */
+int __init integrity_late_init(void)
+{
+	int rc = 0, rc_tmp;
+	static bool setup = false;
+
+	if (setup)
+		return 0;
+	setup = true;
+
+	rc_tmp = integrity_fs_init();
+	if (!rc && rc_tmp)
+		rc = rc_tmp;
+
+	rc_tmp = init_ima();
+	if (!rc && rc_tmp)
+		rc = rc_tmp;
+
+	rc_tmp = init_evm();
+	if (!rc && rc_tmp)
+		rc = rc_tmp;
+
+	return rc;
+}
diff --git a/security/integrity/initcalls.h b/security/integrity/initcalls.h
new file mode 100644
index 000000000000..5511c62f8166
--- /dev/null
+++ b/security/integrity/initcalls.h
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef PLATFORM_CERTS_INITCALLS_H
+#define PLATFORM_CERTS_INITCALLS_H
+
+int integrity_fs_init(void);
+
+int init_ima(void);
+int init_evm(void);
+
+int integrity_late_init(void);
+
+#endif
-- 
2.50.1


  parent reply	other threads:[~2025-07-21 23:24 UTC|newest]

Thread overview: 77+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-07-21 23:21 [RFC PATCH v2 0/34] Rework the LSM initialization Paul Moore
2025-07-21 23:21 ` [RFC PATCH v2 01/34] lsm: split the notifier code out into lsm_notifier.c Paul Moore
2025-07-24 14:49   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 02/34] lsm: split the init code out into lsm_init.c Paul Moore
2025-07-24 14:50   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 03/34] lsm: consolidate lsm_allowed() and prepare_lsm() into lsm_prepare() Paul Moore
2025-07-24 14:52   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 04/34] lsm: introduce looping macros for the initialization code Paul Moore
2025-07-24 15:10   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 05/34] lsm: integrate report_lsm_order() code into caller Paul Moore
2025-07-24 15:19   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 06/34] lsm: integrate lsm_early_cred() and lsm_early_task() " Paul Moore
2025-07-24 15:20   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 07/34] lsm: rename ordered_lsm_init() to lsm_init_ordered() Paul Moore
2025-07-24 15:28   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 08/34] lsm: replace the name field with a pointer to the lsm_id struct Paul Moore
2025-07-24 15:30   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 09/34] lsm: rename the lsm order variables for consistency Paul Moore
2025-07-24 15:31   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 10/34] lsm: rework lsm_active_cnt and lsm_idlist[] Paul Moore
2025-07-24 15:34   ` Casey Schaufler
2025-07-25  0:26     ` Paul Moore
2025-07-21 23:21 ` [RFC PATCH v2 11/34] lsm: get rid of the lsm_names list and do some cleanup Paul Moore
2025-07-24 15:39   ` Casey Schaufler
2025-07-25  2:28     ` Paul Moore
2025-07-25 14:26       ` Casey Schaufler
2025-07-25 16:42         ` Paul Moore
2025-07-21 23:21 ` [RFC PATCH v2 12/34] lsm: rework the LSM enable/disable setter/getter functions Paul Moore
2025-07-24 15:44   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 13/34] lsm: rename exists_ordered_lsm() to lsm_order_exists() Paul Moore
2025-07-24 15:45   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 14/34] lsm: rename/rework append_ordered_lsm() into lsm_order_append() Paul Moore
2025-07-24 15:47   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 15/34] lsm: rename/rework ordered_lsm_parse() to lsm_order_parse() Paul Moore
2025-07-24 15:48   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 16/34] lsm: cleanup the LSM blob size code Paul Moore
2025-07-24 23:28   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 17/34] lsm: cleanup initialize_lsm() and rename to lsm_init_single() Paul Moore
2025-07-24 23:29   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 18/34] lsm: fold lsm_init_ordered() into security_init() Paul Moore
2025-07-24 23:30   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 19/34] lsm: add/tweak function header comment blocks in lsm_init.c Paul Moore
2025-07-24 23:31   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 20/34] lsm: cleanup the debug and console output " Paul Moore
2025-07-24 23:32   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 21/34] lsm: output available LSMs when debugging Paul Moore
2025-07-24 23:33   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 22/34] lsm: group lsm_order_parse() with the other lsm_order_*() functions Paul Moore
2025-07-24 23:34   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 23/34] lsm: introduce an initcall mechanism into the LSM framework Paul Moore
2025-07-24 23:35   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 24/34] loadpin: move initcalls to " Paul Moore
2025-07-21 23:21 ` [RFC PATCH v2 25/34] ipe: " Paul Moore
2025-07-21 23:21 ` [RFC PATCH v2 26/34] smack: " Paul Moore
2025-07-24 23:36   ` Casey Schaufler
2025-07-28  9:46   ` Roberto Sassu
2025-07-28 22:34     ` Paul Moore
2025-07-28 23:56       ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 27/34] tomoyo: " Paul Moore
2025-07-21 23:21 ` [RFC PATCH v2 28/34] safesetid: " Paul Moore
2025-07-21 23:21 ` [RFC PATCH v2 29/34] apparmor: " Paul Moore
2025-07-21 23:21 ` [RFC PATCH v2 30/34] lockdown: " Paul Moore
2025-07-25  8:12   ` Xiu Jianfeng
2025-07-25 16:51     ` Paul Moore
2025-07-26  9:38       ` xiujianfeng
2025-07-28 21:49         ` Paul Moore
2025-07-21 23:21 ` Paul Moore [this message]
2025-07-21 23:30   ` [RFC PATCH v2 31/34] ima,evm: " Paul Moore
2025-07-21 23:34     ` Paul Moore
2025-07-28  9:46   ` Nicolas Bouchinet
2025-07-28 10:43     ` Roberto Sassu
2025-07-28 23:17       ` Paul Moore
2025-07-21 23:21 ` [RFC PATCH v2 32/34] selinux: " Paul Moore
2025-07-21 23:21 ` [RFC PATCH v2 33/34] lsm: consolidate all of the LSM framework initcalls Paul Moore
2025-07-24 23:37   ` Casey Schaufler
2025-07-21 23:21 ` [RFC PATCH v2 34/34] lsm: add a LSM_STARTED_ALL notification event Paul Moore
2025-07-24 23:38   ` Casey Schaufler

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250721232142.77224-67-paul@paul-moore.com \
    --to=paul@paul-moore.com \
    --cc=casey@schaufler-ca.com \
    --cc=gnoack@google.com \
    --cc=john.johansen@canonical.com \
    --cc=kees@kernel.org \
    --cc=linux-integrity@vger.kernel.org \
    --cc=linux-security-module@vger.kernel.org \
    --cc=mic@digikod.net \
    --cc=mortonm@chromium.org \
    --cc=nicolas.bouchinet@oss.cyber.gouv.fr \
    --cc=penguin-kernel@I-love.SAKURA.ne.jp \
    --cc=roberto.sassu@huawei.com \
    --cc=selinux@vger.kernel.org \
    --cc=wufan@kernel.org \
    --cc=xiujianfeng@huawei.com \
    --cc=zohar@linux.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).