aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Morris <james.morris@microsoft.com>2018-10-18 20:20:08 -0400
committerJames Morris <james.morris@microsoft.com>2018-10-18 20:20:08 -0400
commit85a585918fb4122ad26b6febaec5c3c90bf2535c (patch)
tree1d228acd4b740bfb291d84c553ecd641ee2ca2ff
parent3f6caaf5ff33073ca1a3a0b82edacab3c57c38f9 (diff)
parent13523bef1e2154b6d02836cd0f6c0ffc89b2eae6 (diff)
Merge tag 'loadpin-security-next' of https://git.kernel.org/pub/scm/linux/kernel/git/kees/linux into next-loadpin
LoadPin: report improvement and parameter renaming - Report human-readable device name during init - Change boot parameter and Kconfig "enabled" to "enforce"
-rw-r--r--security/loadpin/Kconfig4
-rw-r--r--security/loadpin/loadpin.c26
2 files changed, 17 insertions, 13 deletions
diff --git a/security/loadpin/Kconfig b/security/loadpin/Kconfig
index dd01aa91e521..a0d70d82b98e 100644
--- a/security/loadpin/Kconfig
+++ b/security/loadpin/Kconfig
@@ -10,10 +10,10 @@ config SECURITY_LOADPIN
10 have a root filesystem backed by a read-only device such as 10 have a root filesystem backed by a read-only device such as
11 dm-verity or a CDROM. 11 dm-verity or a CDROM.
12 12
13config SECURITY_LOADPIN_ENABLED 13config SECURITY_LOADPIN_ENFORCE
14 bool "Enforce LoadPin at boot" 14 bool "Enforce LoadPin at boot"
15 depends on SECURITY_LOADPIN 15 depends on SECURITY_LOADPIN
16 help 16 help
17 If selected, LoadPin will enforce pinning at boot. If not 17 If selected, LoadPin will enforce pinning at boot. If not
18 selected, it can be enabled at boot with the kernel parameter 18 selected, it can be enabled at boot with the kernel parameter
19 "loadpin.enabled=1". 19 "loadpin.enforce=1".
diff --git a/security/loadpin/loadpin.c b/security/loadpin/loadpin.c
index 0716af28808a..48f39631b370 100644
--- a/security/loadpin/loadpin.c
+++ b/security/loadpin/loadpin.c
@@ -44,7 +44,7 @@ static void report_load(const char *origin, struct file *file, char *operation)
44 kfree(pathname); 44 kfree(pathname);
45} 45}
46 46
47static int enabled = IS_ENABLED(CONFIG_SECURITY_LOADPIN_ENABLED); 47static int enforce = IS_ENABLED(CONFIG_SECURITY_LOADPIN_ENFORCE);
48static struct super_block *pinned_root; 48static struct super_block *pinned_root;
49static DEFINE_SPINLOCK(pinned_root_spinlock); 49static DEFINE_SPINLOCK(pinned_root_spinlock);
50 50
@@ -60,8 +60,8 @@ static struct ctl_path loadpin_sysctl_path[] = {
60 60
61static struct ctl_table loadpin_sysctl_table[] = { 61static struct ctl_table loadpin_sysctl_table[] = {
62 { 62 {
63 .procname = "enabled", 63 .procname = "enforce",
64 .data = &enabled, 64 .data = &enforce,
65 .maxlen = sizeof(int), 65 .maxlen = sizeof(int),
66 .mode = 0644, 66 .mode = 0644,
67 .proc_handler = proc_dointvec_minmax, 67 .proc_handler = proc_dointvec_minmax,
@@ -84,8 +84,11 @@ static void check_pinning_enforcement(struct super_block *mnt_sb)
84 * device, allow sysctl to change modes for testing. 84 * device, allow sysctl to change modes for testing.
85 */ 85 */
86 if (mnt_sb->s_bdev) { 86 if (mnt_sb->s_bdev) {
87 char bdev[BDEVNAME_SIZE];
88
87 ro = bdev_read_only(mnt_sb->s_bdev); 89 ro = bdev_read_only(mnt_sb->s_bdev);
88 pr_info("dev(%u,%u): %s\n", 90 bdevname(mnt_sb->s_bdev, bdev);
91 pr_info("%s (%u:%u): %s\n", bdev,
89 MAJOR(mnt_sb->s_bdev->bd_dev), 92 MAJOR(mnt_sb->s_bdev->bd_dev),
90 MINOR(mnt_sb->s_bdev->bd_dev), 93 MINOR(mnt_sb->s_bdev->bd_dev),
91 ro ? "read-only" : "writable"); 94 ro ? "read-only" : "writable");
@@ -97,7 +100,7 @@ static void check_pinning_enforcement(struct super_block *mnt_sb)
97 loadpin_sysctl_table)) 100 loadpin_sysctl_table))
98 pr_notice("sysctl registration failed!\n"); 101 pr_notice("sysctl registration failed!\n");
99 else 102 else
100 pr_info("load pinning can be disabled.\n"); 103 pr_info("enforcement can be disabled.\n");
101 } else 104 } else
102 pr_info("load pinning engaged.\n"); 105 pr_info("load pinning engaged.\n");
103} 106}
@@ -128,7 +131,7 @@ static int loadpin_read_file(struct file *file, enum kernel_read_file_id id)
128 131
129 /* This handles the older init_module API that has a NULL file. */ 132 /* This handles the older init_module API that has a NULL file. */
130 if (!file) { 133 if (!file) {
131 if (!enabled) { 134 if (!enforce) {
132 report_load(origin, NULL, "old-api-pinning-ignored"); 135 report_load(origin, NULL, "old-api-pinning-ignored");
133 return 0; 136 return 0;
134 } 137 }
@@ -151,7 +154,7 @@ static int loadpin_read_file(struct file *file, enum kernel_read_file_id id)
151 * Unlock now since it's only pinned_root we care about. 154 * Unlock now since it's only pinned_root we care about.
152 * In the worst case, we will (correctly) report pinning 155 * In the worst case, we will (correctly) report pinning
153 * failures before we have announced that pinning is 156 * failures before we have announced that pinning is
154 * enabled. This would be purely cosmetic. 157 * enforcing. This would be purely cosmetic.
155 */ 158 */
156 spin_unlock(&pinned_root_spinlock); 159 spin_unlock(&pinned_root_spinlock);
157 check_pinning_enforcement(pinned_root); 160 check_pinning_enforcement(pinned_root);
@@ -161,7 +164,7 @@ static int loadpin_read_file(struct file *file, enum kernel_read_file_id id)
161 } 164 }
162 165
163 if (IS_ERR_OR_NULL(pinned_root) || load_root != pinned_root) { 166 if (IS_ERR_OR_NULL(pinned_root) || load_root != pinned_root) {
164 if (unlikely(!enabled)) { 167 if (unlikely(!enforce)) {
165 report_load(origin, file, "pinning-ignored"); 168 report_load(origin, file, "pinning-ignored");
166 return 0; 169 return 0;
167 } 170 }
@@ -186,10 +189,11 @@ static struct security_hook_list loadpin_hooks[] __lsm_ro_after_init = {
186 189
187void __init loadpin_add_hooks(void) 190void __init loadpin_add_hooks(void)
188{ 191{
189 pr_info("ready to pin (currently %sabled)", enabled ? "en" : "dis"); 192 pr_info("ready to pin (currently %senforcing)\n",
193 enforce ? "" : "not ");
190 security_add_hooks(loadpin_hooks, ARRAY_SIZE(loadpin_hooks), "loadpin"); 194 security_add_hooks(loadpin_hooks, ARRAY_SIZE(loadpin_hooks), "loadpin");
191} 195}
192 196
193/* Should not be mutable after boot, so not listed in sysfs (perm == 0). */ 197/* Should not be mutable after boot, so not listed in sysfs (perm == 0). */
194module_param(enabled, int, 0); 198module_param(enforce, int, 0);
195MODULE_PARM_DESC(enabled, "Pin module/firmware loading (default: true)"); 199MODULE_PARM_DESC(enforce, "Enforce module/firmware pinning");