michael@0: // Copyright (c) 2012 The Chromium Authors. All rights reserved. michael@0: // Use of this source code is governed by a BSD-style license that can be michael@0: // found in the LICENSE file. michael@0: michael@0: #include michael@0: michael@0: #define _ATL_NO_EXCEPTIONS michael@0: #include michael@0: #include michael@0: michael@0: #include "base/strings/string16.h" michael@0: #include "base/win/scoped_handle.h" michael@0: #include "base/win/windows_version.h" michael@0: #include "sandbox/win/src/sync_policy_test.h" michael@0: #include "testing/gtest/include/gtest/gtest.h" michael@0: michael@0: namespace { michael@0: michael@0: const wchar_t kAppContainerName[] = L"sbox_test"; michael@0: const wchar_t kAppContainerSid[] = michael@0: L"S-1-15-2-3251537155-1984446955-2931258699-841473695-1938553385-" michael@0: L"924012148-2839372144"; michael@0: michael@0: const ULONG kSharing = FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE; michael@0: michael@0: HANDLE CreateTaggedEvent(const string16& name, const string16& sid) { michael@0: base::win::ScopedHandle event(CreateEvent(NULL, FALSE, FALSE, name.c_str())); michael@0: if (!event.IsValid()) michael@0: return NULL; michael@0: michael@0: wchar_t file_name[MAX_PATH] = {}; michael@0: wchar_t temp_directory[MAX_PATH] = {}; michael@0: GetTempPath(MAX_PATH, temp_directory); michael@0: GetTempFileName(temp_directory, L"test", 0, file_name); michael@0: michael@0: base::win::ScopedHandle file; michael@0: file.Set(CreateFile(file_name, GENERIC_READ | STANDARD_RIGHTS_READ, kSharing, michael@0: NULL, OPEN_EXISTING, 0, NULL)); michael@0: DeleteFile(file_name); michael@0: if (!file.IsValid()) michael@0: return NULL; michael@0: michael@0: CSecurityDesc sd; michael@0: if (!AtlGetSecurityDescriptor(file.Get(), SE_FILE_OBJECT, &sd, michael@0: OWNER_SECURITY_INFORMATION | michael@0: GROUP_SECURITY_INFORMATION | michael@0: DACL_SECURITY_INFORMATION)) { michael@0: return NULL; michael@0: } michael@0: michael@0: PSID local_sid; michael@0: if (!ConvertStringSidToSid(sid.c_str(), &local_sid)) michael@0: return NULL; michael@0: michael@0: CDacl new_dacl; michael@0: sd.GetDacl(&new_dacl); michael@0: CSid csid(reinterpret_cast(local_sid)); michael@0: new_dacl.AddAllowedAce(csid, EVENT_ALL_ACCESS); michael@0: if (!AtlSetDacl(event.Get(), SE_KERNEL_OBJECT, new_dacl)) michael@0: event.Close(); michael@0: michael@0: LocalFree(local_sid); michael@0: return event.IsValid() ? event.Take() : NULL; michael@0: } michael@0: michael@0: } // namespace michael@0: michael@0: namespace sandbox { michael@0: michael@0: TEST(AppContainerTest, AllowOpenEvent) { michael@0: if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) michael@0: return; michael@0: michael@0: TestRunner runner(JOB_UNPROTECTED, USER_UNPROTECTED, USER_UNPROTECTED); michael@0: michael@0: const wchar_t capability[] = L"S-1-15-3-12345678-87654321"; michael@0: base::win::ScopedHandle handle(CreateTaggedEvent(L"test", capability)); michael@0: ASSERT_TRUE(handle.IsValid()); michael@0: michael@0: EXPECT_EQ(SBOX_ALL_OK, michael@0: runner.broker()->InstallAppContainer(kAppContainerSid, michael@0: kAppContainerName)); michael@0: EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->SetCapability(capability)); michael@0: EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->SetAppContainer(kAppContainerSid)); michael@0: michael@0: EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"Event_Open f test")); michael@0: michael@0: runner.SetTestState(BEFORE_REVERT); michael@0: EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"Event_Open f test")); michael@0: EXPECT_EQ(SBOX_ALL_OK, michael@0: runner.broker()->UninstallAppContainer(kAppContainerSid)); michael@0: } michael@0: michael@0: TEST(AppContainerTest, DenyOpenEvent) { michael@0: if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) michael@0: return; michael@0: michael@0: TestRunner runner(JOB_UNPROTECTED, USER_UNPROTECTED, USER_UNPROTECTED); michael@0: michael@0: const wchar_t capability[] = L"S-1-15-3-12345678-87654321"; michael@0: base::win::ScopedHandle handle(CreateTaggedEvent(L"test", capability)); michael@0: ASSERT_TRUE(handle.IsValid()); michael@0: michael@0: EXPECT_EQ(SBOX_ALL_OK, michael@0: runner.broker()->InstallAppContainer(kAppContainerSid, michael@0: kAppContainerName)); michael@0: EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->SetAppContainer(kAppContainerSid)); michael@0: michael@0: EXPECT_EQ(SBOX_TEST_DENIED, runner.RunTest(L"Event_Open f test")); michael@0: michael@0: runner.SetTestState(BEFORE_REVERT); michael@0: EXPECT_EQ(SBOX_TEST_DENIED, runner.RunTest(L"Event_Open f test")); michael@0: EXPECT_EQ(SBOX_ALL_OK, michael@0: runner.broker()->UninstallAppContainer(kAppContainerSid)); michael@0: } michael@0: michael@0: TEST(AppContainerTest, NoImpersonation) { michael@0: if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) michael@0: return; michael@0: michael@0: TestRunner runner(JOB_UNPROTECTED, USER_LIMITED, USER_LIMITED); michael@0: EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->SetAppContainer(kAppContainerSid)); michael@0: } michael@0: michael@0: TEST(AppContainerTest, WantsImpersonation) { michael@0: if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) michael@0: return; michael@0: michael@0: TestRunner runner(JOB_UNPROTECTED, USER_UNPROTECTED, USER_NON_ADMIN); michael@0: EXPECT_EQ(SBOX_ERROR_CANNOT_INIT_APPCONTAINER, michael@0: runner.GetPolicy()->SetAppContainer(kAppContainerSid)); michael@0: } michael@0: michael@0: TEST(AppContainerTest, RequiresImpersonation) { michael@0: if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) michael@0: return; michael@0: michael@0: TestRunner runner(JOB_UNPROTECTED, USER_RESTRICTED, USER_RESTRICTED); michael@0: EXPECT_EQ(SBOX_ERROR_CANNOT_INIT_APPCONTAINER, michael@0: runner.GetPolicy()->SetAppContainer(kAppContainerSid)); michael@0: } michael@0: michael@0: } // namespace sandbox