|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
|
2 // Use of this source code is governed by a BSD-style license that can be |
|
3 // found in the LICENSE file. |
|
4 |
|
5 #include <windows.h> |
|
6 |
|
7 #define _ATL_NO_EXCEPTIONS |
|
8 #include <atlbase.h> |
|
9 #include <atlsecurity.h> |
|
10 |
|
11 #include "base/strings/string16.h" |
|
12 #include "base/win/scoped_handle.h" |
|
13 #include "base/win/windows_version.h" |
|
14 #include "sandbox/win/src/sync_policy_test.h" |
|
15 #include "testing/gtest/include/gtest/gtest.h" |
|
16 |
|
17 namespace { |
|
18 |
|
19 const wchar_t kAppContainerName[] = L"sbox_test"; |
|
20 const wchar_t kAppContainerSid[] = |
|
21 L"S-1-15-2-3251537155-1984446955-2931258699-841473695-1938553385-" |
|
22 L"924012148-2839372144"; |
|
23 |
|
24 const ULONG kSharing = FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE; |
|
25 |
|
26 HANDLE CreateTaggedEvent(const string16& name, const string16& sid) { |
|
27 base::win::ScopedHandle event(CreateEvent(NULL, FALSE, FALSE, name.c_str())); |
|
28 if (!event.IsValid()) |
|
29 return NULL; |
|
30 |
|
31 wchar_t file_name[MAX_PATH] = {}; |
|
32 wchar_t temp_directory[MAX_PATH] = {}; |
|
33 GetTempPath(MAX_PATH, temp_directory); |
|
34 GetTempFileName(temp_directory, L"test", 0, file_name); |
|
35 |
|
36 base::win::ScopedHandle file; |
|
37 file.Set(CreateFile(file_name, GENERIC_READ | STANDARD_RIGHTS_READ, kSharing, |
|
38 NULL, OPEN_EXISTING, 0, NULL)); |
|
39 DeleteFile(file_name); |
|
40 if (!file.IsValid()) |
|
41 return NULL; |
|
42 |
|
43 CSecurityDesc sd; |
|
44 if (!AtlGetSecurityDescriptor(file.Get(), SE_FILE_OBJECT, &sd, |
|
45 OWNER_SECURITY_INFORMATION | |
|
46 GROUP_SECURITY_INFORMATION | |
|
47 DACL_SECURITY_INFORMATION)) { |
|
48 return NULL; |
|
49 } |
|
50 |
|
51 PSID local_sid; |
|
52 if (!ConvertStringSidToSid(sid.c_str(), &local_sid)) |
|
53 return NULL; |
|
54 |
|
55 CDacl new_dacl; |
|
56 sd.GetDacl(&new_dacl); |
|
57 CSid csid(reinterpret_cast<SID*>(local_sid)); |
|
58 new_dacl.AddAllowedAce(csid, EVENT_ALL_ACCESS); |
|
59 if (!AtlSetDacl(event.Get(), SE_KERNEL_OBJECT, new_dacl)) |
|
60 event.Close(); |
|
61 |
|
62 LocalFree(local_sid); |
|
63 return event.IsValid() ? event.Take() : NULL; |
|
64 } |
|
65 |
|
66 } // namespace |
|
67 |
|
68 namespace sandbox { |
|
69 |
|
70 TEST(AppContainerTest, AllowOpenEvent) { |
|
71 if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) |
|
72 return; |
|
73 |
|
74 TestRunner runner(JOB_UNPROTECTED, USER_UNPROTECTED, USER_UNPROTECTED); |
|
75 |
|
76 const wchar_t capability[] = L"S-1-15-3-12345678-87654321"; |
|
77 base::win::ScopedHandle handle(CreateTaggedEvent(L"test", capability)); |
|
78 ASSERT_TRUE(handle.IsValid()); |
|
79 |
|
80 EXPECT_EQ(SBOX_ALL_OK, |
|
81 runner.broker()->InstallAppContainer(kAppContainerSid, |
|
82 kAppContainerName)); |
|
83 EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->SetCapability(capability)); |
|
84 EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->SetAppContainer(kAppContainerSid)); |
|
85 |
|
86 EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"Event_Open f test")); |
|
87 |
|
88 runner.SetTestState(BEFORE_REVERT); |
|
89 EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"Event_Open f test")); |
|
90 EXPECT_EQ(SBOX_ALL_OK, |
|
91 runner.broker()->UninstallAppContainer(kAppContainerSid)); |
|
92 } |
|
93 |
|
94 TEST(AppContainerTest, DenyOpenEvent) { |
|
95 if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) |
|
96 return; |
|
97 |
|
98 TestRunner runner(JOB_UNPROTECTED, USER_UNPROTECTED, USER_UNPROTECTED); |
|
99 |
|
100 const wchar_t capability[] = L"S-1-15-3-12345678-87654321"; |
|
101 base::win::ScopedHandle handle(CreateTaggedEvent(L"test", capability)); |
|
102 ASSERT_TRUE(handle.IsValid()); |
|
103 |
|
104 EXPECT_EQ(SBOX_ALL_OK, |
|
105 runner.broker()->InstallAppContainer(kAppContainerSid, |
|
106 kAppContainerName)); |
|
107 EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->SetAppContainer(kAppContainerSid)); |
|
108 |
|
109 EXPECT_EQ(SBOX_TEST_DENIED, runner.RunTest(L"Event_Open f test")); |
|
110 |
|
111 runner.SetTestState(BEFORE_REVERT); |
|
112 EXPECT_EQ(SBOX_TEST_DENIED, runner.RunTest(L"Event_Open f test")); |
|
113 EXPECT_EQ(SBOX_ALL_OK, |
|
114 runner.broker()->UninstallAppContainer(kAppContainerSid)); |
|
115 } |
|
116 |
|
117 TEST(AppContainerTest, NoImpersonation) { |
|
118 if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) |
|
119 return; |
|
120 |
|
121 TestRunner runner(JOB_UNPROTECTED, USER_LIMITED, USER_LIMITED); |
|
122 EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->SetAppContainer(kAppContainerSid)); |
|
123 } |
|
124 |
|
125 TEST(AppContainerTest, WantsImpersonation) { |
|
126 if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) |
|
127 return; |
|
128 |
|
129 TestRunner runner(JOB_UNPROTECTED, USER_UNPROTECTED, USER_NON_ADMIN); |
|
130 EXPECT_EQ(SBOX_ERROR_CANNOT_INIT_APPCONTAINER, |
|
131 runner.GetPolicy()->SetAppContainer(kAppContainerSid)); |
|
132 } |
|
133 |
|
134 TEST(AppContainerTest, RequiresImpersonation) { |
|
135 if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) |
|
136 return; |
|
137 |
|
138 TestRunner runner(JOB_UNPROTECTED, USER_RESTRICTED, USER_RESTRICTED); |
|
139 EXPECT_EQ(SBOX_ERROR_CANNOT_INIT_APPCONTAINER, |
|
140 runner.GetPolicy()->SetAppContainer(kAppContainerSid)); |
|
141 } |
|
142 |
|
143 } // namespace sandbox |