LSM: Introduce "lsm=" for boottime LSM selection
authorKees Cook <keescook@chromium.org>
Thu, 20 Sep 2018 00:30:09 +0000 (17:30 -0700)
committerKees Cook <keescook@chromium.org>
Tue, 8 Jan 2019 21:18:42 +0000 (13:18 -0800)
Provide a way to explicitly choose LSM initialization order via the new
"lsm=" comma-separated list of LSMs.

Signed-off-by: Kees Cook <keescook@chromium.org>
Documentation/admin-guide/kernel-parameters.txt
security/Kconfig
security/security.c

index b799bcf67d7b5ae080694467442b113b49c92567..e59e1471d4db8da8a5e2c3e8ba623465e63a9e77 100644 (file)
 
        lsm.debug       [SECURITY] Enable LSM initialization debugging output.
 
+       lsm=lsm1,...,lsmN
+                       [SECURITY] Choose order of LSM initialization. This
+                       overrides CONFIG_LSM.
+
        machvec=        [IA-64] Force the use of a particular machine-vector
                        (machvec) in a generic kernel.
                        Example: machvec=hpzx1_swiotlb
index 7f21190cb6774c94219177d80618c883c45ada41..cedf69e8a22c8583a1556467422fefdc9cdb20d1 100644 (file)
@@ -281,7 +281,8 @@ config LSM
        default "integrity"
        help
          A comma-separated list of LSMs, in initialization order.
-         Any LSMs left off this list will be ignored.
+         Any LSMs left off this list will be ignored. This can be
+         controlled at boot with the "lsm=" parameter.
 
          If unsure, leave this as the default.
 
index 11a42cd313c5aba51ae59c40e30f28b3b1013e6d..2e1f48e8a6f2bf6e56bc7b43e18a4f3eff9706d7 100644 (file)
@@ -47,6 +47,7 @@ char *lsm_names;
 /* Boot-time LSM user choice */
 static __initdata char chosen_lsm[SECURITY_NAME_MAX + 1] =
        CONFIG_DEFAULT_SECURITY;
+static __initdata const char *chosen_lsm_order;
 
 static __initconst const char * const builtin_lsm_order = CONFIG_LSM;
 
@@ -190,7 +191,10 @@ static void __init ordered_lsm_init(void)
        ordered_lsms = kcalloc(LSM_COUNT + 1, sizeof(*ordered_lsms),
                                GFP_KERNEL);
 
-       ordered_lsm_parse(builtin_lsm_order, "builtin");
+       if (chosen_lsm_order)
+               ordered_lsm_parse(chosen_lsm_order, "cmdline");
+       else
+               ordered_lsm_parse(builtin_lsm_order, "builtin");
 
        for (lsm = ordered_lsms; *lsm; lsm++)
                maybe_initialize_lsm(*lsm);
@@ -252,6 +256,14 @@ static int __init choose_lsm(char *str)
 }
 __setup("security=", choose_lsm);
 
+/* Explicitly choose LSM initialization order. */
+static int __init choose_lsm_order(char *str)
+{
+       chosen_lsm_order = str;
+       return 1;
+}
+__setup("lsm=", choose_lsm_order);
+
 /* Enable LSM order debugging. */
 static int __init enable_debug(char *str)
 {