-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
LoadPin limits loading of kernel modules, firmware and certain other files to a 'pinned' file system (typically a read-only rootfs). To provide more flexibility LoadPin is being extended to also allow loading these files from trusted dm-verity devices. For that purpose LoadPin can be provided with a list of verity root digests that it should consider as trusted. Add a bunch of helpers to allow LoadPin to check whether a DM device is a trusted verity device. The new functions broadly fall in two categories: those that need access to verity internals (like the root digest), and the 'glue' between LoadPin and verity. The new file dm-verity-loadpin.c contains the glue functions. Signed-off-by: Matthias Kaehlcke <mka@chromium.org> Acked-by: Mike Snitzer <snitzer@kernel.org> Link: https://lore.kernel.org/lkml/20220627083512.v7.1.I3e928575a23481121e73286874c4c2bdb403355d@changeid Signed-off-by: Kees Cook <keescook@chromium.org>
- Loading branch information
Matthias Kaehlcke
authored and
Kees Cook
committed
Jul 8, 2022
1 parent
375561b
commit b6c1c57
Showing
5 changed files
with
143 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
|
||
#include <linux/list.h> | ||
#include <linux/kernel.h> | ||
#include <linux/dm-verity-loadpin.h> | ||
|
||
#include "dm.h" | ||
#include "dm-verity.h" | ||
|
||
#define DM_MSG_PREFIX "verity-loadpin" | ||
|
||
LIST_HEAD(dm_verity_loadpin_trusted_root_digests); | ||
|
||
static bool is_trusted_verity_target(struct dm_target *ti) | ||
{ | ||
u8 *root_digest; | ||
unsigned int digest_size; | ||
struct dm_verity_loadpin_trusted_root_digest *trd; | ||
bool trusted = false; | ||
|
||
if (!dm_is_verity_target(ti)) | ||
return false; | ||
|
||
if (dm_verity_get_root_digest(ti, &root_digest, &digest_size)) | ||
return false; | ||
|
||
list_for_each_entry(trd, &dm_verity_loadpin_trusted_root_digests, node) { | ||
if ((trd->len == digest_size) && | ||
!memcmp(trd->data, root_digest, digest_size)) { | ||
trusted = true; | ||
break; | ||
} | ||
} | ||
|
||
kfree(root_digest); | ||
|
||
return trusted; | ||
} | ||
|
||
/* | ||
* Determines whether the file system of a superblock is located on | ||
* a verity device that is trusted by LoadPin. | ||
*/ | ||
bool dm_verity_loadpin_is_bdev_trusted(struct block_device *bdev) | ||
{ | ||
struct mapped_device *md; | ||
struct dm_table *table; | ||
struct dm_target *ti; | ||
int srcu_idx; | ||
bool trusted = false; | ||
|
||
if (list_empty(&dm_verity_loadpin_trusted_root_digests)) | ||
return false; | ||
|
||
md = dm_get_md(bdev->bd_dev); | ||
if (!md) | ||
return false; | ||
|
||
table = dm_get_live_table(md, &srcu_idx); | ||
|
||
if (dm_table_get_num_targets(table) != 1) | ||
goto out; | ||
|
||
ti = dm_table_get_target(table, 0); | ||
|
||
if (is_trusted_verity_target(ti)) | ||
trusted = true; | ||
|
||
out: | ||
dm_put_live_table(md, srcu_idx); | ||
dm_put(md); | ||
|
||
return trusted; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
|
||
#ifndef __LINUX_DM_VERITY_LOADPIN_H | ||
#define __LINUX_DM_VERITY_LOADPIN_H | ||
|
||
#include <linux/list.h> | ||
|
||
struct block_device; | ||
|
||
extern struct list_head dm_verity_loadpin_trusted_root_digests; | ||
|
||
struct dm_verity_loadpin_trusted_root_digest { | ||
struct list_head node; | ||
unsigned int len; | ||
u8 data[]; | ||
}; | ||
|
||
#if IS_ENABLED(CONFIG_SECURITY_LOADPIN) && IS_BUILTIN(CONFIG_DM_VERITY) | ||
bool dm_verity_loadpin_is_bdev_trusted(struct block_device *bdev); | ||
#else | ||
static inline bool dm_verity_loadpin_is_bdev_trusted(struct block_device *bdev) | ||
{ | ||
return false; | ||
} | ||
#endif | ||
|
||
#endif /* __LINUX_DM_VERITY_LOADPIN_H */ |