1 // SPDX-License-Identifier: GPL-2.0-only
3 * Module and Firmware Pinning Security Module
5 * Copyright 2011-2016 Google Inc.
7 * Author: Kees Cook <keescook@chromium.org>
10 #define pr_fmt(fmt) "LoadPin: " fmt
12 #include <linux/module.h>
14 #include <linux/kernel_read_file.h>
15 #include <linux/lsm_hooks.h>
16 #include <linux/mount.h>
17 #include <linux/blkdev.h>
18 #include <linux/path.h>
19 #include <linux/sched.h> /* current */
20 #include <linux/string_helpers.h>
21 #include <linux/dm-verity-loadpin.h>
22 #include <uapi/linux/loadpin.h>
23 #include <uapi/linux/lsm.h>
25 #define VERITY_DIGEST_FILE_HEADER "# LOADPIN_TRUSTED_VERITY_ROOT_DIGESTS"
27 static void report_load(const char *origin
, struct file
*file
, char *operation
)
29 char *cmdline
, *pathname
;
31 pathname
= kstrdup_quotable_file(file
, GFP_KERNEL
);
32 cmdline
= kstrdup_quotable_cmdline(current
, GFP_KERNEL
);
34 pr_notice("%s %s obj=%s%s%s pid=%d cmdline=%s%s%s\n",
36 (pathname
&& pathname
[0] != '<') ? "\"" : "",
38 (pathname
&& pathname
[0] != '<') ? "\"" : "",
40 cmdline
? "\"" : "", cmdline
, cmdline
? "\"" : "");
46 static int enforce
= IS_ENABLED(CONFIG_SECURITY_LOADPIN_ENFORCE
);
47 static char *exclude_read_files
[READING_MAX_ID
];
48 static int ignore_read_file_id
[READING_MAX_ID
] __ro_after_init
;
49 static struct super_block
*pinned_root
;
50 static DEFINE_SPINLOCK(pinned_root_spinlock
);
51 #ifdef CONFIG_SECURITY_LOADPIN_VERITY
52 static bool deny_reading_verity_digests
;
56 static struct ctl_table loadpin_sysctl_table
[] = {
58 .procname
= "enforce",
60 .maxlen
= sizeof(int),
62 .proc_handler
= proc_dointvec_minmax
,
68 static void set_sysctl(bool is_writable
)
71 * If load pinning is not enforced via a read-only block
72 * device, allow sysctl to change modes for testing.
75 loadpin_sysctl_table
[0].extra1
= SYSCTL_ZERO
;
77 loadpin_sysctl_table
[0].extra1
= SYSCTL_ONE
;
80 static inline void set_sysctl(bool is_writable
) { }
83 static void report_writable(struct super_block
*mnt_sb
, bool writable
)
86 pr_info("%pg (%u:%u): %s\n", mnt_sb
->s_bdev
,
87 MAJOR(mnt_sb
->s_bdev
->bd_dev
),
88 MINOR(mnt_sb
->s_bdev
->bd_dev
),
89 writable
? "writable" : "read-only");
91 pr_info("mnt_sb lacks block device, treating as: writable\n");
94 pr_info("load pinning engaged.\n");
98 * This must be called after early kernel init, since then the rootdev
101 static bool sb_is_writable(struct super_block
*mnt_sb
)
103 bool writable
= true;
106 writable
= !bdev_read_only(mnt_sb
->s_bdev
);
111 static void loadpin_sb_free_security(struct super_block
*mnt_sb
)
114 * When unmounting the filesystem we were using for load
115 * pinning, we acknowledge the superblock release, but make sure
116 * no other modules or firmware can be loaded when we are in
117 * enforcing mode. Otherwise, allow the root to be reestablished.
119 if (!IS_ERR_OR_NULL(pinned_root
) && mnt_sb
== pinned_root
) {
121 pinned_root
= ERR_PTR(-EIO
);
122 pr_info("umount pinned fs: refusing further loads\n");
129 static int loadpin_check(struct file
*file
, enum kernel_read_file_id id
)
131 struct super_block
*load_root
;
132 const char *origin
= kernel_read_file_id_str(id
);
133 bool first_root_pin
= false;
134 bool load_root_writable
;
136 /* If the file id is excluded, ignore the pinning. */
137 if ((unsigned int)id
< ARRAY_SIZE(ignore_read_file_id
) &&
138 ignore_read_file_id
[id
]) {
139 report_load(origin
, file
, "pinning-excluded");
143 /* This handles the older init_module API that has a NULL file. */
146 report_load(origin
, NULL
, "old-api-pinning-ignored");
150 report_load(origin
, NULL
, "old-api-denied");
154 load_root
= file
->f_path
.mnt
->mnt_sb
;
155 load_root_writable
= sb_is_writable(load_root
);
157 /* First loaded module/firmware defines the root for all others. */
158 spin_lock(&pinned_root_spinlock
);
160 * pinned_root is only NULL at startup or when the pinned root has
161 * been unmounted while we are not in enforcing mode. Otherwise, it
162 * is either a valid reference, or an ERR_PTR.
165 pinned_root
= load_root
;
166 first_root_pin
= true;
168 spin_unlock(&pinned_root_spinlock
);
170 if (first_root_pin
) {
171 report_writable(pinned_root
, load_root_writable
);
172 set_sysctl(load_root_writable
);
173 report_load(origin
, file
, "pinned");
176 if (IS_ERR_OR_NULL(pinned_root
) ||
177 ((load_root
!= pinned_root
) && !dm_verity_loadpin_is_bdev_trusted(load_root
->s_bdev
))) {
178 if (unlikely(!enforce
)) {
179 report_load(origin
, file
, "pinning-ignored");
183 report_load(origin
, file
, "denied");
190 static int loadpin_read_file(struct file
*file
, enum kernel_read_file_id id
,
194 * LoadPin only cares about the _origin_ of a file, not its
195 * contents, so we can ignore the "are full contents available"
198 return loadpin_check(file
, id
);
201 static int loadpin_load_data(enum kernel_load_data_id id
, bool contents
)
204 * LoadPin only cares about the _origin_ of a file, not its
205 * contents, so a NULL file is passed, and we can ignore the
206 * state of "contents".
208 return loadpin_check(NULL
, (enum kernel_read_file_id
) id
);
211 static const struct lsm_id loadpin_lsmid
= {
213 .id
= LSM_ID_LOADPIN
,
216 static struct security_hook_list loadpin_hooks
[] __ro_after_init
= {
217 LSM_HOOK_INIT(sb_free_security
, loadpin_sb_free_security
),
218 LSM_HOOK_INIT(kernel_read_file
, loadpin_read_file
),
219 LSM_HOOK_INIT(kernel_load_data
, loadpin_load_data
),
222 static void __init
parse_exclude(void)
228 * Make sure all the arrays stay within expected sizes. This
229 * is slightly weird because kernel_read_file_str[] includes
230 * READING_MAX_ID, which isn't actually meaningful here.
232 BUILD_BUG_ON(ARRAY_SIZE(exclude_read_files
) !=
233 ARRAY_SIZE(ignore_read_file_id
));
234 BUILD_BUG_ON(ARRAY_SIZE(kernel_read_file_str
) <
235 ARRAY_SIZE(ignore_read_file_id
));
237 for (i
= 0; i
< ARRAY_SIZE(exclude_read_files
); i
++) {
238 cur
= exclude_read_files
[i
];
244 for (j
= 0; j
< ARRAY_SIZE(ignore_read_file_id
); j
++) {
245 if (strcmp(cur
, kernel_read_file_str
[j
]) == 0) {
246 pr_info("excluding: %s\n",
247 kernel_read_file_str
[j
]);
248 ignore_read_file_id
[j
] = 1;
250 * Can not break, because one read_file_str
251 * may map to more than on read_file_id.
258 static int __init
loadpin_init(void)
260 pr_info("ready to pin (currently %senforcing)\n",
261 enforce
? "" : "not ");
264 if (!register_sysctl("kernel/loadpin", loadpin_sysctl_table
))
265 pr_notice("sysctl registration failed!\n");
267 security_add_hooks(loadpin_hooks
, ARRAY_SIZE(loadpin_hooks
),
273 DEFINE_LSM(loadpin
) = {
275 .init
= loadpin_init
,
278 #ifdef CONFIG_SECURITY_LOADPIN_VERITY
280 enum loadpin_securityfs_interface_index
{
284 static int read_trusted_verity_root_digests(unsigned int fd
)
290 if (deny_reading_verity_digests
)
293 /* The list of trusted root digests can only be set up once */
294 if (!list_empty(&dm_verity_loadpin_trusted_root_digests
))
301 data
= kzalloc(SZ_4K
, GFP_KERNEL
);
307 rc
= kernel_read_file(fd_file(f
), 0, (void **)&data
, SZ_4K
- 1, NULL
, READING_POLICY
);
316 while ((d
= strsep(&p
, "\n")) != NULL
) {
318 struct dm_verity_loadpin_trusted_root_digest
*trd
;
321 /* first line, validate header */
322 if (strcmp(d
, VERITY_DIGEST_FILE_HEADER
)) {
339 trd
= kzalloc(struct_size(trd
, data
, len
), GFP_KERNEL
);
346 if (hex2bin(trd
->data
, d
, len
)) {
352 list_add_tail(&trd
->node
, &dm_verity_loadpin_trusted_root_digests
);
355 if (list_empty(&dm_verity_loadpin_trusted_root_digests
)) {
367 /* any failure in loading/parsing invalidates the entire list */
369 struct dm_verity_loadpin_trusted_root_digest
*trd
, *tmp
;
371 list_for_each_entry_safe(trd
, tmp
, &dm_verity_loadpin_trusted_root_digests
, node
) {
372 list_del(&trd
->node
);
377 /* disallow further attempts after reading a corrupt/invalid file */
378 deny_reading_verity_digests
= true;
383 /******************************** securityfs ********************************/
385 static long dm_verity_ioctl(struct file
*filp
, unsigned int cmd
, unsigned long arg
)
387 void __user
*uarg
= (void __user
*)arg
;
391 case LOADPIN_IOC_SET_TRUSTED_VERITY_DIGESTS
:
392 if (copy_from_user(&fd
, uarg
, sizeof(fd
)))
395 return read_trusted_verity_root_digests(fd
);
402 static const struct file_operations loadpin_dm_verity_ops
= {
403 .unlocked_ioctl
= dm_verity_ioctl
,
404 .compat_ioctl
= compat_ptr_ioctl
,
408 * init_loadpin_securityfs - create the securityfs directory for LoadPin
410 * We can not put this method normally under the loadpin_init() code path since
411 * the security subsystem gets initialized before the vfs caches.
413 * Returns 0 if the securityfs directory creation was successful.
415 static int __init
init_loadpin_securityfs(void)
417 struct dentry
*loadpin_dir
, *dentry
;
419 loadpin_dir
= securityfs_create_dir("loadpin", NULL
);
420 if (IS_ERR(loadpin_dir
)) {
421 pr_err("LoadPin: could not create securityfs dir: %ld\n",
422 PTR_ERR(loadpin_dir
));
423 return PTR_ERR(loadpin_dir
);
426 dentry
= securityfs_create_file("dm-verity", 0600, loadpin_dir
,
427 (void *)LOADPIN_DM_VERITY
, &loadpin_dm_verity_ops
);
428 if (IS_ERR(dentry
)) {
429 pr_err("LoadPin: could not create securityfs entry 'dm-verity': %ld\n",
431 return PTR_ERR(dentry
);
437 fs_initcall(init_loadpin_securityfs
);
439 #endif /* CONFIG_SECURITY_LOADPIN_VERITY */
441 /* Should not be mutable after boot, so not listed in sysfs (perm == 0). */
442 module_param(enforce
, int, 0);
443 MODULE_PARM_DESC(enforce
, "Enforce module/firmware pinning");
444 module_param_array_named(exclude
, exclude_read_files
, charp
, NULL
, 0);
445 MODULE_PARM_DESC(exclude
, "Exclude pinning specific read file types");