diff --git a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyShim/VtoyShim.c b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyShim/VtoyShim.c index 216b5a3c..06910f83 100644 --- a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyShim/VtoyShim.c +++ b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyShim/VtoyShim.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -43,6 +44,8 @@ STATIC UINT8 gVtoyGrubSha256Hash[32] __attribute__((aligned(32))) = { STATIC BOOLEAN gGrubLaunched = FALSE; STATIC EFI_GUID gShimLockGUID = SHIM_LOCK_GUID; +STATIC EFI_GUID gMsftDBXSVNOwnerGUID = MSFT_DBX_SVN_OWN_GUID; +STATIC EFI_GUID gBootMgrDBXSVNGUID = EFI_BOOTMGR_DBXSVN_GUID; STATIC EFI_SECURITY_FILE_AUTHENTICATION_STATE gSysSecFileAuth = NULL; STATIC EFI_SECURITY2_FILE_AUTHENTICATION gSysSec2FileAuth = NULL; STATIC BOOLEAN gVtoyByPassSB = FALSE; /* must be FALSE by default for revoke */ @@ -560,6 +563,60 @@ END: return Status; } +STATIC EFI_STATUS EFIAPI VtoyHookDBX(UINTN DataSize, VOID *Data) +{ + UINT32 i = 0; + UINT32 Count = 0; + UINTN Offset = 0; + EFI_SIGNATURE_LIST *pstCurSig = NULL; + EFI_SIGNATURE_DATA *pstSigData = NULL; + + for (Offset = 0; Offset + sizeof(EFI_SIGNATURE_LIST) <= DataSize; Offset += pstCurSig->SignatureListSize) + { + pstCurSig = (EFI_SIGNATURE_LIST *)((UINT8 *)Data + Offset); + if (pstCurSig->SignatureSize == 0 || pstCurSig->SignatureListSize == 0 || + Offset + pstCurSig->SignatureListSize > DataSize || + pstCurSig->SignatureListSize < sizeof(EFI_SIGNATURE_LIST) + pstCurSig->SignatureHeaderSize) + { + break; + } + + if (!CompareGuid(&pstCurSig->SignatureType, &gEfiCertSha256Guid)) + { + continue; + } + + pstSigData = (EFI_SIGNATURE_DATA *)((UINT8 *)pstCurSig + sizeof(EFI_SIGNATURE_LIST) + pstCurSig->SignatureHeaderSize); + Count = (pstCurSig->SignatureListSize - sizeof(EFI_SIGNATURE_LIST) - pstCurSig->SignatureHeaderSize) / pstCurSig->SignatureSize; + +#if 0 + if (Count > 0 && pstCurSig->SignatureSize == 48) + { + vDbg(L"Make a fake SVN signature for test"); + CopyMem(&pstSigData->SignatureOwner, &gMsftDBXSVNOwnerGUID, sizeof(EFI_GUID)); + ZeroMem(pstSigData->SignatureData, pstCurSig->SignatureSize); + CopyMem(&pstSigData->SignatureData + 1, &gBootMgrDBXSVNGUID, sizeof(EFI_GUID)); + pstSigData->SignatureData[0] = 1; + DBX_SVN_SET(pstSigData->SignatureData, 100); + break; + } +#endif + + for (i = 0; i < Count; i++) + { + if (CompareGuid(&pstSigData->SignatureOwner, &gMsftDBXSVNOwnerGUID) && + CompareGuid((CONST EFI_GUID *)(pstSigData->SignatureData + 1), &gBootMgrDBXSVNGUID)) + { + DBX_SVN_SET(pstSigData->SignatureData, 1); + return EFI_SUCCESS; + } + pstSigData = (EFI_SIGNATURE_DATA *)((UINT8 *)pstSigData + pstCurSig->SignatureSize); + } + } + + return EFI_SUCCESS; +} + EFI_STATUS EFIAPI VtoyGetVariable ( IN CHAR16 *VariableName, @@ -572,19 +629,22 @@ EFI_STATUS EFIAPI VtoyGetVariable BOOLEAN bChk = FALSE; EFI_STATUS Status; - if (gVtoyByPassSB && VariableName && VendorGuid && DataSize && Data && (*DataSize) > 0) + if (gVtoyByPassSB && VariableName && VendorGuid && DataSize && Data) { bChk = TRUE; } Status = gSysGetVariable(VariableName, VendorGuid, Attributes, DataSize, Data); - if (bChk && (!EFI_ERROR(Status))) + if (bChk && EFI_SUCCESS == Status) { - if (CompareMem(&gShimLockGUID, VendorGuid, 16) == 0 && - StrCmp(VariableName, L"MokSBState") == 0) + if (EFI_VAR_MATCH(&gShimLockGUID, L"MokSBState")) { *(UINT8 *)Data = 1; } + else if (EFI_VAR_MATCH(&gEfiImageSecurityDatabaseGuid, L"dbx")) + { + VtoyHookDBX(*DataSize, Data); + } } return Status; @@ -592,6 +652,9 @@ EFI_STATUS EFIAPI VtoyGetVariable STATIC VOID EFIAPI UnHookSystemService(VOID) { + UINT32 uiNewCRC = 0; + EFI_TABLE_HEADER *Hdr = &gST->RuntimeServices->Hdr; + if (gSysExitBootServices) { gBS->ExitBootServices = gSysExitBootServices; @@ -602,6 +665,10 @@ STATIC VOID EFIAPI UnHookSystemService(VOID) { gST->RuntimeServices->GetVariable = gSysGetVariable; gSysGetVariable = NULL; + + Hdr->CRC32 = 0; + gBS->CalculateCrc32(Hdr, Hdr->HeaderSize, &uiNewCRC); + Hdr->CRC32 = uiNewCRC; } } @@ -626,11 +693,18 @@ STATIC EFI_STATUS EFIAPI VtoyExitBootServices STATIC VOID EFIAPI HookSystemService(VOID) { + UINT32 uiNewCRC = 0; + EFI_TABLE_HEADER *Hdr = &gST->RuntimeServices->Hdr; + gSysExitBootServices = gBS->ExitBootServices; gBS->ExitBootServices = VtoyExitBootServices; gSysGetVariable = gST->RuntimeServices->GetVariable; gST->RuntimeServices->GetVariable = VtoyGetVariable; + + Hdr->CRC32 = 0; + gBS->CalculateCrc32(Hdr, Hdr->HeaderSize, &uiNewCRC); + Hdr->CRC32 = uiNewCRC; } EFI_STATUS EFIAPI VtoyShimEfiMain diff --git a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyShim/VtoyShim.h b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyShim/VtoyShim.h index 6f2d62ed..fd555c61 100644 --- a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyShim/VtoyShim.h +++ b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyShim/VtoyShim.h @@ -22,7 +22,23 @@ /* The following definations are copied from shim source code */ -#define SHIM_LOCK_GUID {0x605dab50, 0xe046, 0x4300, {0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23 } }; +#define SHIM_LOCK_GUID {0x605dab50, 0xe046, 0x4300, {0xab, 0xb6, 0x3d, 0xd8, 0x10, 0xdd, 0x8b, 0x23 } } +#define MSFT_DBX_SVN_OWN_GUID { 0x9d132b6c, 0x59d5, 0x4388, {0xab, 0x1c, 0x18, 0x5c, 0xfc, 0xb2, 0xeb, 0x92}} +#define EFI_BOOTMGR_DBXSVN_GUID { 0x9d132b61, 0x59d5, 0x4388, {0xab, 0x1c, 0x18, 0x5c, 0x3c, 0xb2, 0xeb, 0x92}} + + +#define EFI_VAR_MATCH(pguid, name) \ + (CompareMem((pguid), VendorGuid, 16) == 0 && StrCmp(VariableName, (name)) == 0) + +#define DBX_SVN_SET(SigData, SVN) \ +do { \ + SigData[17] = 0; \ + SigData[18] = 0; \ + SigData[19] = (SVN); \ + SigData[20] = 0; \ +} while (0) + + typedef EFI_STATUS @@ -88,7 +104,7 @@ typedef VOID (*shim_void_func_pf)(VOID); #define VtoySleep(sec) gBS->Stall(1000000 * (sec)) #define vLog(fmt, ...) VtoyLog(fmt "\r\n", ##__VA_ARGS__) #define vErr(fmt, ...) VtoyLog(fmt "\r\n", ##__VA_ARGS__); VtoySleep(5) -#define vDbg(fmt, ...) VtoyLog(fmt "\r\n", ##__VA_ARGS__); VtoySleep(2) +#define vDbg(fmt, ...) VtoyLog(fmt "\r\n", ##__VA_ARGS__); VtoySleep(1) #define CheckFreePool(p) \ do { \ diff --git a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyShim/VtoyShim.inf b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyShim/VtoyShim.inf index 6cce933d..de51f9d7 100644 --- a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyShim/VtoyShim.inf +++ b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/VtoyShim/VtoyShim.inf @@ -46,6 +46,8 @@ [Guids] gEfiGlobalVariableGuid + gEfiImageSecurityDatabaseGuid + gEfiCertSha256Guid gShellVariableGuid gEfiVirtualCdGuid gEfiFileInfoGuid