1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/WindowsProcessMitigations.h"
#include <processthreadsapi.h>
#include "mozilla/DynamicallyLinkedFunctionPtr.h"
#include "mozilla/WindowsVersion.h"
static_assert(sizeof(PROCESS_MITIGATION_DYNAMIC_CODE_POLICY) == 4);
namespace mozilla {
static decltype(&::GetProcessMitigationPolicy)
FetchGetProcessMitigationPolicyFunc() {
static const StaticDynamicallyLinkedFunctionPtr<
decltype(&::GetProcessMitigationPolicy)>
pGetProcessMitigationPolicy(L"kernel32.dll",
"GetProcessMitigationPolicy");
return pGetProcessMitigationPolicy;
}
static bool sWin32kLockedDownInPolicy = false;
MFBT_API bool IsWin32kLockedDown() {
static bool sWin32kLockedDown = []() {
auto pGetProcessMitigationPolicy = FetchGetProcessMitigationPolicyFunc();
PROCESS_MITIGATION_SYSTEM_CALL_DISABLE_POLICY polInfo;
if (!pGetProcessMitigationPolicy ||
!pGetProcessMitigationPolicy(::GetCurrentProcess(),
ProcessSystemCallDisablePolicy, &polInfo,
sizeof(polInfo))) {
// We failed to get pointer to GetProcessMitigationPolicy or the call
// to it failed, so just return what the sandbox policy says.
return sWin32kLockedDownInPolicy;
}
return !!polInfo.DisallowWin32kSystemCalls;
}();
return sWin32kLockedDown;
}
MFBT_API void SetWin32kLockedDownInPolicy() {
sWin32kLockedDownInPolicy = true;
}
MFBT_API bool IsDynamicCodeDisabled() {
auto pGetProcessMitigationPolicy = FetchGetProcessMitigationPolicyFunc();
if (!pGetProcessMitigationPolicy) {
return false;
}
PROCESS_MITIGATION_DYNAMIC_CODE_POLICY polInfo;
if (!pGetProcessMitigationPolicy(::GetCurrentProcess(),
ProcessDynamicCodePolicy, &polInfo,
sizeof(polInfo))) {
return false;
}
return polInfo.ProhibitDynamicCode;
}
MFBT_API bool IsEafPlusEnabled() {
auto pGetProcessMitigationPolicy = FetchGetProcessMitigationPolicyFunc();
if (!pGetProcessMitigationPolicy) {
return false;
}
PROCESS_MITIGATION_PAYLOAD_RESTRICTION_POLICY polInfo;
if (!pGetProcessMitigationPolicy(::GetCurrentProcess(),
ProcessPayloadRestrictionPolicy, &polInfo,
sizeof(polInfo))) {
return false;
}
return polInfo.EnableExportAddressFilterPlus;
}
MFBT_API bool IsUserShadowStackEnabled() {
auto pGetProcessMitigationPolicy = FetchGetProcessMitigationPolicyFunc();
if (!pGetProcessMitigationPolicy) {
return false;
}
PROCESS_MITIGATION_USER_SHADOW_STACK_POLICY polInfo;
if (!pGetProcessMitigationPolicy(::GetCurrentProcess(),
ProcessUserShadowStackPolicy, &polInfo,
sizeof(polInfo))) {
return false;
}
return polInfo.EnableUserShadowStack;
}
MFBT_API bool IsPreferLoadFromSystem32Available() {
return mozilla::IsWin10AnniversaryUpdateOrLater();
}
MFBT_API bool IsPreferLoadFromSystem32Enabled() {
auto pGetProcessMitigationPolicy = FetchGetProcessMitigationPolicyFunc();
if (!pGetProcessMitigationPolicy) {
return false;
}
PROCESS_MITIGATION_IMAGE_LOAD_POLICY imgLoadPol{};
if (!pGetProcessMitigationPolicy(::GetCurrentProcess(),
ProcessImageLoadPolicy, &imgLoadPol,
sizeof(imgLoadPol))) {
return false;
}
return imgLoadPol.PreferSystem32Images;
}
MFBT_API bool EnablePreferLoadFromSystem32() {
auto pGetProcessMitigationPolicy = FetchGetProcessMitigationPolicyFunc();
if (!pGetProcessMitigationPolicy) {
return false;
}
static const mozilla::StaticDynamicallyLinkedFunctionPtr<
decltype(&::SetProcessMitigationPolicy)>
pSetProcessMitigationPolicy(L"kernel32.dll",
"SetProcessMitigationPolicy");
if (!pSetProcessMitigationPolicy) {
return false;
}
PROCESS_MITIGATION_IMAGE_LOAD_POLICY imgLoadPol{};
if (!pGetProcessMitigationPolicy(::GetCurrentProcess(),
ProcessImageLoadPolicy, &imgLoadPol,
sizeof(imgLoadPol))) {
return false;
}
if (imgLoadPol.PreferSystem32Images) {
return true;
}
imgLoadPol.PreferSystem32Images = 1;
return pSetProcessMitigationPolicy(ProcessImageLoadPolicy, &imgLoadPol,
sizeof(imgLoadPol));
}
} // namespace mozilla
|