Skip to content

Commit addf466

Browse files
l0kodjarkkojs
authored andcommitted
certs: Check that builtin blacklist hashes are valid
Add and use a check-blacklist-hashes.awk script to make sure that the builtin blacklist hashes set with CONFIG_SYSTEM_BLACKLIST_HASH_LIST will effectively be taken into account as blacklisted hashes. This is useful to debug invalid hash formats, and it make sure that previous hashes which could have been loaded in the kernel, but silently ignored, are now noticed and deal with by the user at kernel build time. This also prevent stricter blacklist key description checking (provided by following commits) to failed for builtin hashes. Update CONFIG_SYSTEM_BLACKLIST_HASH_LIST help to explain the content of a hash string and how to generate certificate ones. Cc: David Howells <dhowells@redhat.com> Cc: David Woodhouse <dwmw2@infradead.org> Cc: Eric Snowberg <eric.snowberg@oracle.com> Cc: Jarkko Sakkinen <jarkko@kernel.org> Signed-off-by: Mickaël Salaün <mic@linux.microsoft.com> Link: https://lore.kernel.org/r/20210712170313.884724-3-mic@digikod.net Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org> Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
1 parent bf21dc5 commit addf466

File tree

5 files changed

+57
-3
lines changed

5 files changed

+57
-3
lines changed

MAINTAINERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4575,6 +4575,7 @@ L: keyrings@vger.kernel.org
45754575
S: Maintained
45764576
F: Documentation/admin-guide/module-signing.rst
45774577
F: certs/
4578+
F: scripts/check-blacklist-hashes.awk
45784579
F: scripts/sign-file.c
45794580
F: tools/certs/
45804581

certs/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# SPDX-License-Identifier: GPL-2.0-only
2+
/blacklist_hashes_checked
23
/extract-cert
34
/x509_certificate_list
45
/x509_revocation_list

certs/Kconfig

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,11 @@ config SYSTEM_BLACKLIST_HASH_LIST
104104
help
105105
If set, this option should be the filename of a list of hashes in the
106106
form "<hash>", "<hash>", ... . This will be included into a C
107-
wrapper to incorporate the list into the kernel. Each <hash> should
108-
be a string of hex digits.
107+
wrapper to incorporate the list into the kernel. Each <hash> must be a
108+
string starting with a prefix ("tbs" or "bin"), then a colon (":"), and
109+
finally an even number of hexadecimal lowercase characters (up to 128).
110+
Certificate hashes can be generated with
111+
tools/certs/print-cert-tbs-hash.sh .
109112

110113
config SYSTEM_REVOCATION_LIST
111114
bool "Provide system-wide ring of revocation certificates"

certs/Makefile

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,18 @@ obj-$(CONFIG_SYSTEM_TRUSTED_KEYRING) += system_keyring.o system_certificates.o c
77
obj-$(CONFIG_SYSTEM_BLACKLIST_KEYRING) += blacklist.o common.o
88
obj-$(CONFIG_SYSTEM_REVOCATION_LIST) += revocation_certificates.o
99
ifneq ($(CONFIG_SYSTEM_BLACKLIST_HASH_LIST),)
10+
quiet_cmd_check_blacklist_hashes = CHECK $(patsubst "%",%,$(2))
11+
cmd_check_blacklist_hashes = $(AWK) -f $(srctree)/scripts/check-blacklist-hashes.awk $(2); touch $@
12+
13+
$(eval $(call config_filename,SYSTEM_BLACKLIST_HASH_LIST))
14+
15+
$(obj)/blacklist_hashes.o: $(obj)/blacklist_hashes_checked
16+
17+
CFLAGS_blacklist_hashes.o += -I$(srctree)
18+
19+
targets += blacklist_hashes_checked
20+
$(obj)/blacklist_hashes_checked: $(SYSTEM_BLACKLIST_HASH_LIST_SRCPREFIX)$(SYSTEM_BLACKLIST_HASH_LIST_FILENAME) scripts/check-blacklist-hashes.awk FORCE
21+
$(call if_changed,check_blacklist_hashes,$(SYSTEM_BLACKLIST_HASH_LIST_SRCPREFIX)$(CONFIG_SYSTEM_BLACKLIST_HASH_LIST))
1022
obj-$(CONFIG_SYSTEM_BLACKLIST_KEYRING) += blacklist_hashes.o
1123
else
1224
obj-$(CONFIG_SYSTEM_BLACKLIST_KEYRING) += blacklist_nohashes.o
@@ -21,7 +33,7 @@ $(obj)/system_certificates.o: $(obj)/x509_certificate_list
2133
$(obj)/x509_certificate_list: $(CONFIG_SYSTEM_TRUSTED_KEYS) $(obj)/extract-cert FORCE
2234
$(call if_changed,extract_certs)
2335

24-
targets += x509_certificate_list
36+
targets += x509_certificate_list blacklist_hashes_checked
2537

2638
# If module signing is requested, say by allyesconfig, but a key has not been
2739
# supplied, then one will need to be generated to make sure the build does not

scripts/check-blacklist-hashes.awk

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#!/usr/bin/awk -f
2+
# SPDX-License-Identifier: GPL-2.0
3+
#
4+
# Copyright © 2020, Microsoft Corporation. All rights reserved.
5+
#
6+
# Author: Mickaël Salaün <mic@linux.microsoft.com>
7+
#
8+
# Check that a CONFIG_SYSTEM_BLACKLIST_HASH_LIST file contains a valid array of
9+
# hash strings. Such string must start with a prefix ("tbs" or "bin"), then a
10+
# colon (":"), and finally an even number of hexadecimal lowercase characters
11+
# (up to 128).
12+
13+
BEGIN {
14+
RS = ","
15+
}
16+
{
17+
if (!match($0, "^[ \t\n\r]*\"([^\"]*)\"[ \t\n\r]*$", part1)) {
18+
print "Not a string (item " NR "):", $0;
19+
exit 1;
20+
}
21+
if (!match(part1[1], "^(tbs|bin):(.*)$", part2)) {
22+
print "Unknown prefix (item " NR "):", part1[1];
23+
exit 1;
24+
}
25+
if (!match(part2[2], "^([0-9a-f]+)$", part3)) {
26+
print "Not a lowercase hexadecimal string (item " NR "):", part2[2];
27+
exit 1;
28+
}
29+
if (length(part3[1]) > 128) {
30+
print "Hash string too long (item " NR "):", part3[1];
31+
exit 1;
32+
}
33+
if (length(part3[1]) % 2 == 1) {
34+
print "Not an even number of hexadecimal characters (item " NR "):", part3[1];
35+
exit 1;
36+
}
37+
}

0 commit comments

Comments
 (0)