All of lore.kernel.org
 help / color / mirror / Atom feed
From: Casey Schaufler <casey@schaufler-ca.com>
To: casey@schaufler-ca.com, paul@paul-moore.com,
	linux-security-module@vger.kernel.org
Cc: jmorris@namei.org, keescook@chromium.org,
	john.johansen@canonical.com, penguin-kernel@i-love.sakura.ne.jp,
	stephen.smalley.work@gmail.com, linux-kernel@vger.kernel.org,
	linux-api@vger.kernel.org, mic@digikod.net
Subject: [PATCH v10 02/11] LSM: Maintain a table of LSM attribute data
Date: Fri, 28 Apr 2023 13:34:08 -0700	[thread overview]
Message-ID: <20230428203417.159874-3-casey@schaufler-ca.com> (raw)
In-Reply-To: <20230428203417.159874-1-casey@schaufler-ca.com>

As LSMs are registered add their lsm_id pointers to a table.
This will be used later for attribute reporting.

Determine the number of possible security modules based on
their respective CONFIG options. This allows the number to be
known at build time. This allows data structures and tables
to use the constant.

Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
Reviewed-by: Kees Cook <keescook@chromium.org>
---
 include/linux/security.h |  2 ++
 security/security.c      | 36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+)

diff --git a/include/linux/security.h b/include/linux/security.h
index 5984d0d550b4..e70fc863b04a 100644
--- a/include/linux/security.h
+++ b/include/linux/security.h
@@ -138,6 +138,8 @@ enum lockdown_reason {
 };
 
 extern const char *const lockdown_reasons[LOCKDOWN_CONFIDENTIALITY_MAX+1];
+extern u32 lsm_active_cnt;
+extern struct lsm_id *lsm_idlist[];
 
 /* These functions are in security/commoncap.c */
 extern int cap_capable(const struct cred *cred, struct user_namespace *ns,
diff --git a/security/security.c b/security/security.c
index a482c6048df9..e390001a32c9 100644
--- a/security/security.c
+++ b/security/security.c
@@ -35,6 +35,25 @@
 /* How many LSMs were built into the kernel? */
 #define LSM_COUNT (__end_lsm_info - __start_lsm_info)
 
+/*
+ * How many LSMs are built into the kernel as determined at
+ * build time. Used to determine fixed array sizes.
+ * The capability module is accounted for by CONFIG_SECURITY
+ */
+#define LSM_CONFIG_COUNT ( \
+	(IS_ENABLED(CONFIG_SECURITY) ? 1 : 0) + \
+	(IS_ENABLED(CONFIG_SECURITY_SELINUX) ? 1 : 0) + \
+	(IS_ENABLED(CONFIG_SECURITY_SMACK) ? 1 : 0) + \
+	(IS_ENABLED(CONFIG_SECURITY_TOMOYO) ? 1 : 0) + \
+	(IS_ENABLED(CONFIG_IMA) ? 1 : 0) + \
+	(IS_ENABLED(CONFIG_SECURITY_APPARMOR) ? 1 : 0) + \
+	(IS_ENABLED(CONFIG_SECURITY_YAMA) ? 1 : 0) + \
+	(IS_ENABLED(CONFIG_SECURITY_LOADPIN) ? 1 : 0) + \
+	(IS_ENABLED(CONFIG_SECURITY_SAFESETID) ? 1 : 0) + \
+	(IS_ENABLED(CONFIG_SECURITY_LOCKDOWN_LSM) ? 1 : 0) + \
+	(IS_ENABLED(CONFIG_BPF_LSM) ? 1 : 0) + \
+	(IS_ENABLED(CONFIG_SECURITY_LANDLOCK) ? 1 : 0))
+
 /*
  * These are descriptions of the reasons that can be passed to the
  * security_locked_down() LSM hook. Placing this array here allows
@@ -244,6 +263,12 @@ static void __init initialize_lsm(struct lsm_info *lsm)
 	}
 }
 
+/*
+ * Current index to use while initializing the lsm id list.
+ */
+u32 lsm_active_cnt __lsm_ro_after_init;
+struct lsm_id *lsm_idlist[LSM_CONFIG_COUNT] __lsm_ro_after_init;
+
 /* Populate ordered LSMs list from comma-separated LSM name list. */
 static void __init ordered_lsm_parse(const char *order, const char *origin)
 {
@@ -513,6 +538,17 @@ void __init security_add_hooks(struct security_hook_list *hooks, int count,
 {
 	int i;
 
+	if (lsm_active_cnt >= LSM_CONFIG_COUNT)
+		panic("%s Too many LSMs registered.\n", __func__);
+	/*
+	 * A security module may call security_add_hooks() more
+	 * than once during initialization, and LSM initialization
+	 * is serialized. Landlock is one such case.
+	 * Look at the previous entry, if there is one, for duplication.
+	 */
+	if (lsm_active_cnt == 0 || lsm_idlist[lsm_active_cnt - 1] != lsmid)
+		lsm_idlist[lsm_active_cnt++] = lsmid;
+
 	for (i = 0; i < count; i++) {
 		hooks[i].lsmid = lsmid;
 		hlist_add_tail_rcu(&hooks[i].list, hooks[i].head);
-- 
2.39.2


  parent reply	other threads:[~2023-04-28 20:34 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20230428203417.159874-1-casey.ref@schaufler-ca.com>
2023-04-28 20:34 ` [PATCH v10 00/11] LSM: Three basic syscalls Casey Schaufler
2023-04-28 20:34   ` [PATCH v10 01/11] LSM: Identify modules by more than name Casey Schaufler
2023-04-28 20:34   ` Casey Schaufler [this message]
2023-04-28 20:34   ` [PATCH v10 03/11] proc: Use lsmids instead of lsm names for attrs Casey Schaufler
2023-06-13 18:35     ` Serge Hallyn
2023-04-28 20:34   ` [PATCH v10 04/11] LSM: syscalls for current process attributes Casey Schaufler
2023-06-07 22:32     ` [PATCH v10 4/11] " Paul Moore
2023-06-07 23:26       ` Casey Schaufler
2023-06-13 18:54     ` [PATCH v10 04/11] " Serge Hallyn
2023-04-28 20:34   ` [PATCH v10 05/11] LSM: Create lsm_list_modules system call Casey Schaufler
2023-06-13 19:02     ` Serge Hallyn
2023-04-28 20:34   ` [PATCH v10 06/11] LSM: wireup Linux Security Module syscalls Casey Schaufler
2023-04-28 20:34   ` [PATCH v10 07/11] LSM: Helpers for attribute names and filling lsm_ctx Casey Schaufler
2023-04-29  1:06     ` kernel test robot
2023-04-29  2:37     ` kernel test robot
2023-06-07 22:32     ` [PATCH v10 7/11] " Paul Moore
2023-06-15 13:19     ` [PATCH v10 07/11] " Serge Hallyn
2023-06-15 13:27     ` Serge Hallyn
2023-04-28 20:34   ` [PATCH v10 08/11] Smack: implement setselfattr and getselfattr hooks Casey Schaufler
2023-06-15 15:29     ` Serge Hallyn
2023-04-28 20:34   ` [PATCH v10 09/11] AppArmor: Add selfattr hooks Casey Schaufler
2023-04-28 20:34   ` [PATCH v10 10/11] SELinux: " Casey Schaufler
2023-06-07 22:32     ` Paul Moore
2023-06-07 23:39       ` Casey Schaufler
2023-04-28 20:34   ` [PATCH v10 11/11] LSM: selftests for Linux Security Module syscalls Casey Schaufler
2023-04-28 20:26 [PATCH v10 00/11] LSM: Three basic syscalls Casey Schaufler
2023-04-28 20:26 ` [PATCH v10 02/11] LSM: Maintain a table of LSM attribute data 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=20230428203417.159874-3-casey@schaufler-ca.com \
    --to=casey@schaufler-ca.com \
    --cc=jmorris@namei.org \
    --cc=john.johansen@canonical.com \
    --cc=keescook@chromium.org \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-security-module@vger.kernel.org \
    --cc=mic@digikod.net \
    --cc=paul@paul-moore.com \
    --cc=penguin-kernel@i-love.sakura.ne.jp \
    --cc=stephen.smalley.work@gmail.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.