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