For what are marked as the Legacy Major LSMs, make them effectively
exclusive when selected on the "security=" boot parameter, to handle
the future case of when a previously major LSMs become non-exclusive
(e.g. when TOMOYO starts blob-sharing).

Signed-off-by: Kees Cook <keesc...@chromium.org>
Reviewed-by: Casey Schaufler <ca...@schaufler-ca.com>
---
 security/security.c | 28 ++++++++++++++++++++--------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/security/security.c b/security/security.c
index f4a7b7d52d71..a7889885585e 100644
--- a/security/security.c
+++ b/security/security.c
@@ -129,14 +129,6 @@ static bool __init lsm_allowed(struct lsm_info *lsm)
        if (!is_enabled(lsm))
                return false;
 
-       /* Skip major-specific checks if not a major LSM. */
-       if ((lsm->flags & LSM_FLAG_LEGACY_MAJOR) == 0)
-               return true;
-
-       /* Disabled if this LSM isn't the chosen one. */
-       if (strcmp(lsm->name, chosen_major_lsm) != 0)
-               return false;
-
        return true;
 }
 
@@ -164,8 +156,28 @@ static void __init ordered_lsm_parse(const char *order, 
const char *origin)
        struct lsm_info *lsm;
        char *sep, *name, *next;
 
+       /* Process "security=", if given. */
        if (!chosen_major_lsm)
                chosen_major_lsm = CONFIG_DEFAULT_SECURITY;
+       if (chosen_major_lsm) {
+               struct lsm_info *major;
+
+               /*
+                * To match the original "security=" behavior, this
+                * explicitly does NOT fallback to another Legacy Major
+                * if the selected one was separately disabled: disable
+                * all non-matching Legacy Major LSMs.
+                */
+               for (major = __start_lsm_info; major < __end_lsm_info;
+                    major++) {
+                       if ((major->flags & LSM_FLAG_LEGACY_MAJOR) &&
+                           strcmp(major->name, chosen_major_lsm) != 0) {
+                               set_enabled(major, false);
+                               init_debug("security=%s disabled: %s\n",
+                                          chosen_major_lsm, major->name);
+                       }
+               }
+       }
 
        sep = kstrdup(order, GFP_KERNEL);
        next = sep;
-- 
2.14.5


_______________________________________________
Selinux mailing list
Selinux@tycho.nsa.gov
To unsubscribe, send email to selinux-le...@tycho.nsa.gov.
To get help, send an email containing "help" to selinux-requ...@tycho.nsa.gov.

Reply via email to