1*4882a593SmuzhiyunFrom 6fe755c5c07bb386fda58306bfd19e4a1c974c53 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Julian Andres Klode <julian.klode@canonical.com>
3*4882a593SmuzhiyunDate: Thu, 2 Dec 2021 15:03:53 +0100
4*4882a593SmuzhiyunSubject: [PATCH] kern/efi/sb: Reject non-kernel files in the shim_lock
5*4882a593Smuzhiyun verifier
6*4882a593Smuzhiyun
7*4882a593SmuzhiyunWe must not allow other verifiers to pass things like the GRUB modules.
8*4882a593SmuzhiyunInstead of maintaining a blocklist, maintain an allowlist of things
9*4882a593Smuzhiyunthat we do not care about.
10*4882a593Smuzhiyun
11*4882a593SmuzhiyunThis allowlist really should be made reusable, and shared by the
12*4882a593Smuzhiyunlockdown verifier, but this is the minimal patch addressing
13*4882a593Smuzhiyunsecurity concerns where the TPM verifier was able to mark modules
14*4882a593Smuzhiyunas verified (or the OpenPGP verifier for that matter), when it
15*4882a593Smuzhiyunshould not do so on shim-powered secure boot systems.
16*4882a593Smuzhiyun
17*4882a593SmuzhiyunFixes: CVE-2022-28735
18*4882a593Smuzhiyun
19*4882a593SmuzhiyunSigned-off-by: Julian Andres Klode <julian.klode@canonical.com>
20*4882a593SmuzhiyunReviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
21*4882a593Smuzhiyun
22*4882a593SmuzhiyunUpstream-Status: Backport
23*4882a593SmuzhiyunCVE:CVE-2022-28735
24*4882a593Smuzhiyun
25*4882a593SmuzhiyunReference to upstream patch:
26*4882a593Smuzhiyunhttps://git.savannah.gnu.org/cgit/grub.git/commit/?id=6fe755c5c07bb386fda58306bfd19e4a1c974c53
27*4882a593Smuzhiyun
28*4882a593SmuzhiyunSigned-off-by: Yongxin Liu <yongxin.liu@windriver.com>
29*4882a593Smuzhiyun---
30*4882a593Smuzhiyun grub-core/kern/efi/sb.c | 39 ++++++++++++++++++++++++++++++++++++---
31*4882a593Smuzhiyun include/grub/verify.h   |  1 +
32*4882a593Smuzhiyun 2 files changed, 37 insertions(+), 3 deletions(-)
33*4882a593Smuzhiyun
34*4882a593Smuzhiyundiff --git a/grub-core/kern/efi/sb.c b/grub-core/kern/efi/sb.c
35*4882a593Smuzhiyunindex c52ec6226..89c4bb3fd 100644
36*4882a593Smuzhiyun--- a/grub-core/kern/efi/sb.c
37*4882a593Smuzhiyun+++ b/grub-core/kern/efi/sb.c
38*4882a593Smuzhiyun@@ -119,10 +119,11 @@ shim_lock_verifier_init (grub_file_t io __attribute__ ((unused)),
39*4882a593Smuzhiyun 			 void **context __attribute__ ((unused)),
40*4882a593Smuzhiyun 			 enum grub_verify_flags *flags)
41*4882a593Smuzhiyun {
42*4882a593Smuzhiyun-  *flags = GRUB_VERIFY_FLAGS_SKIP_VERIFICATION;
43*4882a593Smuzhiyun+  *flags = GRUB_VERIFY_FLAGS_NONE;
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun   switch (type & GRUB_FILE_TYPE_MASK)
46*4882a593Smuzhiyun     {
47*4882a593Smuzhiyun+    /* Files we check. */
48*4882a593Smuzhiyun     case GRUB_FILE_TYPE_LINUX_KERNEL:
49*4882a593Smuzhiyun     case GRUB_FILE_TYPE_MULTIBOOT_KERNEL:
50*4882a593Smuzhiyun     case GRUB_FILE_TYPE_BSD_KERNEL:
51*4882a593Smuzhiyun@@ -130,11 +131,43 @@ shim_lock_verifier_init (grub_file_t io __attribute__ ((unused)),
52*4882a593Smuzhiyun     case GRUB_FILE_TYPE_PLAN9_KERNEL:
53*4882a593Smuzhiyun     case GRUB_FILE_TYPE_EFI_CHAINLOADED_IMAGE:
54*4882a593Smuzhiyun       *flags = GRUB_VERIFY_FLAGS_SINGLE_CHUNK;
55*4882a593Smuzhiyun+      return GRUB_ERR_NONE;
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun-      /* Fall through. */
58*4882a593Smuzhiyun+    /* Files that do not affect secureboot state. */
59*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_NONE:
60*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_LOOPBACK:
61*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_LINUX_INITRD:
62*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_OPENBSD_RAMDISK:
63*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_XNU_RAMDISK:
64*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_SIGNATURE:
65*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_PUBLIC_KEY:
66*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_PUBLIC_KEY_TRUST:
67*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_PRINT_BLOCKLIST:
68*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_TESTLOAD:
69*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_GET_SIZE:
70*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_FONT:
71*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_ZFS_ENCRYPTION_KEY:
72*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_CAT:
73*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_HEXCAT:
74*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_CMP:
75*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_HASHLIST:
76*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_TO_HASH:
77*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_KEYBOARD_LAYOUT:
78*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_PIXMAP:
79*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_GRUB_MODULE_LIST:
80*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_CONFIG:
81*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_THEME:
82*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_GETTEXT_CATALOG:
83*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_FS_SEARCH:
84*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_LOADENV:
85*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_SAVEENV:
86*4882a593Smuzhiyun+    case GRUB_FILE_TYPE_VERIFY_SIGNATURE:
87*4882a593Smuzhiyun+      *flags = GRUB_VERIFY_FLAGS_SKIP_VERIFICATION;
88*4882a593Smuzhiyun+      return GRUB_ERR_NONE;
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun+    /* Other files. */
91*4882a593Smuzhiyun     default:
92*4882a593Smuzhiyun-      return GRUB_ERR_NONE;
93*4882a593Smuzhiyun+      return grub_error (GRUB_ERR_ACCESS_DENIED, N_("prohibited by secure boot policy"));
94*4882a593Smuzhiyun     }
95*4882a593Smuzhiyun }
96*4882a593Smuzhiyun
97*4882a593Smuzhiyundiff --git a/include/grub/verify.h b/include/grub/verify.h
98*4882a593Smuzhiyunindex cd129c398..672ae1692 100644
99*4882a593Smuzhiyun--- a/include/grub/verify.h
100*4882a593Smuzhiyun+++ b/include/grub/verify.h
101*4882a593Smuzhiyun@@ -24,6 +24,7 @@
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun enum grub_verify_flags
104*4882a593Smuzhiyun   {
105*4882a593Smuzhiyun+    GRUB_VERIFY_FLAGS_NONE		= 0,
106*4882a593Smuzhiyun     GRUB_VERIFY_FLAGS_SKIP_VERIFICATION	= 1,
107*4882a593Smuzhiyun     GRUB_VERIFY_FLAGS_SINGLE_CHUNK	= 2,
108*4882a593Smuzhiyun     /* Defer verification to another authority. */
109*4882a593Smuzhiyun--
110*4882a593Smuzhiyun2.34.1
111*4882a593Smuzhiyun
112