OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // This file contains unit tests for the RestrictedToken. | 5 // This file contains unit tests for the RestrictedToken. |
6 | 6 |
7 #define _ATL_NO_EXCEPTIONS | 7 #define _ATL_NO_EXCEPTIONS |
8 #include <atlbase.h> | 8 #include <atlbase.h> |
9 #include <atlsecurity.h> | 9 #include <atlsecurity.h> |
10 #include <vector> | 10 #include <vector> |
| 11 |
| 12 #include "base/win/scoped_handle.h" |
11 #include "sandbox/win/src/restricted_token.h" | 13 #include "sandbox/win/src/restricted_token.h" |
12 #include "sandbox/win/src/sid.h" | 14 #include "sandbox/win/src/sid.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
14 | 16 |
15 namespace sandbox { | 17 namespace sandbox { |
16 | 18 |
17 // Tests the initializatioin with an invalid token handle. | 19 // Tests the initializatioin with an invalid token handle. |
18 TEST(RestrictedTokenTest, InvalidHandle) { | 20 TEST(RestrictedTokenTest, InvalidHandle) { |
19 RestrictedToken token; | 21 RestrictedToken token; |
20 ASSERT_EQ(ERROR_INVALID_HANDLE, token.Init(reinterpret_cast<HANDLE>(0x5555))); | 22 ASSERT_EQ(ERROR_INVALID_HANDLE, token.Init(reinterpret_cast<HANDLE>(0x5555))); |
(...skipping 10 matching lines...) Expand all Loading... |
31 | 33 |
32 ATL::CAccessToken access_token; | 34 ATL::CAccessToken access_token; |
33 access_token.Attach(token_handle); | 35 access_token.Attach(token_handle); |
34 | 36 |
35 // Create the token using the current token. | 37 // Create the token using the current token. |
36 RestrictedToken token_default; | 38 RestrictedToken token_default; |
37 ASSERT_EQ(ERROR_SUCCESS, token_default.Init(NULL)); | 39 ASSERT_EQ(ERROR_SUCCESS, token_default.Init(NULL)); |
38 | 40 |
39 // Get the handle to the restricted token. | 41 // Get the handle to the restricted token. |
40 | 42 |
41 HANDLE restricted_token_handle = NULL; | 43 base::win::ScopedHandle restricted_token_handle; |
42 ASSERT_EQ(ERROR_SUCCESS, | 44 ASSERT_EQ(ERROR_SUCCESS, |
43 token_default.GetRestrictedTokenHandle(&restricted_token_handle)); | 45 token_default.GetRestrictedToken(&restricted_token_handle)); |
44 | 46 |
45 ATL::CAccessToken restricted_token; | 47 ATL::CAccessToken restricted_token; |
46 restricted_token.Attach(restricted_token_handle); | 48 restricted_token.Attach(restricted_token_handle.Take()); |
47 | 49 |
48 ATL::CSid sid_user_restricted; | 50 ATL::CSid sid_user_restricted; |
49 ATL::CSid sid_user_default; | 51 ATL::CSid sid_user_default; |
50 ATL::CSid sid_owner_restricted; | 52 ATL::CSid sid_owner_restricted; |
51 ATL::CSid sid_owner_default; | 53 ATL::CSid sid_owner_default; |
52 ASSERT_TRUE(restricted_token.GetUser(&sid_user_restricted)); | 54 ASSERT_TRUE(restricted_token.GetUser(&sid_user_restricted)); |
53 ASSERT_TRUE(access_token.GetUser(&sid_user_default)); | 55 ASSERT_TRUE(access_token.GetUser(&sid_user_default)); |
54 ASSERT_TRUE(restricted_token.GetOwner(&sid_owner_restricted)); | 56 ASSERT_TRUE(restricted_token.GetOwner(&sid_owner_restricted)); |
55 ASSERT_TRUE(access_token.GetOwner(&sid_owner_default)); | 57 ASSERT_TRUE(access_token.GetOwner(&sid_owner_default)); |
56 | 58 |
(...skipping 16 matching lines...) Expand all Loading... |
73 | 75 |
74 // Change the primary group. | 76 // Change the primary group. |
75 access_token.SetPrimaryGroup(ATL::Sids::World()); | 77 access_token.SetPrimaryGroup(ATL::Sids::World()); |
76 | 78 |
77 // Create the token using the current token. | 79 // Create the token using the current token. |
78 RestrictedToken token; | 80 RestrictedToken token; |
79 ASSERT_EQ(ERROR_SUCCESS, token.Init(access_token.GetHandle())); | 81 ASSERT_EQ(ERROR_SUCCESS, token.Init(access_token.GetHandle())); |
80 | 82 |
81 // Get the handle to the restricted token. | 83 // Get the handle to the restricted token. |
82 | 84 |
83 HANDLE restricted_token_handle = NULL; | 85 base::win::ScopedHandle restricted_token_handle; |
84 ASSERT_EQ(ERROR_SUCCESS, | 86 ASSERT_EQ(ERROR_SUCCESS, |
85 token.GetRestrictedTokenHandle(&restricted_token_handle)); | 87 token.GetRestrictedToken(&restricted_token_handle)); |
86 | 88 |
87 ATL::CAccessToken restricted_token; | 89 ATL::CAccessToken restricted_token; |
88 restricted_token.Attach(restricted_token_handle); | 90 restricted_token.Attach(restricted_token_handle.Take()); |
89 | 91 |
90 ATL::CSid sid_restricted; | 92 ATL::CSid sid_restricted; |
91 ATL::CSid sid_default; | 93 ATL::CSid sid_default; |
92 ASSERT_TRUE(restricted_token.GetPrimaryGroup(&sid_restricted)); | 94 ASSERT_TRUE(restricted_token.GetPrimaryGroup(&sid_restricted)); |
93 ASSERT_TRUE(access_token.GetPrimaryGroup(&sid_default)); | 95 ASSERT_TRUE(access_token.GetPrimaryGroup(&sid_default)); |
94 | 96 |
95 // Check if both token have the same owner. | 97 // Check if both token have the same owner. |
96 ASSERT_EQ(sid_restricted, sid_default); | 98 ASSERT_EQ(sid_restricted, sid_default); |
97 } | 99 } |
98 | 100 |
99 // Verifies that the token created by the object are valid. | 101 // Verifies that the token created by the object are valid. |
100 TEST(RestrictedTokenTest, ResultToken) { | 102 TEST(RestrictedTokenTest, ResultToken) { |
101 RestrictedToken token; | 103 RestrictedToken token; |
102 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); | 104 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); |
103 | 105 |
104 ASSERT_EQ(ERROR_SUCCESS, | 106 ASSERT_EQ(ERROR_SUCCESS, |
105 token.AddRestrictingSid(ATL::Sids::World().GetPSID())); | 107 token.AddRestrictingSid(ATL::Sids::World().GetPSID())); |
106 | 108 |
107 HANDLE restricted_token; | 109 base::win::ScopedHandle restricted_token; |
108 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&restricted_token)); | 110 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&restricted_token)); |
109 | 111 |
110 ASSERT_TRUE(::IsTokenRestricted(restricted_token)); | 112 ASSERT_TRUE(::IsTokenRestricted(restricted_token.Get())); |
111 | 113 |
112 DWORD length = 0; | 114 DWORD length = 0; |
113 TOKEN_TYPE type; | 115 TOKEN_TYPE type; |
114 ASSERT_TRUE(::GetTokenInformation(restricted_token, | 116 ASSERT_TRUE(::GetTokenInformation(restricted_token.Get(), |
115 ::TokenType, | 117 ::TokenType, |
116 &type, | 118 &type, |
117 sizeof(type), | 119 sizeof(type), |
118 &length)); | 120 &length)); |
119 | 121 |
120 ASSERT_EQ(type, TokenPrimary); | 122 ASSERT_EQ(type, TokenPrimary); |
121 | 123 |
122 HANDLE impersonation_token; | 124 base::win::ScopedHandle impersonation_token; |
123 ASSERT_EQ(ERROR_SUCCESS, | 125 ASSERT_EQ(ERROR_SUCCESS, |
124 token.GetRestrictedTokenHandleForImpersonation(&impersonation_token)); | 126 token.GetRestrictedTokenForImpersonation(&impersonation_token)); |
125 | 127 |
126 ASSERT_TRUE(::IsTokenRestricted(impersonation_token)); | 128 ASSERT_TRUE(::IsTokenRestricted(impersonation_token.Get())); |
127 | 129 |
128 ASSERT_TRUE(::GetTokenInformation(impersonation_token, | 130 ASSERT_TRUE(::GetTokenInformation(impersonation_token.Get(), |
129 ::TokenType, | 131 ::TokenType, |
130 &type, | 132 &type, |
131 sizeof(type), | 133 sizeof(type), |
132 &length)); | 134 &length)); |
133 | 135 |
134 ASSERT_EQ(type, TokenImpersonation); | 136 ASSERT_EQ(type, TokenImpersonation); |
135 | |
136 ::CloseHandle(impersonation_token); | |
137 ::CloseHandle(restricted_token); | |
138 } | 137 } |
139 | 138 |
140 // Verifies that the token created has "Restricted" in its default dacl. | 139 // Verifies that the token created has "Restricted" in its default dacl. |
141 TEST(RestrictedTokenTest, DefaultDacl) { | 140 TEST(RestrictedTokenTest, DefaultDacl) { |
142 RestrictedToken token; | 141 RestrictedToken token; |
143 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); | 142 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); |
144 | 143 |
145 ASSERT_EQ(ERROR_SUCCESS, | 144 ASSERT_EQ(ERROR_SUCCESS, |
146 token.AddRestrictingSid(ATL::Sids::World().GetPSID())); | 145 token.AddRestrictingSid(ATL::Sids::World().GetPSID())); |
147 | 146 |
148 HANDLE handle; | 147 base::win::ScopedHandle handle; |
149 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&handle)); | 148 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&handle)); |
150 | 149 |
151 ATL::CAccessToken restricted_token; | 150 ATL::CAccessToken restricted_token; |
152 restricted_token.Attach(handle); | 151 restricted_token.Attach(handle.Take()); |
153 | 152 |
154 ATL::CDacl dacl; | 153 ATL::CDacl dacl; |
155 ASSERT_TRUE(restricted_token.GetDefaultDacl(&dacl)); | 154 ASSERT_TRUE(restricted_token.GetDefaultDacl(&dacl)); |
156 | 155 |
157 bool restricted_found = false; | 156 bool restricted_found = false; |
158 | 157 |
159 unsigned int ace_count = dacl.GetAceCount(); | 158 unsigned int ace_count = dacl.GetAceCount(); |
160 for (unsigned int i = 0; i < ace_count ; ++i) { | 159 for (unsigned int i = 0; i < ace_count ; ++i) { |
161 ATL::CSid sid; | 160 ATL::CSid sid; |
162 ACCESS_MASK mask = 0; | 161 ACCESS_MASK mask = 0; |
163 dacl.GetAclEntry(i, &sid, &mask); | 162 dacl.GetAclEntry(i, &sid, &mask); |
164 if (sid == ATL::Sids::RestrictedCode() && mask == GENERIC_ALL) { | 163 if (sid == ATL::Sids::RestrictedCode() && mask == GENERIC_ALL) { |
165 restricted_found = true; | 164 restricted_found = true; |
166 break; | 165 break; |
167 } | 166 } |
168 } | 167 } |
169 | 168 |
170 ASSERT_TRUE(restricted_found); | 169 ASSERT_TRUE(restricted_found); |
171 } | 170 } |
172 | 171 |
173 // Tests the method "AddSidForDenyOnly". | 172 // Tests the method "AddSidForDenyOnly". |
174 TEST(RestrictedTokenTest, DenySid) { | 173 TEST(RestrictedTokenTest, DenySid) { |
175 RestrictedToken token; | 174 RestrictedToken token; |
176 HANDLE token_handle = NULL; | 175 base::win::ScopedHandle token_handle; |
177 | 176 |
178 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); | 177 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); |
179 ASSERT_EQ(ERROR_SUCCESS, token.AddSidForDenyOnly(Sid(WinWorldSid))); | 178 ASSERT_EQ(ERROR_SUCCESS, token.AddSidForDenyOnly(Sid(WinWorldSid))); |
180 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); | 179 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); |
181 | 180 |
182 ATL::CAccessToken restricted_token; | 181 ATL::CAccessToken restricted_token; |
183 restricted_token.Attach(token_handle); | 182 restricted_token.Attach(token_handle.Take()); |
184 | 183 |
185 ATL::CTokenGroups groups; | 184 ATL::CTokenGroups groups; |
186 ASSERT_TRUE(restricted_token.GetGroups(&groups)); | 185 ASSERT_TRUE(restricted_token.GetGroups(&groups)); |
187 | 186 |
188 ATL::CSid::CSidArray sids; | 187 ATL::CSid::CSidArray sids; |
189 ATL::CAtlArray<DWORD> attributes; | 188 ATL::CAtlArray<DWORD> attributes; |
190 groups.GetSidsAndAttributes(&sids, &attributes); | 189 groups.GetSidsAndAttributes(&sids, &attributes); |
191 | 190 |
192 for (unsigned int i = 0; i < sids.GetCount(); i++) { | 191 for (unsigned int i = 0; i < sids.GetCount(); i++) { |
193 if (ATL::Sids::World() == sids[i]) { | 192 if (ATL::Sids::World() == sids[i]) { |
194 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, | 193 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, |
195 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); | 194 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); |
196 } | 195 } |
197 } | 196 } |
198 } | 197 } |
199 | 198 |
200 // Tests the method "AddAllSidsForDenyOnly". | 199 // Tests the method "AddAllSidsForDenyOnly". |
201 TEST(RestrictedTokenTest, DenySids) { | 200 TEST(RestrictedTokenTest, DenySids) { |
202 RestrictedToken token; | 201 RestrictedToken token; |
203 HANDLE token_handle = NULL; | 202 base::win::ScopedHandle token_handle; |
204 | 203 |
205 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); | 204 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); |
206 ASSERT_EQ(ERROR_SUCCESS, token.AddAllSidsForDenyOnly(NULL)); | 205 ASSERT_EQ(ERROR_SUCCESS, token.AddAllSidsForDenyOnly(NULL)); |
207 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); | 206 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); |
208 | 207 |
209 ATL::CAccessToken restricted_token; | 208 ATL::CAccessToken restricted_token; |
210 restricted_token.Attach(token_handle); | 209 restricted_token.Attach(token_handle.Take()); |
211 | 210 |
212 ATL::CTokenGroups groups; | 211 ATL::CTokenGroups groups; |
213 ASSERT_TRUE(restricted_token.GetGroups(&groups)); | 212 ASSERT_TRUE(restricted_token.GetGroups(&groups)); |
214 | 213 |
215 ATL::CSid::CSidArray sids; | 214 ATL::CSid::CSidArray sids; |
216 ATL::CAtlArray<DWORD> attributes; | 215 ATL::CAtlArray<DWORD> attributes; |
217 groups.GetSidsAndAttributes(&sids, &attributes); | 216 groups.GetSidsAndAttributes(&sids, &attributes); |
218 | 217 |
219 // Verify that all sids are really gone. | 218 // Verify that all sids are really gone. |
220 for (unsigned int i = 0; i < sids.GetCount(); i++) { | 219 for (unsigned int i = 0; i < sids.GetCount(); i++) { |
221 if ((attributes[i] & SE_GROUP_LOGON_ID) == 0 && | 220 if ((attributes[i] & SE_GROUP_LOGON_ID) == 0 && |
222 (attributes[i] & SE_GROUP_INTEGRITY) == 0) { | 221 (attributes[i] & SE_GROUP_INTEGRITY) == 0) { |
223 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, | 222 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, |
224 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); | 223 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); |
225 } | 224 } |
226 } | 225 } |
227 } | 226 } |
228 | 227 |
229 // Tests the method "AddAllSidsForDenyOnly" using an exception list. | 228 // Tests the method "AddAllSidsForDenyOnly" using an exception list. |
230 TEST(RestrictedTokenTest, DenySidsException) { | 229 TEST(RestrictedTokenTest, DenySidsException) { |
231 RestrictedToken token; | 230 RestrictedToken token; |
232 HANDLE token_handle = NULL; | 231 base::win::ScopedHandle token_handle; |
233 | 232 |
234 std::vector<Sid> sids_exception; | 233 std::vector<Sid> sids_exception; |
235 sids_exception.push_back(Sid(WinWorldSid)); | 234 sids_exception.push_back(Sid(WinWorldSid)); |
236 | 235 |
237 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); | 236 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); |
238 ASSERT_EQ(ERROR_SUCCESS, token.AddAllSidsForDenyOnly(&sids_exception)); | 237 ASSERT_EQ(ERROR_SUCCESS, token.AddAllSidsForDenyOnly(&sids_exception)); |
239 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); | 238 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); |
240 | 239 |
241 ATL::CAccessToken restricted_token; | 240 ATL::CAccessToken restricted_token; |
242 restricted_token.Attach(token_handle); | 241 restricted_token.Attach(token_handle.Take()); |
243 | 242 |
244 ATL::CTokenGroups groups; | 243 ATL::CTokenGroups groups; |
245 ASSERT_TRUE(restricted_token.GetGroups(&groups)); | 244 ASSERT_TRUE(restricted_token.GetGroups(&groups)); |
246 | 245 |
247 ATL::CSid::CSidArray sids; | 246 ATL::CSid::CSidArray sids; |
248 ATL::CAtlArray<DWORD> attributes; | 247 ATL::CAtlArray<DWORD> attributes; |
249 groups.GetSidsAndAttributes(&sids, &attributes); | 248 groups.GetSidsAndAttributes(&sids, &attributes); |
250 | 249 |
251 // Verify that all sids are really gone. | 250 // Verify that all sids are really gone. |
252 for (unsigned int i = 0; i < sids.GetCount(); i++) { | 251 for (unsigned int i = 0; i < sids.GetCount(); i++) { |
253 if ((attributes[i] & SE_GROUP_LOGON_ID) == 0 && | 252 if ((attributes[i] & SE_GROUP_LOGON_ID) == 0 && |
254 (attributes[i] & SE_GROUP_INTEGRITY) == 0) { | 253 (attributes[i] & SE_GROUP_INTEGRITY) == 0) { |
255 if (ATL::Sids::World() == sids[i]) { | 254 if (ATL::Sids::World() == sids[i]) { |
256 ASSERT_EQ(NULL, attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); | 255 ASSERT_EQ(NULL, attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); |
257 } else { | 256 } else { |
258 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, | 257 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, |
259 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); | 258 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); |
260 } | 259 } |
261 } | 260 } |
262 } | 261 } |
263 } | 262 } |
264 | 263 |
265 // Tests test method AddOwnerSidForDenyOnly. | 264 // Tests test method AddOwnerSidForDenyOnly. |
266 TEST(RestrictedTokenTest, DenyOwnerSid) { | 265 TEST(RestrictedTokenTest, DenyOwnerSid) { |
267 RestrictedToken token; | 266 RestrictedToken token; |
268 HANDLE token_handle = NULL; | 267 base::win::ScopedHandle token_handle; |
269 | 268 |
270 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); | 269 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); |
271 ASSERT_EQ(ERROR_SUCCESS, token.AddUserSidForDenyOnly()); | 270 ASSERT_EQ(ERROR_SUCCESS, token.AddUserSidForDenyOnly()); |
272 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); | 271 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); |
273 | 272 |
274 ATL::CAccessToken restricted_token; | 273 ATL::CAccessToken restricted_token; |
275 restricted_token.Attach(token_handle); | 274 restricted_token.Attach(token_handle.Take()); |
276 | 275 |
277 ATL::CTokenGroups groups; | 276 ATL::CTokenGroups groups; |
278 ASSERT_TRUE(restricted_token.GetGroups(&groups)); | 277 ASSERT_TRUE(restricted_token.GetGroups(&groups)); |
279 | 278 |
280 ATL::CSid::CSidArray sids; | 279 ATL::CSid::CSidArray sids; |
281 ATL::CAtlArray<DWORD> attributes; | 280 ATL::CAtlArray<DWORD> attributes; |
282 groups.GetSidsAndAttributes(&sids, &attributes); | 281 groups.GetSidsAndAttributes(&sids, &attributes); |
283 | 282 |
284 ATL::CSid user_sid; | 283 ATL::CSid user_sid; |
285 ASSERT_TRUE(restricted_token.GetUser(&user_sid)); | 284 ASSERT_TRUE(restricted_token.GetUser(&user_sid)); |
286 | 285 |
287 for (unsigned int i = 0; i < sids.GetCount(); ++i) { | 286 for (unsigned int i = 0; i < sids.GetCount(); ++i) { |
288 if (user_sid == sids[i]) { | 287 if (user_sid == sids[i]) { |
289 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, | 288 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, |
290 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); | 289 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); |
291 } | 290 } |
292 } | 291 } |
293 } | 292 } |
294 | 293 |
295 // Tests test method AddOwnerSidForDenyOnly with a custom effective token. | 294 // Tests test method AddOwnerSidForDenyOnly with a custom effective token. |
296 TEST(RestrictedTokenTest, DenyOwnerSidCustom) { | 295 TEST(RestrictedTokenTest, DenyOwnerSidCustom) { |
297 // Get the current process token. | 296 // Get the current process token. |
298 HANDLE token_handle = INVALID_HANDLE_VALUE; | 297 HANDLE access_handle = INVALID_HANDLE_VALUE; |
299 ASSERT_TRUE(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ALL_ACCESS, | 298 ASSERT_TRUE(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ALL_ACCESS, |
300 &token_handle)); | 299 &access_handle)); |
301 | 300 |
302 ASSERT_NE(INVALID_HANDLE_VALUE, token_handle); | 301 ASSERT_NE(INVALID_HANDLE_VALUE, access_handle); |
303 | 302 |
304 ATL::CAccessToken access_token; | 303 ATL::CAccessToken access_token; |
305 access_token.Attach(token_handle); | 304 access_token.Attach(access_handle); |
306 | 305 |
307 RestrictedToken token; | 306 RestrictedToken token; |
| 307 base::win::ScopedHandle token_handle; |
308 ASSERT_EQ(ERROR_SUCCESS, token.Init(access_token.GetHandle())); | 308 ASSERT_EQ(ERROR_SUCCESS, token.Init(access_token.GetHandle())); |
309 ASSERT_EQ(ERROR_SUCCESS, token.AddUserSidForDenyOnly()); | 309 ASSERT_EQ(ERROR_SUCCESS, token.AddUserSidForDenyOnly()); |
310 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); | 310 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); |
311 | 311 |
312 ATL::CAccessToken restricted_token; | 312 ATL::CAccessToken restricted_token; |
313 restricted_token.Attach(token_handle); | 313 restricted_token.Attach(token_handle.Take()); |
314 | 314 |
315 ATL::CTokenGroups groups; | 315 ATL::CTokenGroups groups; |
316 ASSERT_TRUE(restricted_token.GetGroups(&groups)); | 316 ASSERT_TRUE(restricted_token.GetGroups(&groups)); |
317 | 317 |
318 ATL::CSid::CSidArray sids; | 318 ATL::CSid::CSidArray sids; |
319 ATL::CAtlArray<DWORD> attributes; | 319 ATL::CAtlArray<DWORD> attributes; |
320 groups.GetSidsAndAttributes(&sids, &attributes); | 320 groups.GetSidsAndAttributes(&sids, &attributes); |
321 | 321 |
322 ATL::CSid user_sid; | 322 ATL::CSid user_sid; |
323 ASSERT_TRUE(restricted_token.GetUser(&user_sid)); | 323 ASSERT_TRUE(restricted_token.GetUser(&user_sid)); |
324 | 324 |
325 for (unsigned int i = 0; i < sids.GetCount(); ++i) { | 325 for (unsigned int i = 0; i < sids.GetCount(); ++i) { |
326 if (user_sid == sids[i]) { | 326 if (user_sid == sids[i]) { |
327 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, | 327 ASSERT_EQ(SE_GROUP_USE_FOR_DENY_ONLY, |
328 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); | 328 attributes[i] & SE_GROUP_USE_FOR_DENY_ONLY); |
329 } | 329 } |
330 } | 330 } |
331 } | 331 } |
332 | 332 |
333 // Tests the method DeleteAllPrivileges. | 333 // Tests the method DeleteAllPrivileges. |
334 TEST(RestrictedTokenTest, DeleteAllPrivileges) { | 334 TEST(RestrictedTokenTest, DeleteAllPrivileges) { |
335 RestrictedToken token; | 335 RestrictedToken token; |
336 HANDLE token_handle = NULL; | 336 base::win::ScopedHandle token_handle; |
337 | 337 |
338 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); | 338 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); |
339 ASSERT_EQ(ERROR_SUCCESS, token.DeleteAllPrivileges(NULL)); | 339 ASSERT_EQ(ERROR_SUCCESS, token.DeleteAllPrivileges(NULL)); |
340 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); | 340 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); |
341 | 341 |
342 ATL::CAccessToken restricted_token; | 342 ATL::CAccessToken restricted_token; |
343 restricted_token.Attach(token_handle); | 343 restricted_token.Attach(token_handle.Take()); |
344 | 344 |
345 ATL::CTokenPrivileges privileges; | 345 ATL::CTokenPrivileges privileges; |
346 ASSERT_TRUE(restricted_token.GetPrivileges(&privileges)); | 346 ASSERT_TRUE(restricted_token.GetPrivileges(&privileges)); |
347 | 347 |
348 ASSERT_EQ(0, privileges.GetCount()); | 348 ASSERT_EQ(0, privileges.GetCount()); |
349 } | 349 } |
350 | 350 |
351 // Tests the method DeleteAllPrivileges with an exception list. | 351 // Tests the method DeleteAllPrivileges with an exception list. |
352 TEST(RestrictedTokenTest, DeleteAllPrivilegesException) { | 352 TEST(RestrictedTokenTest, DeleteAllPrivilegesException) { |
353 RestrictedToken token; | 353 RestrictedToken token; |
354 HANDLE token_handle = NULL; | 354 base::win::ScopedHandle token_handle; |
355 | 355 |
356 std::vector<base::string16> exceptions; | 356 std::vector<base::string16> exceptions; |
357 exceptions.push_back(SE_CHANGE_NOTIFY_NAME); | 357 exceptions.push_back(SE_CHANGE_NOTIFY_NAME); |
358 | 358 |
359 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); | 359 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); |
360 ASSERT_EQ(ERROR_SUCCESS, token.DeleteAllPrivileges(&exceptions)); | 360 ASSERT_EQ(ERROR_SUCCESS, token.DeleteAllPrivileges(&exceptions)); |
361 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); | 361 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); |
362 | 362 |
363 ATL::CAccessToken restricted_token; | 363 ATL::CAccessToken restricted_token; |
364 restricted_token.Attach(token_handle); | 364 restricted_token.Attach(token_handle.Take()); |
365 | 365 |
366 ATL::CTokenPrivileges privileges; | 366 ATL::CTokenPrivileges privileges; |
367 ASSERT_TRUE(restricted_token.GetPrivileges(&privileges)); | 367 ASSERT_TRUE(restricted_token.GetPrivileges(&privileges)); |
368 | 368 |
369 ATL::CTokenPrivileges::CNames privilege_names; | 369 ATL::CTokenPrivileges::CNames privilege_names; |
370 ATL::CTokenPrivileges::CAttributes privilege_name_attributes; | 370 ATL::CTokenPrivileges::CAttributes privilege_name_attributes; |
371 privileges.GetNamesAndAttributes(&privilege_names, | 371 privileges.GetNamesAndAttributes(&privilege_names, |
372 &privilege_name_attributes); | 372 &privilege_name_attributes); |
373 | 373 |
374 ASSERT_EQ(1, privileges.GetCount()); | 374 ASSERT_EQ(1, privileges.GetCount()); |
375 | 375 |
376 for (unsigned int i = 0; i < privileges.GetCount(); ++i) { | 376 for (unsigned int i = 0; i < privileges.GetCount(); ++i) { |
377 ASSERT_EQ(privilege_names[i], SE_CHANGE_NOTIFY_NAME); | 377 ASSERT_EQ(privilege_names[i], SE_CHANGE_NOTIFY_NAME); |
378 } | 378 } |
379 } | 379 } |
380 | 380 |
381 // Tests the method DeletePrivilege. | 381 // Tests the method DeletePrivilege. |
382 TEST(RestrictedTokenTest, DeletePrivilege) { | 382 TEST(RestrictedTokenTest, DeletePrivilege) { |
383 RestrictedToken token; | 383 RestrictedToken token; |
384 HANDLE token_handle = NULL; | 384 base::win::ScopedHandle token_handle; |
385 | 385 |
386 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); | 386 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); |
387 ASSERT_EQ(ERROR_SUCCESS, token.DeletePrivilege(SE_CHANGE_NOTIFY_NAME)); | 387 ASSERT_EQ(ERROR_SUCCESS, token.DeletePrivilege(SE_CHANGE_NOTIFY_NAME)); |
388 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); | 388 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); |
389 | 389 |
390 ATL::CAccessToken restricted_token; | 390 ATL::CAccessToken restricted_token; |
391 restricted_token.Attach(token_handle); | 391 restricted_token.Attach(token_handle.Take()); |
392 | 392 |
393 ATL::CTokenPrivileges privileges; | 393 ATL::CTokenPrivileges privileges; |
394 ASSERT_TRUE(restricted_token.GetPrivileges(&privileges)); | 394 ASSERT_TRUE(restricted_token.GetPrivileges(&privileges)); |
395 | 395 |
396 ATL::CTokenPrivileges::CNames privilege_names; | 396 ATL::CTokenPrivileges::CNames privilege_names; |
397 ATL::CTokenPrivileges::CAttributes privilege_name_attributes; | 397 ATL::CTokenPrivileges::CAttributes privilege_name_attributes; |
398 privileges.GetNamesAndAttributes(&privilege_names, | 398 privileges.GetNamesAndAttributes(&privilege_names, |
399 &privilege_name_attributes); | 399 &privilege_name_attributes); |
400 | 400 |
401 for (unsigned int i = 0; i < privileges.GetCount(); ++i) { | 401 for (unsigned int i = 0; i < privileges.GetCount(); ++i) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 break; | 434 break; |
435 } | 435 } |
436 } | 436 } |
437 | 437 |
438 ASSERT_TRUE(present); | 438 ASSERT_TRUE(present); |
439 } | 439 } |
440 | 440 |
441 // Tests the method AddRestrictingSid. | 441 // Tests the method AddRestrictingSid. |
442 TEST(RestrictedTokenTest, AddRestrictingSid) { | 442 TEST(RestrictedTokenTest, AddRestrictingSid) { |
443 RestrictedToken token; | 443 RestrictedToken token; |
444 HANDLE token_handle = NULL; | 444 base::win::ScopedHandle token_handle; |
445 | 445 |
446 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); | 446 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); |
447 ASSERT_EQ(ERROR_SUCCESS, | 447 ASSERT_EQ(ERROR_SUCCESS, |
448 token.AddRestrictingSid(ATL::Sids::World().GetPSID())); | 448 token.AddRestrictingSid(ATL::Sids::World().GetPSID())); |
449 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); | 449 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); |
450 | 450 |
451 ATL::CAccessToken restricted_token; | 451 ATL::CAccessToken restricted_token; |
452 restricted_token.Attach(token_handle); | 452 restricted_token.Attach(token_handle.Take()); |
453 | 453 |
454 CheckRestrictingSid(restricted_token, ATL::Sids::World(), 1); | 454 CheckRestrictingSid(restricted_token, ATL::Sids::World(), 1); |
455 } | 455 } |
456 | 456 |
457 // Tests the method AddRestrictingSidCurrentUser. | 457 // Tests the method AddRestrictingSidCurrentUser. |
458 TEST(RestrictedTokenTest, AddRestrictingSidCurrentUser) { | 458 TEST(RestrictedTokenTest, AddRestrictingSidCurrentUser) { |
459 RestrictedToken token; | 459 RestrictedToken token; |
460 HANDLE token_handle = NULL; | 460 base::win::ScopedHandle token_handle; |
461 | 461 |
462 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); | 462 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); |
463 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidCurrentUser()); | 463 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidCurrentUser()); |
464 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); | 464 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); |
465 | 465 |
466 ATL::CAccessToken restricted_token; | 466 ATL::CAccessToken restricted_token; |
467 restricted_token.Attach(token_handle); | 467 restricted_token.Attach(token_handle.Take()); |
468 ATL::CSid user; | 468 ATL::CSid user; |
469 restricted_token.GetUser(&user); | 469 restricted_token.GetUser(&user); |
470 | 470 |
471 CheckRestrictingSid(restricted_token, user, 1); | 471 CheckRestrictingSid(restricted_token, user, 1); |
472 } | 472 } |
473 | 473 |
474 // Tests the method AddRestrictingSidCurrentUser with a custom effective token. | 474 // Tests the method AddRestrictingSidCurrentUser with a custom effective token. |
475 TEST(RestrictedTokenTest, AddRestrictingSidCurrentUserCustom) { | 475 TEST(RestrictedTokenTest, AddRestrictingSidCurrentUserCustom) { |
476 // Get the current process token. | 476 // Get the current process token. |
477 HANDLE token_handle = INVALID_HANDLE_VALUE; | 477 HANDLE access_handle = INVALID_HANDLE_VALUE; |
478 ASSERT_TRUE(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ALL_ACCESS, | 478 ASSERT_TRUE(::OpenProcessToken(::GetCurrentProcess(), TOKEN_ALL_ACCESS, |
479 &token_handle)); | 479 &access_handle)); |
480 | 480 |
481 ASSERT_NE(INVALID_HANDLE_VALUE, token_handle); | 481 ASSERT_NE(INVALID_HANDLE_VALUE, access_handle); |
482 | 482 |
483 ATL::CAccessToken access_token; | 483 ATL::CAccessToken access_token; |
484 access_token.Attach(token_handle); | 484 access_token.Attach(access_handle); |
485 | 485 |
486 RestrictedToken token; | 486 RestrictedToken token; |
| 487 base::win::ScopedHandle token_handle; |
487 ASSERT_EQ(ERROR_SUCCESS, token.Init(access_token.GetHandle())); | 488 ASSERT_EQ(ERROR_SUCCESS, token.Init(access_token.GetHandle())); |
488 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidCurrentUser()); | 489 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidCurrentUser()); |
489 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); | 490 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); |
490 | 491 |
491 ATL::CAccessToken restricted_token; | 492 ATL::CAccessToken restricted_token; |
492 restricted_token.Attach(token_handle); | 493 restricted_token.Attach(token_handle.Take()); |
493 ATL::CSid user; | 494 ATL::CSid user; |
494 restricted_token.GetUser(&user); | 495 restricted_token.GetUser(&user); |
495 | 496 |
496 CheckRestrictingSid(restricted_token, user, 1); | 497 CheckRestrictingSid(restricted_token, user, 1); |
497 } | 498 } |
498 | 499 |
499 // Tests the method AddRestrictingSidLogonSession. | 500 // Tests the method AddRestrictingSidLogonSession. |
500 TEST(RestrictedTokenTest, AddRestrictingSidLogonSession) { | 501 TEST(RestrictedTokenTest, AddRestrictingSidLogonSession) { |
501 RestrictedToken token; | 502 RestrictedToken token; |
502 HANDLE token_handle = NULL; | 503 base::win::ScopedHandle token_handle; |
503 | 504 |
504 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); | 505 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); |
505 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidLogonSession()); | 506 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidLogonSession()); |
506 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); | 507 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); |
507 | 508 |
508 ATL::CAccessToken restricted_token; | 509 ATL::CAccessToken restricted_token; |
509 restricted_token.Attach(token_handle); | 510 restricted_token.Attach(token_handle.Take()); |
510 ATL::CSid session; | 511 ATL::CSid session; |
511 restricted_token.GetLogonSid(&session); | 512 restricted_token.GetLogonSid(&session); |
512 | 513 |
513 CheckRestrictingSid(restricted_token, session, 1); | 514 CheckRestrictingSid(restricted_token, session, 1); |
514 } | 515 } |
515 | 516 |
516 // Tests adding a lot of restricting sids. | 517 // Tests adding a lot of restricting sids. |
517 TEST(RestrictedTokenTest, AddMultipleRestrictingSids) { | 518 TEST(RestrictedTokenTest, AddMultipleRestrictingSids) { |
518 RestrictedToken token; | 519 RestrictedToken token; |
519 HANDLE token_handle = NULL; | 520 base::win::ScopedHandle token_handle; |
520 | 521 |
521 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); | 522 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); |
522 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidCurrentUser()); | 523 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidCurrentUser()); |
523 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidLogonSession()); | 524 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidLogonSession()); |
524 ASSERT_EQ(ERROR_SUCCESS, | 525 ASSERT_EQ(ERROR_SUCCESS, |
525 token.AddRestrictingSid(ATL::Sids::World().GetPSID())); | 526 token.AddRestrictingSid(ATL::Sids::World().GetPSID())); |
526 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); | 527 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); |
527 | 528 |
528 ATL::CAccessToken restricted_token; | 529 ATL::CAccessToken restricted_token; |
529 restricted_token.Attach(token_handle); | 530 restricted_token.Attach(token_handle.Take()); |
530 ATL::CSid session; | 531 ATL::CSid session; |
531 restricted_token.GetLogonSid(&session); | 532 restricted_token.GetLogonSid(&session); |
532 | 533 |
533 DWORD length = 8192; | 534 DWORD length = 8192; |
534 BYTE *memory = new BYTE[length]; | 535 BYTE *memory = new BYTE[length]; |
535 TOKEN_GROUPS *groups = reinterpret_cast<TOKEN_GROUPS*>(memory); | 536 TOKEN_GROUPS *groups = reinterpret_cast<TOKEN_GROUPS*>(memory); |
536 ASSERT_TRUE(::GetTokenInformation(restricted_token.GetHandle(), | 537 ASSERT_TRUE(::GetTokenInformation(restricted_token.GetHandle(), |
537 TokenRestrictedSids, | 538 TokenRestrictedSids, |
538 groups, | 539 groups, |
539 length, | 540 length, |
540 &length)); | 541 &length)); |
541 | 542 |
542 ATL::CTokenGroups atl_groups(*groups); | 543 ATL::CTokenGroups atl_groups(*groups); |
543 delete[] memory; | 544 delete[] memory; |
544 | 545 |
545 ASSERT_EQ(3, atl_groups.GetCount()); | 546 ASSERT_EQ(3, atl_groups.GetCount()); |
546 } | 547 } |
547 | 548 |
548 // Tests the method "AddRestrictingSidAllSids". | 549 // Tests the method "AddRestrictingSidAllSids". |
549 TEST(RestrictedTokenTest, AddAllSidToRestrictingSids) { | 550 TEST(RestrictedTokenTest, AddAllSidToRestrictingSids) { |
550 RestrictedToken token; | 551 RestrictedToken token; |
551 HANDLE token_handle = NULL; | 552 base::win::ScopedHandle token_handle; |
552 | 553 |
553 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); | 554 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); |
554 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidAllSids()); | 555 ASSERT_EQ(ERROR_SUCCESS, token.AddRestrictingSidAllSids()); |
555 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedTokenHandle(&token_handle)); | 556 ASSERT_EQ(ERROR_SUCCESS, token.GetRestrictedToken(&token_handle)); |
556 | 557 |
557 ATL::CAccessToken restricted_token; | 558 ATL::CAccessToken restricted_token; |
558 restricted_token.Attach(token_handle); | 559 restricted_token.Attach(token_handle.Take()); |
559 | 560 |
560 ATL::CTokenGroups groups; | 561 ATL::CTokenGroups groups; |
561 ASSERT_TRUE(restricted_token.GetGroups(&groups)); | 562 ASSERT_TRUE(restricted_token.GetGroups(&groups)); |
562 | 563 |
563 ATL::CSid::CSidArray sids; | 564 ATL::CSid::CSidArray sids; |
564 ATL::CAtlArray<DWORD> attributes; | 565 ATL::CAtlArray<DWORD> attributes; |
565 groups.GetSidsAndAttributes(&sids, &attributes); | 566 groups.GetSidsAndAttributes(&sids, &attributes); |
566 | 567 |
567 // Verify that all group sids are in the restricting sid list. | 568 // Verify that all group sids are in the restricting sid list. |
568 for (unsigned int i = 0; i < sids.GetCount(); i++) { | 569 for (unsigned int i = 0; i < sids.GetCount(); i++) { |
(...skipping 10 matching lines...) Expand all Loading... |
579 | 580 |
580 // Checks the error code when the object is initialized twice. | 581 // Checks the error code when the object is initialized twice. |
581 TEST(RestrictedTokenTest, DoubleInit) { | 582 TEST(RestrictedTokenTest, DoubleInit) { |
582 RestrictedToken token; | 583 RestrictedToken token; |
583 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); | 584 ASSERT_EQ(ERROR_SUCCESS, token.Init(NULL)); |
584 | 585 |
585 ASSERT_EQ(ERROR_ALREADY_INITIALIZED, token.Init(NULL)); | 586 ASSERT_EQ(ERROR_ALREADY_INITIALIZED, token.Init(NULL)); |
586 } | 587 } |
587 | 588 |
588 } // namespace sandbox | 589 } // namespace sandbox |
OLD | NEW |