VirtualBox

Changeset 106998 in vbox


Ignore:
Timestamp:
Nov 14, 2024 1:14:23 AM (3 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
165934
Message:

SUPHardNt: Fixed two more bugs from r165898, first more mixing of TAFs and X.509 certs, second that SUPR3HARDNTPATCH should be a struct not a union. jiraref:VBP-1442

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/sup.h

    r106968 r106998  
    27732773    const unsigned char    *pch;
    27742774    /** 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;
    27762779} SUPTAENTRY;
    27772780/** Pointer to a trust anchor table entry. */
    27782781typedef SUPTAENTRY const *PCSUPTAENTRY;
    27792782
    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 }
    27822788
    27832789/** All certificates we know. */
  • trunk/src/VBox/HostDrivers/Support/Makefile.kmk

    r106985 r106998  
    134134if "$(KBUILD_TARGET)" == "win" && defined(VBOX_WITH_HARDENING)
    135135 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)),') \
    138138        '};' 'unsigned const g_cSUP$(1)TAs = RT_ELEMENTS(g_aSUP$(1)TAs);' '' ''
    139139else
    140140 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)),') \
    142142        '};' 'unsigned const g_cSUP$(1)TAs = RT_ELEMENTS(g_aSUP$(1)TAs);' '' ''
    143143endif
     
    162162        '' \
    163163        '#include <VBox/sup.h>' \
     164        '#include <iprt/crypto/store.h>' \
    164165               ''
    165166        $(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  
    17441744
    17451745
    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 
    17591746/**
    17601747 * Initialize a certificate table.
    17611748 *
    17621749 * @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.
    17691750 * @param   pErrInfo            Where to return extended error info. Optional.
    17701751 * @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 */
     1756static int supHardNtViCertStoreInit(PRTCRSTORE phStore, PRTERRINFO pErrInfo, const char *pszErrorTag, unsigned cTables, ...)
    17771757{
    17781758    AssertReturn(*phStore == NIL_RTCRSTORE, VERR_WRONG_ORDER);
    17791759    RT_NOREF1(pszErrorTag);
    17801760
    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);
    17821771    if (RT_FAILURE(rc))
    17831772        return RTErrInfoSetF(pErrInfo, rc, "RTCrStoreCreateMemoryStore failed: %Rrc", rc);
    17841773
    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);
    17901792    return rc;
    17911793}
     
    20192021         */
    20202022        rc = supHardNtViCertInit(&g_BuildX509Cert, g_abSUPBuildCert, g_cbSUPBuildCert, pErrInfo, "BuildCertificate");
    2021         SUPTAENTRY const aBuildCerts[1] = { { g_abSUPBuildCert, g_cbSUPBuildCert, true }, };
    20222023        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);
    20282026        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);
    20312028        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);
    20342031        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,
    20362035                                          g_aSUPSpcRootTAs, g_cSUPSpcRootTAs,
    20372036                                          g_aSUPNtKernelRootTAs, g_cSUPNtKernelRootTAs,
    20382037                                          g_aSUPTimestampTAs, g_cSUPTimestampTAs,
    2039                                           pErrInfo, "SpcAndNtKernelRoot");
     2038                                          aBuildCerts, (unsigned)RT_ELEMENTS(aBuildCerts));
     2039        }
    20402040        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);
    20562042        if (RT_SUCCESS(rc))
    20572043        {
  • trunk/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp

    r106982 r106998  
    284284 * A ntdll code patch.
    285285 */
    286 typedef union SUPR3HARDNTPATCH
     286typedef struct SUPR3HARDNTPATCH
    287287{
    288288    union
     
    36623662 *                              the NTDLL instance we're patching.  (Must be +/-
    36633663 *                              2GB from the thunk code.)
    3664  * @param   pBackup             Where to back up the original instruction bytes
    3665  *                              at pvLdrInitThunk.
    36663664 * @param   pErrInfo            Where to return extended error information.
    36673665 *                              Optional.
    36683666 */
    36693667static 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));
    36733672    SUPR3HARDENED_ASSERT(RT_ABS((intptr_t)pvLdrInitThunk - (intptr_t)pvNtTerminateThread) < 16*_1M);
    36743673
     
    36773676     */
    36783677    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    }
    36833688
    36843689    /*
     
    36863691     */
    36873692    SUPR3HARDNTPATCH Replacement;
    3688     memcpy(Replacement.ab, pBackup->ab, sizeof(Replacement.ab));
     3693    memcpy(Replacement.ab, g_LdrInitThunkSelfBackup.ab, sizeof(Replacement.ab));
    36893694
    36903695#ifdef RT_ARCH_AMD64
     
    37213726# error "Unsupported arch."
    37223727#endif
    3723     pBackup->cb = Replacement.cb;
     3728    g_LdrInitThunkSelfBackup.cb = Replacement.cb;
    37243729
    37253730    /*
     
    37403745
    37413746    pvProt   = pvLdrInitThunk;
    3742     cbProt   = pBackup->cb;
     3747    cbProt   = Replacement.cb;
    37433748    rcNt = NtProtectVirtualMemory(hProcess, &pvProt, &cbProt, fOldProt, &fOldProt);
    37443749    if (!NT_SUCCESS(rcNt))
     
    37573762 * @param   pvLdrInitThunk      The address of the LdrInitializeThunk code to
    37583763 *                              override.
    3759  * @param   pBackup             Where to back up the original instruction bytes
    3760  *                              at pvLdrInitThunk.
    37613764 * @param   pErrInfo            Where to return extended error information.
    37623765 *                              Optional.
    37633766 */
    3764 static int supR3HardNtEnableThreadCreationEx(HANDLE hProcess, void *pvLdrInitThunk, SUPR3HARDNTPATCH const *pBackup,
    3765                                              PRTERRINFO pErrInfo)
     3767static int supR3HardNtEnableThreadCreationEx(HANDLE hProcess, void *pvLdrInitThunk, PRTERRINFO pErrInfo)
    37663768{
    37673769    SUP_DPRINTF(("supR3HardNtEnableThreadCreationEx:\n"));
    3768     SUPR3HARDENED_ASSERT(pBackup->cb > 4);
     3770    SUPR3HARDENED_ASSERT(g_LdrInitThunkSelfBackup.cb > 4);
    37693771
    37703772    PVOID  pvProt   = pvLdrInitThunk;
    3771     SIZE_T cbProt   = pBackup->cb;
     3773    SIZE_T cbProt   = g_LdrInitThunkSelfBackup.cb;
    37723774    ULONG  fOldProt = 0;
    37733775    NTSTATUS rcNt = NtProtectVirtualMemory(hProcess, &pvProt, &cbProt, PAGE_EXECUTE_READWRITE, &fOldProt);
     
    37773779
    37783780    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);
    37803782    if (!NT_SUCCESS(rcNt))
    37813783        return RTErrInfoSetF(pErrInfo, VERR_GENERAL_FAILURE,
     
    37843786
    37853787    pvProt   = pvLdrInitThunk;
    3786     cbProt   = pBackup->cb;
     3788    cbProt   = g_LdrInitThunkSelfBackup.cb;
    37873789    rcNt = NtProtectVirtualMemory(hProcess, &pvProt, &cbProt, fOldProt, &fOldProt);
    37883790    if (!NT_SUCCESS(rcNt))
     
    38133815                                                (void *)(uintptr_t)&LdrInitializeThunk,
    38143816                                                (void *)(uintptr_t)s_pfnNtTerminateThread,
    3815                                                 &g_LdrInitThunkSelfBackup,
    38163817                                                NULL /* pErrInfo*/);
    38173818    g_fSupInitThunkSelfPatched = RT_SUCCESS(rc);
     
    38283829        int rc = supR3HardNtEnableThreadCreationEx(NtCurrentProcess(),
    38293830                                                   (void *)(uintptr_t)&LdrInitializeThunk,
    3830                                                    &g_LdrInitThunkSelfBackup,
    38313831                                                   RTErrInfoInitStatic(&g_ErrInfoStatic));
    38323832        if (RT_FAILURE(rc))
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette