Merge ~ubuntu-core-dev/grub/+git/ubuntu:check-known-sigs into ~ubuntu-core-dev/grub/+git/ubuntu:ubuntu

Proposed by Mathieu Trudel-Lapierre
Status: Merged
Merged at revision: e085fe375e78d4e5a6df34089cc0440b83a03281
Proposed branch: ~ubuntu-core-dev/grub/+git/ubuntu:check-known-sigs
Merge into: ~ubuntu-core-dev/grub/+git/ubuntu:ubuntu
Diff against target: 121 lines (+62/-2)
3 files modified
debian/canonical-uefi-ca.crt (+25/-0)
debian/grub-check-signatures (+36/-2)
debian/grub-common.install.in (+1/-0)
Reviewer Review Type Date Requested Status
Steve Langasek Needs Fixing
Review via email: mp+361589@code.launchpad.net

Commit message

grub-check-signatures: check kernel signatures against known certs from firmware

Description of the change

Check kernel signatures against the certs we can export from firmware, and against the Canonical cert we can ship on disk (to guard against an empty MokListRT, despite the cert really being known by our shim).

I think the low risk of false positives (saying we trust the Canonical signature when people use their own shim, etc.) is low enough, and it's an unlikely setup already, that people can deal with it on their own.

To post a comment you must log in.
Revision history for this message
Steve Langasek (vorlon) :
review: Needs Fixing
Revision history for this message
Mathieu Trudel-Lapierre (cyphermox) :
Revision history for this message
Steve Langasek (vorlon) :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/debian/canonical-uefi-ca.crt b/debian/canonical-uefi-ca.crt
2new file mode 100644
3index 0000000..55c06d5
4--- /dev/null
5+++ b/debian/canonical-uefi-ca.crt
6@@ -0,0 +1,25 @@
7+-----BEGIN CERTIFICATE-----
8+MIIENDCCAxygAwIBAgIJALlBJKAYLJJnMA0GCSqGSIb3DQEBCwUAMIGEMQswCQYD
9+VQQGEwJHQjEUMBIGA1UECAwLSXNsZSBvZiBNYW4xEDAOBgNVBAcMB0RvdWdsYXMx
10+FzAVBgNVBAoMDkNhbm9uaWNhbCBMdGQuMTQwMgYDVQQDDCtDYW5vbmljYWwgTHRk
11+LiBNYXN0ZXIgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTEyMDQxMjExMTI1MVoX
12+DTQyMDQxMTExMTI1MVowgYQxCzAJBgNVBAYTAkdCMRQwEgYDVQQIDAtJc2xlIG9m
13+IE1hbjEQMA4GA1UEBwwHRG91Z2xhczEXMBUGA1UECgwOQ2Fub25pY2FsIEx0ZC4x
14+NDAyBgNVBAMMK0Nhbm9uaWNhbCBMdGQuIE1hc3RlciBDZXJ0aWZpY2F0ZSBBdXRo
15+b3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC/WzoWdO4hXa5h
16+7Z1WrL3e3nLz3X4tTGIPrMBtSAgRz42L+2EfJ8wRbtlVPTlU60A7sbvihTR5yvd7
17+v7p6yBAtGX2tWc+m1OlOD9quUupMnpDOxpkNTmdleF350dU4Skp6j5OcfxqjhdvO
18++ov3wqIhLZtUQTUQVxONbLwpBlBKfuqZqWinO8cHGzKeoBmHDnm7aJktfpNS5fbr
19+yZv5K+24aEm82ZVQQFvFsnGq61xX3nH5QArdW6wehC1QGlLW4fNrbpBkT1u06yDk
20+YRDaWvDq5ELXAcT+IR/ZucBUlUKBUnIfSWR6yGwk8QhwC02loDLRoBxXqE3jr6WO
21+BQU+EEOhAgMBAAGjgaYwgaMwHQYDVR0OBBYEFK2RmQvCKrH1FwSMI7ZlWiaONFpj
22+MB8GA1UdIwQYMBaAFK2RmQvCKrH1FwSMI7ZlWiaONFpjMA8GA1UdEwEB/wQFMAMB
23+Af8wCwYDVR0PBAQDAgGGMEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly93d3cuY2Fu
24+b25pY2FsLmNvbS9zZWN1cmUtYm9vdC1tYXN0ZXItY2EuY3JsMA0GCSqGSIb3DQEB
25+CwUAA4IBAQA/ffZ2pbODtCt60G1SGgODxBKnUJxHkszAlHeC0q5Xs5kE9TI6xlUd
26+B9sSqVb62NR2IOvkw1Hbmlyckj8Yc9qUaqGZOIykiG3B/Dlx0HR2FgM+ViM11VVH
27+WxodQcLTEkzc/64KkpxiChcBnHPgXrH9vNa1GRF6fs0+A35m21uoyTlIUf9T4Zwx
28+U5EbOxB1Axe65oECgJRwTEa3lLA9Fc0fjgLgaAKP+/lHHX2iAcYHUcSazO3dz6Nd
29+7ZK7vtH95uwfM1FzBL48crB9CPgB/5h9y5zgaTl3JUdxiLGNJ6UuqPc/X4Bplz6p
30+9JkU284DDgtmxBxtvbgnd8FClL38agq8
31+-----END CERTIFICATE-----
32diff --git a/debian/grub-check-signatures b/debian/grub-check-signatures
33index 1c486a1..1daf589 100755
34--- a/debian/grub-check-signatures
35+++ b/debian/grub-check-signatures
36@@ -8,6 +8,7 @@ set -e
37 efivars=/sys/firmware/efi/efivars
38 secureboot_var=SecureBoot-8be4df61-93ca-11d2-aa0d-00e098032b8c
39 moksbstatert_var=MokSBStateRT-605dab50-e046-4300-abb6-3dd810dd8b23
40+tmpdir=$(mktemp -d)
41
42 on_secure_boot() {
43 # Validate any queued actions before we go try to do them.
44@@ -38,13 +39,44 @@ on_secure_boot() {
45 return 0
46 }
47
48+# Retrieve the keys we do trust from PK, DB, KEK, and MokList.
49+extract_known_keys() {
50+ # Make the Canonical CA cert available for validation too; in case
51+ # MokListRT is empty due to a bug.
52+ cp /usr/share/grub/canonical-uefi-ca.crt $tmpdir
53+
54+ # Extract known UEFI certs from firmware variables
55+ ( cd $tmpdir; \
56+ mokutil --export --db; \
57+ mokutil --export --mok >/dev/null 2>/dev/null; \
58+ for derfile in *.der; do \
59+ openssl x509 -inform der -in $derfile -outform pem -out $derfile.crt; \
60+ done )
61+}
62+
63 # Check if a given kernel image is signed
64 is_signed() {
65 tmp=$(mktemp)
66- sbattach --detach $tmp $1 >/dev/null # that's ugly...
67+ sbattach --detach $tmp $1 >/dev/null 2>/dev/null # that's ugly...
68 test "$(wc -c < $tmp)" -ge 16 # Just _some_ minimum size
69 result=$?
70+ if [ $result -eq 0 ]; then
71+ sig_subject=$(openssl pkcs7 -inform der -in $tmp -print_certs | openssl x509 -noout -text | grep Subject: )
72+ fi
73 rm $tmp
74+ if [ $result -eq 0 ]; then
75+ for crtfile in $tmpdir/*.crt; do
76+ sbverify --cert $crtfile $1 >/dev/null 2>/dev/null
77+ result=$?
78+ if [ $result -eq 0 ]; then
79+ return $result;
80+ fi
81+ done
82+ echo "$1 is signed, but using an unknown key:" >&2
83+ echo "$sig_subject" >&2
84+ else
85+ echo "$1 is unsigned." >&2
86+ fi
87 return $result
88 }
89
90@@ -71,7 +103,7 @@ find_unsigned() {
91
92 # Only reached from show_warning
93 error() {
94- echo "E: Your kernels are unsigned. This system will fail to boot in a secure boot environment." >&2
95+ echo "E: Your kernels are not signed with a key known to your firmware. This system will fail to boot in a Secure Boot environment." >&2
96 exit 1
97 }
98
99@@ -90,8 +122,10 @@ show_warning() {
100 }
101
102 if on_secure_boot; then
103+ extract_known_keys
104 unsigned="$(find_unsigned)"
105 if [ -n "$unsigned" ]; then
106 show_warning "$unsigned"
107 fi
108+ rm -rf "$tmpdir"
109 fi
110diff --git a/debian/grub-common.install.in b/debian/grub-common.install.in
111index 0a562a6..8e31573 100644
112--- a/debian/grub-common.install.in
113+++ b/debian/grub-common.install.in
114@@ -1,6 +1,7 @@
115 ../../debian/apport/source_grub2.py usr/share/apport/package-hooks/
116 ../../debian/grub.d etc
117 ../../debian/grub-check-signatures usr/share/grub/
118+../../debian/canonical-uefi-ca.crt usr/share/grub/
119
120 etc/bash_completion.d
121 etc/grub.d

Subscribers

People subscribed via source and target branches