File tboot-Add-more-mbi-validation.patch of Package tboot.18210

From d5ed71429de8a3462fef9708a96e6feca1b04d63 Mon Sep 17 00:00:00 2001
From: Lukasz Hawrylko <lukasz.hawrylko@intel.com>
Date: Mon, 7 Sep 2020 15:39:55 +0200
Subject: [PATCH] Add more mbi validation

Signed-off-by: Lukasz Hawrylko <lukasz.hawrylko@intel.com>
---
 tboot/common/efi_memmap.c | 17 +++++++++++------
 tboot/common/loader.c     |  9 ++++++++-
 tboot/common/policy.c     |  5 +++++
 3 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/tboot/common/efi_memmap.c b/tboot/common/efi_memmap.c
index 38c2293..2ebe444 100644
--- a/tboot/common/efi_memmap.c
+++ b/tboot/common/efi_memmap.c
@@ -65,12 +65,17 @@ bool efi_memmap_copy(loader_ctx *lctx)
         return false;
     }
 
-    efi_mmap->size = mmap_size;
-    efi_mmap->descr_size = descr_size;
-    memcpy(efi_mmap->descr, (void*)descr_addr, mmap_size);
-    efi_mmap_available = true;
+    if (mmap_size < TBOOT_EFI_MEMMAP_COPY_SIZE - offsetof(efi_memmap_t, descr)) {
+        efi_mmap->size = mmap_size;
+        efi_mmap->descr_size = descr_size;
+        memcpy(efi_mmap->descr, (void*)descr_addr, mmap_size);
+        efi_mmap_available = true;
+        return true;
+    } else {
+        printk(TBOOT_WARN"Too many entries in EFI memory map\n");
+        return false;
+    }
 
-    return true;
 }
 
 /**
@@ -304,7 +309,7 @@ bool efi_memmap_get_highest_sized_ram(uint64_t size, uint64_t limit,
     }
 
     printk("get_highest_sized_ram: size %llx -> base %llx, size %llx\n",
-           size, *ram_base, *ram_size);
+           size, last_fit_base, last_fit_size);
 
     if (last_fit_size == 0) {
         return false;
diff --git a/tboot/common/loader.c b/tboot/common/loader.c
index c96e098..4a302e8 100644
--- a/tboot/common/loader.c
+++ b/tboot/common/loader.c
@@ -289,8 +289,15 @@ bool verify_loader_context(loader_ctx *lctx)
     if (count < 1){
         printk(TBOOT_ERR"Error: no MB%d modules\n", lctx->type);
         return false;
-    } else
+    } else {
+        for (uint32_t i = 0; i < count; ++i) {
+            module_t *m = get_module(lctx, i);
+            if (m->mod_end < m->mod_start) {
+                return false;
+            }
+        }
         return true;
+    }
 }
 
 static bool remove_mb2_tag(loader_ctx *lctx, struct mb2_tag *cur)
diff --git a/tboot/common/policy.c b/tboot/common/policy.c
index b3adc04..bc7c695 100644
--- a/tboot/common/policy.c
+++ b/tboot/common/policy.c
@@ -819,6 +819,11 @@ static void verify_g_policy(void)
 
 void verify_all_modules(loader_ctx *lctx)
 {
+    if (!verify_loader_context(lctx)) {
+        printk(TBOOT_ERR"Error: Invalid loader context\n");
+        apply_policy(TB_ERR_FATAL);
+    }
+
     /* assumes mbi is valid */
     verify_g_policy();
 
-- 
2.26.2

openSUSE Build Service is sponsored by