VirtualBox

source: vbox/trunk/src/VBox/HostDrivers/Support/win/SUPHardenedVerify-win.h@ 80216

Last change on this file since 80216 was 80216, checked in by vboxsync, 6 years ago

SUPHardNt: Restore text and import sections for ntdll, kernelbase and kernel32 for the first process too to try shake nasty stuff like easyhook that modifies the initial thread context and crashes the guest when trying to execute memory we've freed up during child purification.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.0 KB
Line 
1/* $Id: SUPHardenedVerify-win.h 80216 2019-08-10 02:04:07Z vboxsync $ */
2/** @file
3 * VirtualBox Support Library/Driver - Hardened Verification, Windows.
4 */
5
6/*
7 * Copyright (C) 2006-2019 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 *
17 * The contents of this file may alternatively be used under the terms
18 * of the Common Development and Distribution License Version 1.0
19 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20 * VirtualBox OSE distribution, in which case the provisions of the
21 * CDDL are applicable instead of those of the GPL.
22 *
23 * You may elect to license modified versions of this file under the
24 * terms and conditions of either the GPL or the CDDL or both.
25 */
26
27#ifndef VBOX_INCLUDED_SRC_Support_win_SUPHardenedVerify_win_h
28#define VBOX_INCLUDED_SRC_Support_win_SUPHardenedVerify_win_h
29#ifndef RT_WITHOUT_PRAGMA_ONCE
30# pragma once
31#endif
32
33#include <iprt/types.h>
34#include <iprt/crypto/x509.h>
35#ifndef SUP_CERTIFICATES_ONLY
36# ifdef RT_OS_WINDOWS
37# include <iprt/ldr.h>
38# endif
39#endif
40
41
42RT_C_DECLS_BEGIN
43
44#ifndef SUP_CERTIFICATES_ONLY
45# ifdef RT_OS_WINDOWS
46DECLHIDDEN(int) supHardenedWinInitImageVerifier(PRTERRINFO pErrInfo);
47DECLHIDDEN(void) supHardenedWinTermImageVerifier(void);
48DECLHIDDEN(void) supR3HardenedWinVerifyCacheScheduleImports(RTLDRMOD hLdrMod, PCRTUTF16 pwszName);
49DECLHIDDEN(void) supR3HardenedWinVerifyCachePreload(PCRTUTF16 pwszName);
50
51
52typedef enum SUPHARDNTVPKIND
53{
54 SUPHARDNTVPKIND_VERIFY_ONLY = 1,
55 SUPHARDNTVPKIND_CHILD_PURIFICATION,
56 SUPHARDNTVPKIND_SELF_PURIFICATION,
57 SUPHARDNTVPKIND_SELF_PURIFICATION_LIMITED,
58 SUPHARDNTVPKIND_32BIT_HACK = 0x7fffffff
59} SUPHARDNTVPKIND;
60/** @name SUPHARDNTVP_F_XXX - Flags for supHardenedWinVerifyProcess
61 * @{ */
62/** Replace unwanted executable memory allocations with a new one that's filled
63 * with a safe read-write copy (default is just to free it).
64 *
65 * This is one way we attempt to work around buggy protection software that
66 * either result in host BSOD or VBox application malfunction. Here the current
67 * shit list:
68 * - Trend Micro's data protection software includes a buggy driver called
69 * sakfile.sys that has been observed crashing accessing user memory that we
70 * probably freed. I'd love to report this to Trend Micro, but unfortunately
71 * they doesn't advertise (or have?) an email address for reporting security
72 * vulnerabilities in the their software. Having wasted time looking and not
73 * very sorry for having to disclosing the bug here.
74 * - Maybe one more.
75 */
76#define SUPHARDNTVP_F_EXEC_ALLOC_REPLACE_WITH_RW RT_BIT_32(0)
77/** @} */
78DECLHIDDEN(int) supHardenedWinVerifyProcess(HANDLE hProcess, HANDLE hThread, SUPHARDNTVPKIND enmKind, uint32_t fFlags,
79 uint32_t *pcFixes, PRTERRINFO pErrInfo);
80DECLHIDDEN(int) supHardNtVpThread(HANDLE hProcess, HANDLE hThread, PRTERRINFO pErrInfo);
81DECLHIDDEN(int) supHardNtVpDebugger(HANDLE hProcess, PRTERRINFO pErrInfo);
82
83DECLHIDDEN(bool) supHardViUtf16PathIsEqualEx(PCRTUTF16 pawcLeft, size_t cwcLeft, const char *pszRight);
84DECLHIDDEN(bool) supHardViUniStrPathStartsWithUniStr(UNICODE_STRING const *pUniStrLeft,
85 UNICODE_STRING const *pUniStrRight, bool fCheckSlash);
86DECLHIDDEN(bool) supHardViUtf16PathStartsWithEx(PCRTUTF16 pwszLeft, uint32_t cwcLeft,
87 PCRTUTF16 pwszRight, uint32_t cwcRight, bool fCheckSlash);
88DECLHIDDEN(bool) supHardViIsAppPatchDir(PCRTUTF16 pwszPath, uint32_t cwcName);
89
90
91/**
92 * SUP image verifier loader reader instance.
93 */
94typedef struct SUPHNTVIRDR
95{
96 /** The core reader structure. */
97 RTLDRREADER Core;
98 /** The file handle. */
99 HANDLE hFile;
100 /** Handle to event sempahore in case we're force to deal with asynchronous
101 * I/O. */
102 HANDLE hEvent;
103 /** Current file offset. */
104 RTFOFF off;
105 /** The file size. */
106 uint64_t cbFile;
107 /** Flags for the verification callback, SUPHNTVI_F_XXX. */
108 uint32_t fFlags;
109 /** The executable timstamp in second since unix epoch. */
110 uint64_t uTimestamp;
111 /** Log name. */
112 char szFilename[1];
113} SUPHNTVIRDR;
114/** Pointer to an SUP image verifier loader reader instance. */
115typedef SUPHNTVIRDR *PSUPHNTVIRDR;
116DECLHIDDEN(int) supHardNtViRdrCreate(HANDLE hFile, PCRTUTF16 pwszName, uint32_t fFlags, PSUPHNTVIRDR *ppNtViRdr);
117DECLHIDDEN(bool) supHardenedWinIsWinVerifyTrustCallable(void);
118DECLHIDDEN(int) supHardenedWinVerifyImageTrust(HANDLE hFile, PCRTUTF16 pwszName, uint32_t fFlags, int rc,
119 bool *pfWinVerifyTrust, PRTERRINFO pErrInfo);
120DECLHIDDEN(int) supHardenedWinVerifyImageByHandle(HANDLE hFile, PCRTUTF16 pwszName, uint32_t fFlags, bool fAvoidWinVerifyTrust,
121 bool *pfWinVerifyTrust, PRTERRINFO pErrInfo);
122DECLHIDDEN(int) supHardenedWinVerifyImageByHandleNoName(HANDLE hFile, uint32_t fFlags, PRTERRINFO pErrInfo);
123DECLHIDDEN(int) supHardenedWinVerifyImageByLdrMod(RTLDRMOD hLdrMod, PCRTUTF16 pwszName, PSUPHNTVIRDR pNtViRdr,
124 bool fAvoidWinVerifyTrust, bool *pfWinVerifyTrust, PRTERRINFO pErrInfo);
125/** @name SUPHNTVI_F_XXX - Flags for supHardenedWinVerifyImageByHandle.
126 * @{ */
127/** The signing certificate must be the same as the one the VirtualBox build
128 * was signed with. */
129# define SUPHNTVI_F_REQUIRE_BUILD_CERT RT_BIT(0)
130/** Require kernel code signing level. */
131# define SUPHNTVI_F_REQUIRE_KERNEL_CODE_SIGNING RT_BIT(1)
132/** Require the image to force the memory mapper to do signature checking. */
133# define SUPHNTVI_F_REQUIRE_SIGNATURE_ENFORCEMENT RT_BIT(2)
134/** Whether to allow image verification by catalog file. */
135# define SUPHNTVI_F_ALLOW_CAT_FILE_VERIFICATION RT_BIT(3)
136/** The file owner must be TrustedInstaller on Vista+. */
137# define SUPHNTVI_F_TRUSTED_INSTALLER_OWNER RT_BIT(4)
138/** Ignore the image architecture (otherwise it must match the verification
139 * code). Used with resource images and such. */
140# define SUPHNTVI_F_IGNORE_ARCHITECTURE RT_BIT(30)
141/** Raw-mode context image, always 32-bit. */
142# define SUPHNTVI_F_RC_IMAGE RT_BIT(31)
143/** @} */
144
145/* Array in SUPHardenedVerifyImage-win.cpp */
146extern const RTSTRTUPLE g_aSupNtViBlacklistedDlls[];
147
148/**
149 * Loader cache entry.
150 *
151 * This is for avoiding loading and signature checking a file multiple times,
152 * due to multiple passes thru the process validation code (and syscall import
153 * code of NTDLL).
154 */
155typedef struct SUPHNTLDRCACHEENTRY
156{
157 /** The file name (from g_apszSupNtVpAllowedDlls or
158 * g_apszSupNtVpAllowedVmExes). */
159 const char *pszName;
160 /** Load module associated with the image during content verfication. */
161 RTLDRMOD hLdrMod;
162 /** The file reader. */
163 PSUPHNTVIRDR pNtViRdr;
164 /** The module file handle, if we've opened it.
165 * (pNtviRdr does not close the file handle on destruction.) */
166 HANDLE hFile;
167 /** Bits buffer. */
168 uint8_t *pbBits;
169 /** Set if verified. */
170 bool fVerified;
171 /** Whether we've got valid cacheable image bit.s */
172 bool fValidBits;
173 /** The image base address. */
174 uintptr_t uImageBase;
175} SUPHNTLDRCACHEENTRY;
176/** Pointer to a loader cache entry. */
177typedef SUPHNTLDRCACHEENTRY *PSUPHNTLDRCACHEENTRY;
178DECLHIDDEN(int) supHardNtLdrCacheOpen(const char *pszName, PSUPHNTLDRCACHEENTRY *ppEntry, PRTERRINFO pErrInfo);
179DECLHIDDEN(int) supHardNtLdrCacheEntryVerify(PSUPHNTLDRCACHEENTRY pEntry, PCRTUTF16 pwszName, PRTERRINFO pErrInfo);
180DECLHIDDEN(int) supHardNtLdrCacheEntryGetBits(PSUPHNTLDRCACHEENTRY pEntry, uint8_t **ppbBits, RTLDRADDR uBaseAddress,
181 PFNRTLDRIMPORT pfnGetImport, void *pvUser, PRTERRINFO pErrInfo);
182
183
184/** Which directory under the system root to get. */
185typedef enum SUPHARDNTSYSROOTDIR
186{
187 kSupHardNtSysRootDir_System32 = 0,
188 kSupHardNtSysRootDir_WinSxS,
189} SUPHARDNTSYSROOTDIR;
190
191DECLHIDDEN(int) supHardNtGetSystemRootDir(void *pvBuf, uint32_t cbBuf, SUPHARDNTSYSROOTDIR enmDir, PRTERRINFO pErrInfo);
192
193# ifndef SUPHNTVI_NO_NT_STUFF
194
195/** Typical system root directory buffer. */
196typedef struct SUPSYSROOTDIRBUF
197{
198 UNICODE_STRING UniStr;
199 WCHAR awcBuffer[260];
200} SUPSYSROOTDIRBUF;
201extern SUPSYSROOTDIRBUF g_System32NtPath;
202extern SUPSYSROOTDIRBUF g_WinSxSNtPath;
203#if defined(IN_RING3) && !defined(VBOX_PERMIT_EVEN_MORE)
204extern SUPSYSROOTDIRBUF g_ProgramFilesNtPath;
205extern SUPSYSROOTDIRBUF g_CommonFilesNtPath;
206# if ARCH_BITS == 64
207extern SUPSYSROOTDIRBUF g_ProgramFilesX86NtPath;
208extern SUPSYSROOTDIRBUF g_CommonFilesX86NtPath;
209# endif
210#endif /* IN_RING3 && !VBOX_PERMIT_EVEN_MORE */
211extern SUPSYSROOTDIRBUF g_SupLibHardenedExeNtPath;
212extern SUPSYSROOTDIRBUF g_SupLibHardenedAppBinNtPath;
213
214# ifdef IN_RING0
215/** Pointer to NtQueryVirtualMemory. */
216typedef NTSTATUS (NTAPI *PFNNTQUERYVIRTUALMEMORY)(HANDLE, void const *, MEMORY_INFORMATION_CLASS, PVOID, SIZE_T, PSIZE_T);
217extern PFNNTQUERYVIRTUALMEMORY g_pfnNtQueryVirtualMemory;
218# endif
219
220# endif /* SUPHNTVI_NO_NT_STUFF */
221
222/** Creates a combined NT version number for simple comparisons. */
223#define SUP_MAKE_NT_VER_COMBINED(a_uMajor, a_uMinor, a_uBuild, a_uSpMajor, a_uSpMinor) \
224 ( ((uint32_t)((a_uMajor) & UINT32_C(0xf)) << 28) \
225 | ((uint32_t)((a_uMinor) & UINT32_C(0xf)) << 24) \
226 | ((uint32_t)((a_uBuild) & UINT32_C(0xffff)) << 8) \
227 | ((uint32_t)((a_uSpMajor) & UINT32_C(0xf)) << 4) \
228 | (uint32_t)((a_uSpMinor) & UINT32_C(0xf)) )
229/** Simple version of SUP_MAKE_NT_VER_COMBINED. */
230#define SUP_MAKE_NT_VER_SIMPLE(a_uMajor, a_uMinor) SUP_MAKE_NT_VER_COMBINED(a_uMajor, a_uMinor, 0, 0, 0)
231extern uint32_t g_uNtVerCombined;
232
233/** @name NT version constants for less-than checks.
234 * @{ */
235/** Combined NT version number for XP. */
236#define SUP_NT_VER_XP SUP_MAKE_NT_VER_SIMPLE(5,1)
237/** Combined NT version number for Windows server 2003 & XP64. */
238#define SUP_NT_VER_W2K3 SUP_MAKE_NT_VER_SIMPLE(5,2)
239/** Combined NT version number for Vista. */
240#define SUP_NT_VER_VISTA SUP_MAKE_NT_VER_SIMPLE(6,0)
241/** Combined NT version number for Vista with SP1. */
242#define SUP_NT_VER_VISTA_SP1 SUP_MAKE_NT_VER_COMBINED(6,0,6001,1,0)
243/** Combined NT version number for Windows 7. */
244#define SUP_NT_VER_W70 SUP_MAKE_NT_VER_SIMPLE(6,1)
245/** Combined NT version number for Windows 8.0. */
246#define SUP_NT_VER_W80 SUP_MAKE_NT_VER_SIMPLE(6,2)
247/** Combined NT version number for Windows 8.1. */
248#define SUP_NT_VER_W81 SUP_MAKE_NT_VER_SIMPLE(6,3)
249/** @} */
250
251# endif
252
253# ifndef IN_SUP_HARDENED_R3
254# include <iprt/mem.h>
255# include <iprt/string.h>
256
257# define suplibHardenedMemComp memcmp
258# define suplibHardenedMemCopy memcpy
259# define suplibHardenedMemSet memset
260# define suplibHardenedStrCopy strcpy
261# define suplibHardenedStrLen strlen
262# define suplibHardenedStrCat strcat
263# define suplibHardenedStrCmp strcmp
264# define suplibHardenedStrNCmp strncmp
265# else /* IN_SUP_HARDENED_R3 */
266# include <iprt/mem.h>
267# if 0
268# define memcmp suplibHardenedMemComp
269# define memcpy suplibHardenedMemCopy
270# define memset suplibHardenedMemSet
271# define strcpy suplibHardenedStrCopy
272# define strlen suplibHardenedStrLen
273# define strcat suplibHardenedStrCat
274# define strcmp suplibHardenedStrCmp
275# define strncmp suplibHardenedStrNCmp
276# endif
277# endif /* IN_SUP_HARDENED_R3 */
278
279#endif /* SUP_CERTIFICATES_ONLY */
280
281RT_C_DECLS_END
282
283#endif /* !VBOX_INCLUDED_SRC_Support_win_SUPHardenedVerify_win_h */
284
Note: See TracBrowser for help on using the repository browser.

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