Changeset 106998 in vbox
- Timestamp:
- Nov 14, 2024 1:14:23 AM (3 months ago)
- svn:sync-xref-src-repo-rev:
- 165934
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/sup.h
r106968 r106998 2773 2773 const unsigned char *pch; 2774 2774 /** Number of bytes. */ 2775 unsigned cb; 2775 uint32_t cb; 2776 /** Value in RTCRCERTCTX_F_ENC_MASK: RTCRCERTCTX_F_ENC_TAF_DER, 2777 * RTCRCERTCTX_F_ENC_X509_DER. */ 2778 uint32_t fEnc; 2776 2779 } SUPTAENTRY; 2777 2780 /** Pointer to a trust anchor table entry. */ 2778 2781 typedef SUPTAENTRY const *PCSUPTAENTRY; 2779 2782 2780 /** Macro for simplifying generating the trust anchor tables. */ 2781 #define SUPTAENTRY_GEN(a_abTA) { &a_abTA[0], sizeof(a_abTA) } 2783 /** Macro for a TAF entry. */ 2784 #define SUPTAENTRY_TAF(a_abTA) { &a_abTA[0], sizeof(a_abTA), RTCRCERTCTX_F_ENC_TAF_DER } 2785 2786 /** Macro for a X.509 certificate entry. */ 2787 #define SUPTAENTRY_CER(a_abCertTA) { &a_abCertTA[0], sizeof(a_abCertTA), RTCRCERTCTX_F_ENC_X509_DER } 2782 2788 2783 2789 /** All certificates we know. */ -
trunk/src/VBox/HostDrivers/Support/Makefile.kmk
r106985 r106998 134 134 if "$(KBUILD_TARGET)" == "win" && defined(VBOX_WITH_HARDENING) 135 135 VBOX_SUP_GEN_CERT_MACRO = 'SUPTAENTRY const g_aSUP$(1)TAs[] =' '{' \ 136 $(if-expr "$(3)" == "",,' SUPTAENTRY_ GEN(g_abSUPBuildCert),') \137 $(foreach certnm,$(filter $(2),$(VBOX_SUP_WIN_CERT_NAMES)), ' SUPTAENTRY_ GEN(g_abSUP$(certnm)),') \136 $(if-expr "$(3)" == "",,' SUPTAENTRY_CER(g_abSUPBuildCert),') \ 137 $(foreach certnm,$(filter $(2),$(VBOX_SUP_WIN_CERT_NAMES)), ' SUPTAENTRY_TAF(g_abSUP$(certnm)),') \ 138 138 '};' 'unsigned const g_cSUP$(1)TAs = RT_ELEMENTS(g_aSUP$(1)TAs);' '' '' 139 139 else 140 140 VBOX_SUP_GEN_CERT_MACRO = 'SUPTAENTRY const g_aSUP$(1)TAs[] =' '{' \ 141 $(foreach certnm,$(filter $(2),$(VBOX_SUP_WIN_CERT_NAMES)), ' SUPTAENTRY_ GEN(g_abSUP$(certnm)),') \141 $(foreach certnm,$(filter $(2),$(VBOX_SUP_WIN_CERT_NAMES)), ' SUPTAENTRY_TAF(g_abSUP$(certnm)),') \ 142 142 '};' 'unsigned const g_cSUP$(1)TAs = RT_ELEMENTS(g_aSUP$(1)TAs);' '' '' 143 143 endif … … 162 162 '' \ 163 163 '#include <VBox/sup.h>' \ 164 '#include <iprt/crypto/store.h>' \ 164 165 '' 165 166 $(foreach cert,$(VBOX_SUP_WIN_CERTS), $(NLTAB)$(VBOX_BIN2C) -ascii --append --static --no-size \ -
trunk/src/VBox/HostDrivers/Support/win/SUPHardenedVerifyImage-win.cpp
r106997 r106998 1744 1744 1745 1745 1746 static int supHardNtViCertStoreAddArray(RTCRSTORE hStore, PCSUPTAENTRY paCerts, unsigned cCerts, PRTERRINFO pErrInfo)1747 {1748 for (uint32_t i = 0; i < cCerts; i++)1749 {1750 int rc = RTCrStoreCertAddEncoded(hStore, !paCerts[i].fIsCert ? RTCRCERTCTX_F_ENC_TAF_DER : RTCRCERTCTX_F_ENC_X509_DER,1751 paCerts[i].pch, paCerts[i].cb, pErrInfo);1752 if (RT_FAILURE(rc))1753 return rc;1754 }1755 return VINF_SUCCESS;1756 }1757 1758 1759 1746 /** 1760 1747 * Initialize a certificate table. 1761 1748 * 1762 1749 * @param phStore Where to return the store pointer. 1763 * @param paCerts1 Pointer to the first certificate table.1764 * @param cCerts1 Entries in the first certificate table.1765 * @param paCerts2 Pointer to the second certificate table.1766 * @param cCerts2 Entries in the second certificate table.1767 * @param paCerts3 Pointer to the third certificate table.1768 * @param cCerts3 Entries in the third certificate table.1769 1750 * @param pErrInfo Where to return extended error info. Optional. 1770 1751 * @param pszErrorTag Error tag. 1771 */ 1772 static int supHardNtViCertStoreInit(PRTCRSTORE phStore, 1773 PCSUPTAENTRY paCerts1, unsigned cCerts1, 1774 PCSUPTAENTRY paCerts2, unsigned cCerts2, 1775 PCSUPTAENTRY paCerts3, unsigned cCerts3, 1776 PRTERRINFO pErrInfo, const char *pszErrorTag) 1752 * @param cTables Number of table pairs. 1753 * @param ... Pairs of PCSUPTAENTRY and unsigned. 1754 * 1755 */ 1756 static int supHardNtViCertStoreInit(PRTCRSTORE phStore, PRTERRINFO pErrInfo, const char *pszErrorTag, unsigned cTables, ...) 1777 1757 { 1778 1758 AssertReturn(*phStore == NIL_RTCRSTORE, VERR_WRONG_ORDER); 1779 1759 RT_NOREF1(pszErrorTag); 1780 1760 1781 int rc = RTCrStoreCreateInMem(phStore, cCerts1 + cCerts2); 1761 va_list va; 1762 va_start(va, cTables); 1763 unsigned cTotalCerts = 0; 1764 for (unsigned iTable = 0; iTable < cTables; iTable++) 1765 { 1766 va_arg(va, PCSUPTAENTRY); 1767 cTotalCerts += va_arg(va, unsigned); 1768 } 1769 1770 int rc = RTCrStoreCreateInMem(phStore, cTotalCerts); 1782 1771 if (RT_FAILURE(rc)) 1783 1772 return RTErrInfoSetF(pErrInfo, rc, "RTCrStoreCreateMemoryStore failed: %Rrc", rc); 1784 1773 1785 rc = supHardNtViCertStoreAddArray(*phStore, paCerts1, cCerts1, pErrInfo); 1786 if (RT_SUCCESS(rc)) 1787 rc = supHardNtViCertStoreAddArray(*phStore, paCerts2, cCerts2, pErrInfo); 1788 if (RT_SUCCESS(rc)) 1789 rc = supHardNtViCertStoreAddArray(*phStore, paCerts3, cCerts3, pErrInfo); 1774 va_start(va, cTables); 1775 for (unsigned iTable = 0; iTable < cTables; iTable++) 1776 { 1777 PCSUPTAENTRY const paCerts = va_arg(va, PCSUPTAENTRY); 1778 unsigned const cCerts = va_arg(va, unsigned); 1779 for (unsigned iCert = 0; iCert < cCerts; iCert++) 1780 { 1781 rc = RTCrStoreCertAddEncoded(*phStore, paCerts[iCert].fEnc, paCerts[iCert].pch, paCerts[iCert].cb, pErrInfo); 1782 if (RT_FAILURE(rc)) 1783 { 1784 SUP_DPRINTF(("supHardNtViCertStoreInit: %s: iTable=%u iCert=%u: fEnc=%#x cb=%#x rc=%Rrc\n", 1785 pszErrorTag, iTable, iCert, paCerts[iCert].fEnc, paCerts[iCert].cb, rc)); 1786 va_end(va); 1787 return rc; 1788 } 1789 } 1790 } 1791 va_end(va); 1790 1792 return rc; 1791 1793 } … … 2019 2021 */ 2020 2022 rc = supHardNtViCertInit(&g_BuildX509Cert, g_abSUPBuildCert, g_cbSUPBuildCert, pErrInfo, "BuildCertificate"); 2021 SUPTAENTRY const aBuildCerts[1] = { { g_abSUPBuildCert, g_cbSUPBuildCert, true }, };2022 2023 if (RT_SUCCESS(rc)) 2023 rc = supHardNtViCertStoreInit(&g_hSpecialTrustStore, 2024 aBuildCerts, RT_ELEMENTS(aBuildCerts), 2025 g_aSUPTrustedTAs, g_cSUPTrustedTAs, 2026 NULL, 0, 2027 pErrInfo, "SpecialTrustStore"); 2024 rc = supHardNtViCertStoreInit(&g_hSpecialTrustStore, pErrInfo, "SpecialTrustStore", 1, 2025 g_aSUPTrustedTAs, g_cSUPTrustedTAs); 2028 2026 if (RT_SUCCESS(rc)) 2029 rc = supHardNtViCertStoreInit(&g_hSpcRootStore, g_aSUPSpcRootTAs, g_cSUPSpcRootTAs, 2030 NULL, 0, NULL, 0, pErrInfo, "SpcRoot"); 2027 rc = supHardNtViCertStoreInit(&g_hSpcRootStore, pErrInfo, "SpcRoot", 1, g_aSUPSpcRootTAs, g_cSUPSpcRootTAs); 2031 2028 if (RT_SUCCESS(rc)) 2032 rc = supHardNtViCertStoreInit(&g_hNtKernelRootStore, g_aSUPNtKernelRootTAs, g_cSUPNtKernelRootTAs,2033 NULL, 0, NULL, 0, pErrInfo, "NtKernelRoot");2029 rc = supHardNtViCertStoreInit(&g_hNtKernelRootStore, pErrInfo, "NtKernelRoot", 1, 2030 g_aSUPNtKernelRootTAs, g_cSUPNtKernelRootTAs); 2034 2031 if (RT_SUCCESS(rc)) 2035 rc = supHardNtViCertStoreInit(&g_hSpcAndNtKernelRootStore, 2032 { 2033 SUPTAENTRY const aBuildCerts[] = { { g_abSUPBuildCert, g_cbSUPBuildCert, RTCRCERTCTX_F_ENC_X509_DER }, }; 2034 rc = supHardNtViCertStoreInit(&g_hSpcAndNtKernelRootStore, pErrInfo, "SpcAndNtKernelRoot", 4, 2036 2035 g_aSUPSpcRootTAs, g_cSUPSpcRootTAs, 2037 2036 g_aSUPNtKernelRootTAs, g_cSUPNtKernelRootTAs, 2038 2037 g_aSUPTimestampTAs, g_cSUPTimestampTAs, 2039 pErrInfo, "SpcAndNtKernelRoot"); 2038 aBuildCerts, (unsigned)RT_ELEMENTS(aBuildCerts)); 2039 } 2040 2040 if (RT_SUCCESS(rc)) 2041 rc = supHardNtViCertStoreInit(&g_hSpcAndNtKernelSuppStore, 2042 NULL, 0, NULL, 0, NULL, 0, 2043 pErrInfo, "SpcAndNtKernelSupplemental"); 2044 2045 #if 0 /* For the time being, always trust the build certificate. It bypasses the timestamp issues of CRT and SDL. */ 2046 /* If the build certificate is a test singing certificate, it must be a 2047 trusted root or we'll fail to validate anything. */ 2048 if ( RT_SUCCESS(rc) 2049 && RTCrX509Name_Compare(&g_BuildX509Cert.TbsCertificate.Subject, &g_BuildX509Cert.TbsCertificate.Issuer) == 0) 2050 #else 2051 if (RT_SUCCESS(rc)) 2052 #endif 2053 rc = RTCrStoreCertAddEncoded(g_hSpcAndNtKernelRootStore, RTCRCERTCTX_F_ENC_X509_DER, 2054 g_abSUPBuildCert, g_cbSUPBuildCert, pErrInfo); 2055 2041 rc = supHardNtViCertStoreInit(&g_hSpcAndNtKernelSuppStore, pErrInfo, "SpcAndNtKernelSupplemental", 0); 2056 2042 if (RT_SUCCESS(rc)) 2057 2043 { -
trunk/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp
r106982 r106998 284 284 * A ntdll code patch. 285 285 */ 286 typedef unionSUPR3HARDNTPATCH286 typedef struct SUPR3HARDNTPATCH 287 287 { 288 288 union … … 3662 3662 * the NTDLL instance we're patching. (Must be +/- 3663 3663 * 2GB from the thunk code.) 3664 * @param pBackup Where to back up the original instruction bytes3665 * at pvLdrInitThunk.3666 3664 * @param pErrInfo Where to return extended error information. 3667 3665 * Optional. 3668 3666 */ 3669 3667 static int supR3HardNtDisableThreadCreationEx(HANDLE hProcess, void *pvLdrInitThunk, void *pvNtTerminateThread, 3670 SUPR3HARDNTPATCH *pBackup, PRTERRINFO pErrInfo) 3671 { 3672 SUP_DPRINTF(("supR3HardNtDisableThreadCreation: pvLdrInitThunk=%p pvNtTerminateThread=%p\n", pvLdrInitThunk, pvNtTerminateThread)); 3668 PRTERRINFO pErrInfo) 3669 { 3670 SUP_DPRINTF(("supR3HardNtDisableThreadCreation: pvLdrInitThunk=%p pvNtTerminateThread=%p g_LdrInitThunkSelfBackup.cb=%d\n", 3671 pvLdrInitThunk, pvNtTerminateThread, g_LdrInitThunkSelfBackup.cb)); 3673 3672 SUPR3HARDENED_ASSERT(RT_ABS((intptr_t)pvLdrInitThunk - (intptr_t)pvNtTerminateThread) < 16*_1M); 3674 3673 … … 3677 3676 */ 3678 3677 SIZE_T cbIgnored; 3679 NTSTATUS rcNt = NtReadVirtualMemory(hProcess, pvLdrInitThunk, pBackup->ab, sizeof(pBackup->ab), &cbIgnored); 3680 if (!NT_SUCCESS(rcNt)) 3681 return RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, 3682 "supR3HardNtDisableThreadCreation: NtReadVirtualMemory/LdrInitializeThunk failed: %#x", rcNt); 3678 NTSTATUS rcNt; 3679 if (g_LdrInitThunkSelfBackup.cb == 0) 3680 { 3681 rcNt = NtReadVirtualMemory(hProcess, pvLdrInitThunk, g_LdrInitThunkSelfBackup.ab, 3682 sizeof(g_LdrInitThunkSelfBackup.ab), &cbIgnored); 3683 if (!NT_SUCCESS(rcNt)) 3684 return RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, 3685 "supR3HardNtDisableThreadCreation: NtReadVirtualMemory/LdrInitializeThunk failed: %#x", rcNt); 3686 SUP_DPRINTF(("supR3HardNtDisableThreadCreationEx: Backup=%.*Rhxs\n", sizeof(g_LdrInitThunkSelfBackup.ab), g_LdrInitThunkSelfBackup.ab)); 3687 } 3683 3688 3684 3689 /* … … 3686 3691 */ 3687 3692 SUPR3HARDNTPATCH Replacement; 3688 memcpy(Replacement.ab, pBackup->ab, sizeof(Replacement.ab));3693 memcpy(Replacement.ab, g_LdrInitThunkSelfBackup.ab, sizeof(Replacement.ab)); 3689 3694 3690 3695 #ifdef RT_ARCH_AMD64 … … 3721 3726 # error "Unsupported arch." 3722 3727 #endif 3723 pBackup->cb = Replacement.cb;3728 g_LdrInitThunkSelfBackup.cb = Replacement.cb; 3724 3729 3725 3730 /* … … 3740 3745 3741 3746 pvProt = pvLdrInitThunk; 3742 cbProt = pBackup->cb;3747 cbProt = Replacement.cb; 3743 3748 rcNt = NtProtectVirtualMemory(hProcess, &pvProt, &cbProt, fOldProt, &fOldProt); 3744 3749 if (!NT_SUCCESS(rcNt)) … … 3757 3762 * @param pvLdrInitThunk The address of the LdrInitializeThunk code to 3758 3763 * override. 3759 * @param pBackup Where to back up the original instruction bytes3760 * at pvLdrInitThunk.3761 3764 * @param pErrInfo Where to return extended error information. 3762 3765 * Optional. 3763 3766 */ 3764 static int supR3HardNtEnableThreadCreationEx(HANDLE hProcess, void *pvLdrInitThunk, SUPR3HARDNTPATCH const *pBackup, 3765 PRTERRINFO pErrInfo) 3767 static int supR3HardNtEnableThreadCreationEx(HANDLE hProcess, void *pvLdrInitThunk, PRTERRINFO pErrInfo) 3766 3768 { 3767 3769 SUP_DPRINTF(("supR3HardNtEnableThreadCreationEx:\n")); 3768 SUPR3HARDENED_ASSERT( pBackup->cb > 4);3770 SUPR3HARDENED_ASSERT(g_LdrInitThunkSelfBackup.cb > 4); 3769 3771 3770 3772 PVOID pvProt = pvLdrInitThunk; 3771 SIZE_T cbProt = pBackup->cb;3773 SIZE_T cbProt = g_LdrInitThunkSelfBackup.cb; 3772 3774 ULONG fOldProt = 0; 3773 3775 NTSTATUS rcNt = NtProtectVirtualMemory(hProcess, &pvProt, &cbProt, PAGE_EXECUTE_READWRITE, &fOldProt); … … 3777 3779 3778 3780 SIZE_T cbIgnored; 3779 rcNt = NtWriteVirtualMemory(hProcess, pvLdrInitThunk, pBackup->ab, pBackup->cb, &cbIgnored);3781 rcNt = NtWriteVirtualMemory(hProcess, pvLdrInitThunk, g_LdrInitThunkSelfBackup.ab, g_LdrInitThunkSelfBackup.cb, &cbIgnored); 3780 3782 if (!NT_SUCCESS(rcNt)) 3781 3783 return RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE, … … 3784 3786 3785 3787 pvProt = pvLdrInitThunk; 3786 cbProt = pBackup->cb;3788 cbProt = g_LdrInitThunkSelfBackup.cb; 3787 3789 rcNt = NtProtectVirtualMemory(hProcess, &pvProt, &cbProt, fOldProt, &fOldProt); 3788 3790 if (!NT_SUCCESS(rcNt)) … … 3813 3815 (void *)(uintptr_t)&LdrInitializeThunk, 3814 3816 (void *)(uintptr_t)s_pfnNtTerminateThread, 3815 &g_LdrInitThunkSelfBackup,3816 3817 NULL /* pErrInfo*/); 3817 3818 g_fSupInitThunkSelfPatched = RT_SUCCESS(rc); … … 3828 3829 int rc = supR3HardNtEnableThreadCreationEx(NtCurrentProcess(), 3829 3830 (void *)(uintptr_t)&LdrInitializeThunk, 3830 &g_LdrInitThunkSelfBackup,3831 3831 RTErrInfoInitStatic(&g_ErrInfoStatic)); 3832 3832 if (RT_FAILURE(rc))
Note:
See TracChangeset
for help on using the changeset viewer.