]> git.proxmox.com Git - mirror_edk2.git/commitdiff
SecurityPkg/TcgPei: Use Migrated FV Info Hob for calculating hash (CVE-2019-11098)
authorGuomin Jiang <guomin.jiang@intel.com>
Wed, 8 Jul 2020 08:01:14 +0000 (16:01 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Tue, 28 Jul 2020 01:43:16 +0000 (01:43 +0000)
REF:https://bugzilla.tianocore.org/show_bug.cgi?id=1614

When we allocate pool to save rebased the PEIMs, the address will change
randomly, therefore the hash will change and result PCR0 change as well.
To avoid this, we save the raw PEIMs and use it to calculate hash.
The TcgPei calculate the hash and it use the Migrated FV Info.

Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Chao Zhang <chao.b.zhang@intel.com>
Cc: Qi Zhang <qi1.zhang@intel.com>
Cc: Rahul Kumar <rahul1.kumar@intel.com>
Signed-off-by: Guomin Jiang <guomin.jiang@intel.com>
Reviewed-by: Jian J Wang <jian.j.wang@intel.com>
Reviewed-by: Qi Zhang <qi1.zhang@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
SecurityPkg/Tcg/TcgPei/TcgPei.c
SecurityPkg/Tcg/TcgPei/TcgPei.inf

index 25333888490774a0ea94e4363eef6d29db31d3f5..db33daed37238f3f073bf3a7b457912f9aaa2d05 100644 (file)
@@ -22,6 +22,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #include <Guid/TcgEventHob.h>\r
 #include <Guid/MeasuredFvHob.h>\r
 #include <Guid/TpmInstance.h>\r
+#include <Guid/MigratedFvInfo.h>\r
 \r
 #include <Library/DebugLib.h>\r
 #include <Library/BaseMemoryLib.h>\r
@@ -422,6 +423,10 @@ MeasureFvImage (
   EFI_STATUS                        Status;\r
   EFI_PLATFORM_FIRMWARE_BLOB        FvBlob;\r
   TCG_PCR_EVENT_HDR                 TcgEventHdr;\r
+  EFI_PHYSICAL_ADDRESS              FvOrgBase;\r
+  EFI_PHYSICAL_ADDRESS              FvDataBase;\r
+  EFI_PEI_HOB_POINTERS              Hob;\r
+  EDKII_MIGRATED_FV_INFO            *MigratedFvInfo;\r
 \r
   //\r
   // Check if it is in Excluded FV list\r
@@ -445,10 +450,30 @@ MeasureFvImage (
     }\r
   }\r
 \r
+  //\r
+  // Search the matched migration FV info\r
+  //\r
+  FvOrgBase  = FvBase;\r
+  FvDataBase = FvBase;\r
+  Hob.Raw  = GetFirstGuidHob (&gEdkiiMigratedFvInfoGuid);\r
+  while (Hob.Raw != NULL) {\r
+    MigratedFvInfo = GET_GUID_HOB_DATA (Hob);\r
+    if ((MigratedFvInfo->FvNewBase == (UINT32) FvBase) && (MigratedFvInfo->FvLength == (UINT32) FvLength)) {\r
+      //\r
+      // Found the migrated FV info\r
+      //\r
+      FvOrgBase  = (EFI_PHYSICAL_ADDRESS) (UINTN) MigratedFvInfo->FvOrgBase;\r
+      FvDataBase = (EFI_PHYSICAL_ADDRESS) (UINTN) MigratedFvInfo->FvDataBase;\r
+      break;\r
+    }\r
+    Hob.Raw = GET_NEXT_HOB (Hob);\r
+    Hob.Raw = GetNextGuidHob (&gEdkiiMigratedFvInfoGuid, Hob.Raw);\r
+  }\r
+\r
   //\r
   // Measure and record the FV to the TPM\r
   //\r
-  FvBlob.BlobBase   = FvBase;\r
+  FvBlob.BlobBase   = FvOrgBase;\r
   FvBlob.BlobLength = FvLength;\r
 \r
   DEBUG ((DEBUG_INFO, "The FV which is measured by TcgPei starts at: 0x%x\n", FvBlob.BlobBase));\r
@@ -461,7 +486,7 @@ MeasureFvImage (
   Status = HashLogExtendEvent (\r
              &mEdkiiTcgPpi,\r
              0,\r
-             (UINT8*) (UINTN) FvBlob.BlobBase,\r
+             (UINT8*) (UINTN) FvDataBase,\r
              (UINTN) FvBlob.BlobLength,\r
              &TcgEventHdr,\r
              (UINT8*) &FvBlob\r
index 4ab4edd657c056df446bc3dc738a6038d1dd96db..2e3e7e0575d56f79072f74c8b27892d943e7d2a7 100644 (file)
@@ -58,6 +58,7 @@
   gTpmErrorHobGuid                                                    ## SOMETIMES_PRODUCES     ## HOB\r
   gMeasuredFvHobGuid                                                  ## PRODUCES               ## HOB\r
   gEfiTpmDeviceInstanceTpm12Guid                                      ## PRODUCES               ## GUID       # TPM device identifier\r
+  gEdkiiMigratedFvInfoGuid                                            ## SOMETIMES_CONSUMES     ## HOB\r
 \r
 [Ppis]\r
   gPeiLockPhysicalPresencePpiGuid                                     ## SOMETIMES_CONSUMES     ## NOTIFY\r