|
3 | 3 | #include <linux/kernel.h>
|
4 | 4 | #include <linux/sched.h>
|
5 | 5 | #include <linux/cred.h>
|
| 6 | +#include <linux/dmi.h> |
6 | 7 | #include <linux/err.h>
|
7 | 8 | #include <linux/efi.h>
|
8 | 9 | #include <linux/slab.h>
|
|
12 | 13 | #include "../integrity.h"
|
13 | 14 | #include "keyring_handler.h"
|
14 | 15 |
|
| 16 | +/* |
| 17 | + * On T2 Macs reading the db and dbx efi variables to load UEFI Secure Boot |
| 18 | + * certificates causes occurrence of a page fault in Apple's firmware and |
| 19 | + * a crash disabling EFI runtime services. The following quirk skips reading |
| 20 | + * these variables. |
| 21 | + */ |
| 22 | +static const struct dmi_system_id uefi_skip_cert[] = { |
| 23 | + { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookPro15,1") }, |
| 24 | + { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookPro15,2") }, |
| 25 | + { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookPro15,3") }, |
| 26 | + { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookPro15,4") }, |
| 27 | + { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookPro16,1") }, |
| 28 | + { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookPro16,2") }, |
| 29 | + { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookPro16,3") }, |
| 30 | + { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookPro16,4") }, |
| 31 | + { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookAir8,1") }, |
| 32 | + { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookAir8,2") }, |
| 33 | + { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacBookAir9,1") }, |
| 34 | + { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacMini8,1") }, |
| 35 | + { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "MacPro7,1") }, |
| 36 | + { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "iMac20,1") }, |
| 37 | + { UEFI_QUIRK_SKIP_CERT("Apple Inc.", "iMac20,2") }, |
| 38 | + { } |
| 39 | +}; |
| 40 | + |
15 | 41 | /*
|
16 | 42 | * Look to see if a UEFI variable called MokIgnoreDB exists and return true if
|
17 | 43 | * it does.
|
@@ -138,6 +164,13 @@ static int __init load_uefi_certs(void)
|
138 | 164 | unsigned long dbsize = 0, dbxsize = 0, mokxsize = 0;
|
139 | 165 | efi_status_t status;
|
140 | 166 | int rc = 0;
|
| 167 | + const struct dmi_system_id *dmi_id; |
| 168 | + |
| 169 | + dmi_id = dmi_first_match(uefi_skip_cert); |
| 170 | + if (dmi_id) { |
| 171 | + pr_err("Reading UEFI Secure Boot Certs is not supported on T2 Macs.\n"); |
| 172 | + return false; |
| 173 | + } |
141 | 174 |
|
142 | 175 | if (!efi_rt_services_supported(EFI_RT_SUPPORTED_GET_VARIABLE))
|
143 | 176 | return false;
|
|
0 commit comments