|
@@ -17,6 +17,8 @@
|
|
#include <linux/kernel.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/security.h>
|
|
#include <linux/security.h>
|
|
|
|
|
|
|
|
+/* Boot-time LSM user choice */
|
|
|
|
+static __initdata char chosen_lsm[SECURITY_NAME_MAX + 1];
|
|
|
|
|
|
/* things that live in dummy.c */
|
|
/* things that live in dummy.c */
|
|
extern struct security_operations dummy_security_ops;
|
|
extern struct security_operations dummy_security_ops;
|
|
@@ -67,13 +69,47 @@ int __init security_init(void)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/* Save user chosen LSM */
|
|
|
|
+static int __init choose_lsm(char *str)
|
|
|
|
+{
|
|
|
|
+ strncpy(chosen_lsm, str, SECURITY_NAME_MAX);
|
|
|
|
+ return 1;
|
|
|
|
+}
|
|
|
|
+__setup("security=", choose_lsm);
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * security_module_enable - Load given security module on boot ?
|
|
|
|
+ * @ops: a pointer to the struct security_operations that is to be checked.
|
|
|
|
+ *
|
|
|
|
+ * Each LSM must pass this method before registering its own operations
|
|
|
|
+ * to avoid security registration races. This method may also be used
|
|
|
|
+ * to check if your LSM is currently loaded.
|
|
|
|
+ *
|
|
|
|
+ * Return true if:
|
|
|
|
+ * -The passed LSM is the one chosen by user at boot time,
|
|
|
|
+ * -or user didsn't specify a specific LSM and we're the first to ask
|
|
|
|
+ * for registeration permissoin,
|
|
|
|
+ * -or the passed LSM is currently loaded.
|
|
|
|
+ * Otherwise, return false.
|
|
|
|
+ */
|
|
|
|
+int __init security_module_enable(struct security_operations *ops)
|
|
|
|
+{
|
|
|
|
+ if (!*chosen_lsm)
|
|
|
|
+ strncpy(chosen_lsm, ops->name, SECURITY_NAME_MAX);
|
|
|
|
+ else if (strncmp(ops->name, chosen_lsm, SECURITY_NAME_MAX))
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ return 1;
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* register_security - registers a security framework with the kernel
|
|
* register_security - registers a security framework with the kernel
|
|
* @ops: a pointer to the struct security_options that is to be registered
|
|
* @ops: a pointer to the struct security_options that is to be registered
|
|
*
|
|
*
|
|
* This function is to allow a security module to register itself with the
|
|
* This function is to allow a security module to register itself with the
|
|
* kernel security subsystem. Some rudimentary checking is done on the @ops
|
|
* kernel security subsystem. Some rudimentary checking is done on the @ops
|
|
- * value passed to this function.
|
|
|
|
|
|
+ * value passed to this function. You'll need to check first if your LSM
|
|
|
|
+ * is allowed to register its @ops by calling security_module_enable(@ops).
|
|
*
|
|
*
|
|
* If there is already a security module registered with the kernel,
|
|
* If there is already a security module registered with the kernel,
|
|
* an error will be returned. Otherwise 0 is returned on success.
|
|
* an error will be returned. Otherwise 0 is returned on success.
|