Index: sandbox/win/src/process_mitigations_test.cc |
diff --git a/sandbox/win/src/process_mitigations_test.cc b/sandbox/win/src/process_mitigations_test.cc |
index 783cc68e869aee7fc8b7ae4864fbffc0cbb27e7a..9ffdf2672fe185bc360d5c1cef4a7c34b700768f 100644 |
--- a/sandbox/win/src/process_mitigations_test.cc |
+++ b/sandbox/win/src/process_mitigations_test.cc |
@@ -2,6 +2,9 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include <map> |
+#include <string> |
+ |
#include "base/files/file_util.h" |
#include "base/files/scoped_temp_dir.h" |
#include "base/memory/scoped_ptr.h" |
@@ -200,6 +203,38 @@ void TestWin10ImageLoadLowLabel(bool is_success_test) { |
runner.RunTest(test.c_str())); |
} |
+BOOL CALLBACK MonitorEnumCallback(HMONITOR monitor, |
+ HDC hdc_monitor, |
+ LPRECT rect_monitor, |
+ LPARAM data) { |
+ std::map<HMONITOR, base::string16>& monitors = |
+ *reinterpret_cast<std::map<HMONITOR, base::string16>*>(data); |
+ MONITORINFOEXW monitor_info = {}; |
+ monitor_info.cbSize = sizeof(monitor_info); |
+ |
+ if (!GetMonitorInfoW(monitor, reinterpret_cast<MONITORINFO*>(&monitor_info))) |
+ return FALSE; |
+ monitors[monitor] = monitor_info.szDevice; |
+ return TRUE; |
+} |
+ |
+std::map<HMONITOR, std::wstring> EnumerateMonitors() { |
+ std::map<HMONITOR, std::wstring> result; |
+ ::EnumDisplayMonitors(nullptr, nullptr, MonitorEnumCallback, |
+ reinterpret_cast<LPARAM>(&result)); |
+ return result; |
+} |
+ |
+std::wstring MonitorListToString( |
+ const std::map<HMONITOR, std::wstring>& monitors) { |
+ std::wstring monitors_string; |
+ for (const auto& monitor : monitors) { |
+ base::StringAppendF(&monitors_string, L" %p %s", monitor.first, |
+ monitor.second.c_str()); |
+ } |
+ return monitors_string; |
+} |
+ |
} // namespace |
namespace sandbox { |
@@ -380,6 +415,32 @@ SBOX_TESTS_COMMAND int CheckWin8Lockdown(int argc, wchar_t **argv) { |
return SBOX_TEST_SUCCEEDED; |
} |
+SBOX_TESTS_COMMAND int CheckOPMGetDisplayMonitors(int argc, wchar_t** argv) { |
+ if (argc == 0 || (argc & 1) != 0) |
+ return SBOX_TEST_FIRST_ERROR; |
+ |
+ std::map<HMONITOR, base::string16> monitors = EnumerateMonitors(); |
+ std::map<HMONITOR, base::string16> monitors_to_test; |
+ |
+ for (int index = 0; index < argc; index += 2) { |
+ HMONITOR monitor = |
+ reinterpret_cast<HMONITOR>(wcstoull(argv[index], nullptr, 16)); |
+ monitors_to_test[monitor] = argv[index + 1]; |
+ } |
+ |
+ if (monitors.size() != monitors_to_test.size()) |
+ return SBOX_TEST_SECOND_ERROR; |
+ |
+ for (auto it = monitors.begin(); it != monitors.end(); ++it) { |
+ auto result = monitors_to_test.find(it->first); |
+ if (result == monitors_to_test.end()) |
+ return SBOX_TEST_THIRD_ERROR; |
+ if (result->second != it->second) |
+ return SBOX_TEST_FOURTH_ERROR; |
+ } |
+ return SBOX_TEST_SUCCEEDED; |
+} |
+ |
// This test validates that setting the MITIGATION_WIN32K_DISABLE mitigation on |
// the target process causes the launch to fail in process initialization. |
// The test process itself links against user32/gdi32. |
@@ -412,6 +473,36 @@ TEST(ProcessMitigationsTest, CheckWin8Win32KLockDownSuccess) { |
sandbox::TargetPolicy::FAKE_USER_GDI_INIT, NULL), |
sandbox::SBOX_ALL_OK); |
EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"CheckWin8Lockdown")); |
+ |
+ // Also check that we can't access redirected APIs. |
+ std::map<HMONITOR, std::wstring> monitors = EnumerateMonitors(); |
+ std::wstring test_command = |
+ L"CheckOPMGetDisplayMonitors" + MonitorListToString(monitors); |
+ EXPECT_NE(SBOX_TEST_SUCCEEDED, runner.RunTest(test_command.c_str())); |
+} |
+ |
+// This test validates the even though we're running under win32k lockdown |
+// we can use the IPC redirection to enumerate the list of monitors. |
+TEST(ProcessMitigationsTest, CheckWin8OpmRedirectionSuccess) { |
+ if (base::win::GetVersion() < base::win::VERSION_WIN8) |
+ return; |
+ |
+ TestRunner runner; |
+ sandbox::TargetPolicy* policy = runner.GetPolicy(); |
+ |
+ EXPECT_EQ(policy->SetProcessMitigations(MITIGATION_WIN32K_DISABLE), |
+ SBOX_ALL_OK); |
+ EXPECT_EQ(policy->AddRule(sandbox::TargetPolicy::SUBSYS_WIN32K_LOCKDOWN, |
+ sandbox::TargetPolicy::IMPLEMENT_OPM_APIS, NULL), |
+ sandbox::SBOX_ALL_OK); |
+ policy->SetEnableOPMRedirection(); |
+ EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"CheckWin8Lockdown")); |
+ |
+ std::map<HMONITOR, std::wstring> monitors = EnumerateMonitors(); |
+ std::wstring test_command = |
+ L"CheckOPMGetDisplayMonitors" + MonitorListToString(monitors); |
+ printf("%ls\n", test_command.c_str()); |
+ EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(test_command.c_str())); |
} |
//------------------------------------------------------------------------------ |