VirtualBox

vbox的更動 67977 路徑 trunk/src/VBox/HostDrivers


忽略:
時間撮記:
2017-7-14 下午03:09:46 (7 年 以前)
作者:
vboxsync
訊息:

More updates.

檔案:
修改 1 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp

    r67968 r67977  
    15681568                                     PLARGE_INTEGER pcbSection, ULONG fProtect, ULONG fAttribs, HANDLE hFile)
    15691569{
     1570    bool fNeedUncChecking = false;
    15701571    if (   hFile != NULL
    15711572        && hFile != INVALID_HANDLE_VALUE)
     
    15771578        if (fImage || fExecMap || fExecProt)
    15781579        {
     1580            fNeedUncChecking = true;
    15791581            DWORD dwSavedLastError = RtlGetLastWin32Error();
    15801582
     
    15991601     * Call checked out OK, call the original.
    16001602     */
    1601     return g_pfnNtCreateSectionReal(phSection, fAccess, pObjAttribs, pcbSection, fProtect, fAttribs, hFile);
     1603    NTSTATUS rcNtReal = g_pfnNtCreateSectionReal(phSection, fAccess, pObjAttribs, pcbSection, fProtect, fAttribs, hFile);
     1604
     1605    /*
     1606     * Check that the image that got mapped bear some resemblance to the one that was
     1607     * requested.  Apparently there are ways to trick the NT cache manager to map a
     1608     * file different from hFile into memory using local UNC accesses.
     1609     */
     1610    if (   NT_SUCCESS(rcNtReal)
     1611        && fNeedUncChecking)
     1612    {
     1613        DWORD dwSavedLastError = RtlGetLastWin32Error();
     1614
     1615        bool fOkay = false;
     1616
     1617        /* To get the name of the file backing the section, we unfortunately have to map it. */
     1618        SIZE_T   cbView   = 0;
     1619        PVOID    pvTmpMap = NULL;
     1620        NTSTATUS rcNt = NtMapViewOfSection(*phSection, NtCurrentProcess(), &pvTmpMap, 0, 0, NULL /*poffSection*/, &cbView,
     1621                                           ViewUnmap, MEM_TOP_DOWN, PAGE_EXECUTE);
     1622        if (NT_SUCCESS(rcNt))
     1623        {
     1624            /* Query the name. */
     1625            union
     1626            {
     1627                UNICODE_STRING  UniStr;
     1628                RTUTF16         awcBuf[512];
     1629            } uBuf;
     1630            RT_ZERO(uBuf);
     1631            SIZE_T   cbActual = 0;
     1632            NTSTATUS rcNtQuery = NtQueryVirtualMemory(NtCurrentProcess(), pvTmpMap, MemorySectionName,
     1633                                                      &uBuf, sizeof(uBuf) - sizeof(RTUTF16), &cbActual);
     1634
     1635            /* Unmap the view. */
     1636            rcNt = NtUnmapViewOfSection(NtCurrentProcess(), pvTmpMap);
     1637            if (!NT_SUCCESS(rcNt))
     1638                SUP_DPRINTF(("supR3HardenedMonitor_NtCreateSection: NtUnmapViewOfSection failed on %p (hSection=%p, hFile=%p) with %#x!\n",
     1639                             pvTmpMap, *phSection, hFile, rcNt));
     1640
     1641            /* Process the name query result. */
     1642            if (NT_SUCCESS(rcNtQuery))
     1643            {
     1644                static UNICODE_STRING const s_UncPrefix = RTNT_CONSTANT_UNISTR(L"\\Device\\Mup");
     1645                if (!supHardViUniStrPathStartsWithUniStr(&uBuf.UniStr, &s_UncPrefix, true /*fCheckSlash*/))
     1646                    fOkay = true;
     1647                else
     1648                    supR3HardenedError(VINF_SUCCESS, false,
     1649                                       "supR3HardenedMonitor_NtCreateSection: Image section with UNC path is not trusted: '%.*ls'\n",
     1650                                       uBuf.UniStr.Length / sizeof(RTUTF16), uBuf.UniStr.Buffer);
     1651            }
     1652            else
     1653                SUP_DPRINTF(("supR3HardenedMonitor_NtCreateSection: NtQueryVirtualMemory failed on %p (hFile=%p) with %#x -> STATUS_TRUST_FAILURE\n",
     1654                             *phSection, hFile, rcNt));
     1655        }
     1656        else
     1657            SUP_DPRINTF(("supR3HardenedMonitor_NtCreateSection: NtMapViewOfSection failed on %p (hFile=%p) with %#x -> STATUS_TRUST_FAILURE\n",
     1658                         *phSection, hFile, rcNt));
     1659        if (!fOkay)
     1660        {
     1661            NtClose(*phSection);
     1662            *phSection = INVALID_HANDLE_VALUE;
     1663            RtlRestoreLastWin32Error(dwSavedLastError);
     1664            return STATUS_TRUST_FAILURE;
     1665        }
     1666
     1667        RtlRestoreLastWin32Error(dwSavedLastError);
     1668    }
     1669    return rcNtReal;
    16021670}
    16031671
     
    17341802        return STATUS_INVALID_PARAMETER;
    17351803    }
     1804    PCWCHAR const  pawcOrgName = pName->Buffer;
     1805    uint32_t const cwcOrgName  = pName->Length / sizeof(WCHAR);
     1806
    17361807    /*SUP_DPRINTF(("supR3HardenedMonitor_LdrLoadDll: pName=%.*ls *pfFlags=%#x pwszSearchPath=%p:%ls\n",
    17371808                 (unsigned)pName->Length / sizeof(WCHAR), pName->Buffer, pfFlags ? *pfFlags : UINT32_MAX, pwszSearchPath,
     
    17411812     * Reject long paths that's close to the 260 limit without looking.
    17421813     */
    1743     if (pName->Length > 256 * sizeof(WCHAR))
     1814    if (cwcOrgName > 256)
    17441815    {
    17451816        supR3HardenedError(VINF_SUCCESS, false, "supR3HardenedMonitor_LdrLoadDll: too long name: %#x bytes\n", pName->Length);
     
    17481819        return STATUS_NAME_TOO_LONG;
    17491820    }
     1821
     1822#if 0
     1823    /*
     1824     * Reject all UNC-like paths as we cannot trust non-local files at all.
     1825     * Note! We may have to relax this to deal with long path specifications and NT pass thrus.
     1826     */
     1827    if (   cwcOrgName >= 3
     1828        && RTPATH_IS_SLASH(pawcOrgName[0])
     1829        && RTPATH_IS_SLASH(pawcOrgName[1])
     1830        && !RTPATH_IS_SLASH(pawcOrgName[2]))
     1831    {
     1832        supR3HardenedError(VINF_SUCCESS, false, "supR3HardenedMonitor_LdrLoadDll: rejecting UNC name '%.*ls'\n", cwcOrgName, pawcOrgName);
     1833        SUP_DPRINTF(("supR3HardenedMonitor_LdrLoadDll: returns rcNt=%#x\n", STATUS_REDIRECTOR_NOT_STARTED));
     1834        RtlRestoreLastWin32Error(dwSavedLastError);
     1835        return STATUS_REDIRECTOR_NOT_STARTED;
     1836    }
     1837#endif
    17501838
    17511839    /*
     
    17871875     * Process the name a little, checking if it needs a DLL suffix and is pathless.
    17881876     */
    1789     PCWCHAR         pawcName     = pName->Buffer;
    1790     uint32_t        cwcName      = pName->Length / sizeof(WCHAR);
    17911877    uint32_t        offLastSlash = UINT32_MAX;
    17921878    uint32_t        offLastDot   = UINT32_MAX;
    1793     for (uint32_t i = 0; i < cwcName; i++)
    1794         switch (pawcName[i])
     1879    for (uint32_t i = 0; i < cwcOrgName; i++)
     1880        switch (pawcOrgName[i])
    17951881        {
    17961882            case '\\':
     
    18041890        }
    18051891    bool const fNeedDllSuffix = offLastDot == UINT32_MAX;
    1806     //bool const fTrailingDot   = offLastDot == cwcName - 1;
     1892    //bool const fTrailingDot   = offLastDot == cwcOrgName - 1;
    18071893
    18081894    /*
    18091895     * Absolute path?
    18101896     */
    1811     if (   (   cwcName >= 4
    1812             && RT_C_IS_ALPHA(pawcName[0])
    1813             && pawcName[1] == ':'
    1814             && RTPATH_IS_SLASH(pawcName[2]) )
    1815         || (   cwcName >= 1
    1816             && RTPATH_IS_SLASH(pawcName[0]) )
     1897    if (   (   cwcOrgName >= 4
     1898            && RT_C_IS_ALPHA(pawcOrgName[0])
     1899            && pawcOrgName[1] == ':'
     1900            && RTPATH_IS_SLASH(pawcOrgName[2]) )
     1901        || (   cwcOrgName >= 1
     1902            && RTPATH_IS_SLASH(pawcOrgName[0]) )
    18171903       )
    18181904    {
     
    18501936        {
    18511937            /* Copy the path. */
    1852             memcpy(wszPath, pawcName, cwcName * sizeof(WCHAR));
    1853             if (fNeedDllSuffix)
     1938            memcpy(wszPath, pawcOrgName, cwcOrgName * sizeof(WCHAR));
     1939            if (!fNeedDllSuffix)
     1940                wszPath[cwcOrgName] = '\0';
     1941            else
    18541942            {
    1855                 if (cwcName + 4 >= RT_ELEMENTS(wszPath))
     1943                if (cwcOrgName + 4 >= RT_ELEMENTS(wszPath))
    18561944                {
    18571945                    supR3HardenedError(VINF_SUCCESS, false,
    1858                                        "supR3HardenedMonitor_LdrLoadDll: Name too long (abs): %.*ls\n", cwcName, pawcName);
     1946                                       "supR3HardenedMonitor_LdrLoadDll: Name too long (abs): %.*ls\n", cwcOrgName, pawcOrgName);
    18591947                    SUP_DPRINTF(("supR3HardenedMonitor_LdrLoadDll: returns rcNt=%#x\n", STATUS_NAME_TOO_LONG));
    18601948                    RtlRestoreLastWin32Error(dwSavedLastError);
    18611949                    return STATUS_NAME_TOO_LONG;
    18621950                }
    1863                 memcpy(&wszPath[cwcName], L".dll", 5 * sizeof(WCHAR));
    1864                 cwcName += 4;
     1951                memcpy(&wszPath[cwcOrgName], L".dll", 5 * sizeof(WCHAR));
    18651952            }
    1866             wszPath[cwcName] = '\0';
    18671953        }
    18681954    }
     
    18961982            supR3HardenedError(VINF_SUCCESS, false,
    18971983                               "supR3HardenedMonitor_LdrLoadDll: relative name not permitted: %.*ls\n",
    1898                                cwcName, pawcName);
     1984                               cwcOrgName, pawcOrgName);
    18991985            SUP_DPRINTF(("supR3HardenedMonitor_LdrLoadDll: returns rcNt=%#x\n", STATUS_OBJECT_NAME_INVALID));
    19001986            RtlRestoreLastWin32Error(dwSavedLastError);
     
    19382024            AssertCompile(sizeof(g_System32WinPath.awcBuffer) <= sizeof(wszPath));
    19392025            cwc = g_System32WinPath.UniStr.Length / sizeof(RTUTF16); Assert(cwc > 2);
    1940             if (cwc + 1 + cwcName + fNeedDllSuffix * 4 >= RT_ELEMENTS(wszPath))
     2026            if (cwc + 1 + cwcOrgName + fNeedDllSuffix * 4 >= RT_ELEMENTS(wszPath))
    19412027            {
    19422028                supR3HardenedError(VINF_SUCCESS, false,
    1943                                    "supR3HardenedMonitor_LdrLoadDll: Name too long (system32): %.*ls\n", cwcName, pawcName);
     2029                                   "supR3HardenedMonitor_LdrLoadDll: Name too long (system32): %.*ls\n", cwcOrgName, pawcOrgName);
    19442030                SUP_DPRINTF(("supR3HardenedMonitor_LdrLoadDll: returns rcNt=%#x\n", STATUS_NAME_TOO_LONG));
    19452031                RtlRestoreLastWin32Error(dwSavedLastError);
     
    19482034            memcpy(wszPath, g_System32WinPath.UniStr.Buffer, cwc * sizeof(RTUTF16));
    19492035            wszPath[cwc++] = '\\';
    1950             memcpy(&wszPath[cwc], pawcName, cwcName * sizeof(WCHAR));
    1951             cwc += cwcName;
     2036            memcpy(&wszPath[cwc], pawcOrgName, cwcOrgName * sizeof(WCHAR));
     2037            cwc += cwcOrgName;
    19522038            if (!fNeedDllSuffix)
    19532039                wszPath[cwc] = '\0';
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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