[PATCH 8/8] uefi: csm: add safe memory read check on mmap'd interrupt and option ROM regions
Colin King
colin.king at canonical.com
Fri Jul 14 09:52:25 UTC 2017
From: Colin Ian King <colin.king at canonical.com>
Check for unreadable memory mapped interrupt vector region and
option ROM regions.
Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
src/uefi/csm/csm.c | 18 +++++++++++++-----
1 file changed, 13 insertions(+), 5 deletions(-)
diff --git a/src/uefi/csm/csm.c b/src/uefi/csm/csm.c
index 8cbec578..b79a8643 100644
--- a/src/uefi/csm/csm.c
+++ b/src/uefi/csm/csm.c
@@ -50,7 +50,12 @@ static int csm_test1(fwts_framework *fw)
/* Get Int 10h vector from segment/offset realmode address */
if ((intVec = fwts_mmap(INT_VEC_START, INT_VEC_SIZE)) == FWTS_MAP_FAILED) {
- fwts_log_error(fw, "Cannot mmap BIOS ROM region.");
+ fwts_log_error(fw, "Cannot mmap interrupt vector region.");
+ return FWTS_ERROR;
+ }
+ if (fwts_safe_memread(intVec, INT_VEC_SIZE) != FWTS_OK) {
+ fwts_log_error(fw, "Cannot read interrupt vector region.");
+ fwts_munmap(intVec, INT_VEC_SIZE);
return FWTS_ERROR;
}
int10hVec = (intVec[0x10] & 0xffff) | ((intVec[0x10] & 0xffff0000)>> 12);
@@ -62,10 +67,13 @@ static int csm_test1(fwts_framework *fw)
}
for (i = 0; i < BIOS_ROM_REGION_SIZE; i += 512) {
- if ((*(optROM+i) == 0x55) && (*(optROM+i+1) == 0xaa)) {
- uint32_t length = *(optROM+i+2) << 9;
- uint32_t ROMstart = BIOS_ROM_REGION_START+i;
- uint32_t ROMend = BIOS_ROM_REGION_START+i+length;
+ /* Skip any option ROM headers that we can't read */
+ if (fwts_safe_memread(optROM + i, 6) != FWTS_OK)
+ continue;
+ if ((*(optROM + i) == 0x55) && (*(optROM + i + 1) == 0xaa)) {
+ uint32_t length = *(optROM + i + 2) << 9;
+ uint32_t ROMstart = BIOS_ROM_REGION_START + i;
+ uint32_t ROMend = BIOS_ROM_REGION_START + i + length;
if ((ROMstart <= int10hVec) && (int10hVec <= ROMend)) {
fwts_log_info(fw, "Int 10h jumps to 0x%" PRIx32 " in option ROM at: "
--
2.11.0
More information about the fwts-devel
mailing list