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.
7 #define _ATL_NO_EXCEPTIONS
9 #include <atlsecurity.h>
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"
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";
24 const ULONG kSharing
= FILE_SHARE_WRITE
| FILE_SHARE_READ
| FILE_SHARE_DELETE
;
26 HANDLE
CreateTaggedEvent(const string16
& name
, const string16
& sid
) {
27 base::win::ScopedHandle
event(CreateEvent(NULL
, FALSE
, FALSE
, name
.c_str()));
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
);
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
);
44 if (!AtlGetSecurityDescriptor(file
.Get(), SE_FILE_OBJECT
, &sd
,
45 OWNER_SECURITY_INFORMATION
|
46 GROUP_SECURITY_INFORMATION
|
47 DACL_SECURITY_INFORMATION
)) {
52 if (!ConvertStringSidToSid(sid
.c_str(), &local_sid
))
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
))
63 return event
.IsValid() ? event
.Take() : NULL
;
70 TEST(AppContainerTest
, AllowOpenEvent
) {
71 if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8
)
74 TestRunner
runner(JOB_UNPROTECTED
, USER_UNPROTECTED
, USER_UNPROTECTED
);
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());
80 EXPECT_EQ(SBOX_ALL_OK
,
81 runner
.broker()->InstallAppContainer(kAppContainerSid
,
83 EXPECT_EQ(SBOX_ALL_OK
, runner
.GetPolicy()->SetCapability(capability
));
84 EXPECT_EQ(SBOX_ALL_OK
, runner
.GetPolicy()->SetAppContainer(kAppContainerSid
));
86 EXPECT_EQ(SBOX_TEST_SUCCEEDED
, runner
.RunTest(L
"Event_Open f test"));
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
));
94 TEST(AppContainerTest
, DenyOpenEvent
) {
95 if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8
)
98 TestRunner
runner(JOB_UNPROTECTED
, USER_UNPROTECTED
, USER_UNPROTECTED
);
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());
104 EXPECT_EQ(SBOX_ALL_OK
,
105 runner
.broker()->InstallAppContainer(kAppContainerSid
,
107 EXPECT_EQ(SBOX_ALL_OK
, runner
.GetPolicy()->SetAppContainer(kAppContainerSid
));
109 EXPECT_EQ(SBOX_TEST_DENIED
, runner
.RunTest(L
"Event_Open f test"));
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
));
117 TEST(AppContainerTest
, NoImpersonation
) {
118 if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8
)
121 TestRunner
runner(JOB_UNPROTECTED
, USER_LIMITED
, USER_LIMITED
);
122 EXPECT_EQ(SBOX_ALL_OK
, runner
.GetPolicy()->SetAppContainer(kAppContainerSid
));
125 TEST(AppContainerTest
, WantsImpersonation
) {
126 if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8
)
129 TestRunner
runner(JOB_UNPROTECTED
, USER_UNPROTECTED
, USER_NON_ADMIN
);
130 EXPECT_EQ(SBOX_ERROR_CANNOT_INIT_APPCONTAINER
,
131 runner
.GetPolicy()->SetAppContainer(kAppContainerSid
));
134 TEST(AppContainerTest
, RequiresImpersonation
) {
135 if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8
)
138 TestRunner
runner(JOB_UNPROTECTED
, USER_RESTRICTED
, USER_RESTRICTED
);
139 EXPECT_EQ(SBOX_ERROR_CANNOT_INIT_APPCONTAINER
,
140 runner
.GetPolicy()->SetAppContainer(kAppContainerSid
));
143 } // namespace sandbox