VirtualBox

Changeset 52704 in vbox for trunk/src/VBox/HostDrivers


Ignore:
Timestamp:
Sep 11, 2014 2:48:45 PM (10 years ago)
Author:
vboxsync
Message:

SUP: Apply redirection to full paths too.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/Support/win/SUPR3HardenedMain-win.cpp

    r52703 r52704  
    15621562
    15631563/**
     1564 * Helper for supR3HardenedMonitor_LdrLoadDll.
     1565 *
     1566 * @returns NT status code.
     1567 * @param   pwszPath        The path destination buffer.
     1568 * @param   cwcPath         The size of the path buffer.
     1569 * @param   pUniStrResult   The result string.
     1570 * @param   pOrgName        The orignal name (for errors).
     1571 * @param   pcwc            Where to return the actual length.
     1572 */
     1573static NTSTATUS supR3HardenedCopyRedirectionResult(WCHAR *pwszPath, size_t cwcPath, PUNICODE_STRING pUniStrResult,
     1574                                                   PUNICODE_STRING pOrgName, UINT *pcwc)
     1575{
     1576    UINT cwc;
     1577    *pcwc = cwc = pUniStrResult->Length / sizeof(WCHAR);
     1578    if (pUniStrResult->Buffer == pwszPath)
     1579        pwszPath[cwc] = '\0';
     1580    else
     1581    {
     1582        if (cwc > cwcPath - 1)
     1583        {
     1584            supR3HardenedError(VINF_SUCCESS, false,
     1585                               "supR3HardenedMonitor_LdrLoadDll: Name too long: %.*ls -> %.*ls (RtlDosApplyFileIoslationRedirection_Ustr)\n",
     1586                               pOrgName->Length / sizeof(WCHAR), pOrgName->Buffer,
     1587                               pUniStrResult->Length / sizeof(WCHAR), pUniStrResult->Buffer);
     1588            return STATUS_NAME_TOO_LONG;
     1589        }
     1590        memcpy(&pwszPath[0], pUniStrResult->Buffer, pUniStrResult->Length);
     1591        pwszPath[cwc] = '\0';
     1592    }
     1593    return STATUS_SUCCESS;
     1594}
     1595
     1596
     1597/**
    15641598 * Hooks that intercepts LdrLoadDll calls.
    15651599 *
     
    15961630        supR3HardenedError(VINF_SUCCESS, false, "supR3HardenedMonitor_LdrLoadDll: name is NULL or have a zero length.\n");
    15971631        SUP_DPRINTF(("supR3HardenedMonitor_LdrLoadDll: returns rcNt=%#x (pName=%p)\n", STATUS_INVALID_PARAMETER, pName));
     1632        SetLastError(dwSavedLastError);
    15981633        return STATUS_INVALID_PARAMETER;
    15991634    }
     
    16091644        supR3HardenedError(VINF_SUCCESS, false, "supR3HardenedMonitor_LdrLoadDll: too long name: %#x bytes\n", pName->Length);
    16101645        SUP_DPRINTF(("supR3HardenedMonitor_LdrLoadDll: returns rcNt=%#x\n", STATUS_NAME_TOO_LONG));
     1646        SetLastError(dwSavedLastError);
    16111647        return STATUS_NAME_TOO_LONG;
    16121648    }
     
    16171653    bool            fSkipValidation = false;
    16181654    WCHAR           wszPath[260];
     1655    static UNICODE_STRING const s_DefaultSuffix = RTNT_CONSTANT_UNISTR(L".dll");
     1656    UNICODE_STRING  UniStrStatic   = { 0, (USHORT)sizeof(wszPath) - sizeof(WCHAR), wszPath };
     1657    UNICODE_STRING  UniStrDynamic  = { 0, 0, NULL };
     1658    PUNICODE_STRING pUniStrResult  = NULL;
    16191659    UNICODE_STRING  ResolvedName;
     1660
    16201661    if (   (   pName->Length >= 4 * sizeof(WCHAR)
    16211662            && RT_C_IS_ALPHA(pName->Buffer[0])
     
    16261667       )
    16271668    {
    1628         memcpy(wszPath, pName->Buffer, pName->Length);
    1629         wszPath[pName->Length / sizeof(WCHAR)] = '\0';
     1669        rcNt = RtlDosApplyFileIsolationRedirection_Ustr(1 /*fFlags*/,
     1670                                                        pName,
     1671                                                        (PUNICODE_STRING)&s_DefaultSuffix,
     1672                                                        &UniStrStatic,
     1673                                                        &UniStrDynamic,
     1674                                                        &pUniStrResult,
     1675                                                        NULL /*pNewFlags*/,
     1676                                                        NULL /*pcbFilename*/,
     1677                                                        NULL /*pcbNeeded*/);
     1678        if (NT_SUCCESS(rcNt))
     1679        {
     1680            UINT cwc;
     1681            rcNt = supR3HardenedCopyRedirectionResult(wszPath, RT_ELEMENTS(wszPath), pUniStrResult, pName, &cwc);
     1682            RtlFreeUnicodeString(&UniStrDynamic);
     1683            if (!NT_SUCCESS(rcNt))
     1684            {
     1685                SUP_DPRINTF(("supR3HardenedMonitor_LdrLoadDll: returns rcNt=%#x\n", rcNt));
     1686                SetLastError(dwSavedLastError);
     1687                return rcNt;
     1688            }
     1689
     1690            ResolvedName.Buffer = wszPath;
     1691            ResolvedName.Length = (USHORT)(cwc * sizeof(WCHAR));
     1692            ResolvedName.MaximumLength = ResolvedName.Length + sizeof(WCHAR);
     1693
     1694            SUP_DPRINTF(("supR3HardenedMonitor_LdrLoadDll: '%.*ls' -> '%.*ls' [redir]\n",
     1695                         (unsigned)pName->Length / sizeof(WCHAR), pName->Buffer,
     1696                         ResolvedName.Length / sizeof(WCHAR), ResolvedName.Buffer, rcNt));
     1697            pName = &ResolvedName;
     1698        }
     1699        else
     1700        {
     1701            memcpy(wszPath, pName->Buffer, pName->Length);
     1702            wszPath[pName->Length / sizeof(WCHAR)] = '\0';
     1703        }
    16301704    }
    16311705    /*
     
    16791753                               cwcName, pawcName);
    16801754            SUP_DPRINTF(("supR3HardenedMonitor_LdrLoadDll: returns rcNt=%#x\n", STATUS_OBJECT_NAME_INVALID));
     1755            SetLastError(dwSavedLastError);
    16811756            return STATUS_OBJECT_NAME_INVALID;
    16821757        }
     
    16871762         * returns a full DOS path.
    16881763         */
    1689         UINT            cwc;
    1690         static UNICODE_STRING const s_DefaultSuffix = RTNT_CONSTANT_UNISTR(L".dll");
    1691         UNICODE_STRING  UniStrStatic   = { 0, (USHORT)sizeof(wszPath) - sizeof(WCHAR), wszPath };
    1692         UNICODE_STRING  UniStrDynamic = { 0, 0, NULL };
    1693         PUNICODE_STRING pUniStrResult  = NULL;
     1764        UINT cwc;
    16941765        rcNt = RtlDosApplyFileIsolationRedirection_Ustr(1 /*fFlags*/,
    16951766                                                        pName,
     
    17031774        if (NT_SUCCESS(rcNt))
    17041775        {
    1705             cwc = pUniStrResult->Length / sizeof(WCHAR);
    1706             if (pUniStrResult != &UniStrDynamic)
    1707                 wszPath[cwc] = '\0';
    1708             else
     1776            rcNt = supR3HardenedCopyRedirectionResult(wszPath, RT_ELEMENTS(wszPath), pUniStrResult, pName, &cwc);
     1777            RtlFreeUnicodeString(&UniStrDynamic);
     1778            if (!NT_SUCCESS(rcNt))
    17091779            {
    1710                 if (pUniStrResult->Length > sizeof(wszPath) - sizeof(WCHAR))
    1711                 {
    1712                     supR3HardenedError(VINF_SUCCESS, false,
    1713                                        "supR3HardenedMonitor_LdrLoadDll: Name too long: %.*ls -> %.*ls (RtlDosApplyFileIoslationRedirection_Ustr)\n",
    1714                                        pName->Length / sizeof(WCHAR), pName->Buffer,
    1715                                        pUniStrResult->Length / sizeof(WCHAR), pUniStrResult->Buffer);
    1716                     RtlFreeUnicodeString(&UniStrDynamic);
    1717                     SUP_DPRINTF(("supR3HardenedMonitor_LdrLoadDll: returns rcNt=%#x\n", STATUS_NAME_TOO_LONG));
    1718                     return STATUS_NAME_TOO_LONG;
    1719                 }
    1720                 memcpy(&wszPath[0], pUniStrResult->Buffer, pUniStrResult->Length);
    1721                 wszPath[cwc] = '\0';
     1780                SUP_DPRINTF(("supR3HardenedMonitor_LdrLoadDll: returns rcNt=%#x\n", rcNt));
     1781                SetLastError(dwSavedLastError);
     1782                return rcNt;
    17221783            }
    1723             RtlFreeUnicodeString(&UniStrDynamic);
    17241784        }
    17251785        else
     
    17351795                                   "supR3HardenedMonitor_LdrLoadDll: GetSystemDirectoryW failed: %u\n", GetLastError());
    17361796                SUP_DPRINTF(("supR3HardenedMonitor_LdrLoadDll: returns rcNt=%#x\n", STATUS_UNEXPECTED_IO_ERROR));
     1797                SetLastError(dwSavedLastError);
    17371798                return STATUS_UNEXPECTED_IO_ERROR;
    17381799            }
     
    17421803                                   "supR3HardenedMonitor_LdrLoadDll: Name too long (system32): %.*ls\n", cwcName, pawcName);
    17431804                SUP_DPRINTF(("supR3HardenedMonitor_LdrLoadDll: returns rcNt=%#x\n", STATUS_NAME_TOO_LONG));
     1805                SetLastError(dwSavedLastError);
    17441806                return STATUS_NAME_TOO_LONG;
    17451807            }
     
    17921854                    SUP_DPRINTF(("supR3HardenedMonitor_LdrLoadDll: returns rcNt=%#x '%ls'\n", rcNt, wszPath));
    17931855                }
     1856                SetLastError(dwSavedLastError);
    17941857                return rcNt;
    17951858            }
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