1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/sandbox/win/src/app_container_test.cc Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,143 @@ 1.4 +// Copyright (c) 2012 The Chromium Authors. All rights reserved. 1.5 +// Use of this source code is governed by a BSD-style license that can be 1.6 +// found in the LICENSE file. 1.7 + 1.8 +#include <windows.h> 1.9 + 1.10 +#define _ATL_NO_EXCEPTIONS 1.11 +#include <atlbase.h> 1.12 +#include <atlsecurity.h> 1.13 + 1.14 +#include "base/strings/string16.h" 1.15 +#include "base/win/scoped_handle.h" 1.16 +#include "base/win/windows_version.h" 1.17 +#include "sandbox/win/src/sync_policy_test.h" 1.18 +#include "testing/gtest/include/gtest/gtest.h" 1.19 + 1.20 +namespace { 1.21 + 1.22 +const wchar_t kAppContainerName[] = L"sbox_test"; 1.23 +const wchar_t kAppContainerSid[] = 1.24 + L"S-1-15-2-3251537155-1984446955-2931258699-841473695-1938553385-" 1.25 + L"924012148-2839372144"; 1.26 + 1.27 +const ULONG kSharing = FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE; 1.28 + 1.29 +HANDLE CreateTaggedEvent(const string16& name, const string16& sid) { 1.30 + base::win::ScopedHandle event(CreateEvent(NULL, FALSE, FALSE, name.c_str())); 1.31 + if (!event.IsValid()) 1.32 + return NULL; 1.33 + 1.34 + wchar_t file_name[MAX_PATH] = {}; 1.35 + wchar_t temp_directory[MAX_PATH] = {}; 1.36 + GetTempPath(MAX_PATH, temp_directory); 1.37 + GetTempFileName(temp_directory, L"test", 0, file_name); 1.38 + 1.39 + base::win::ScopedHandle file; 1.40 + file.Set(CreateFile(file_name, GENERIC_READ | STANDARD_RIGHTS_READ, kSharing, 1.41 + NULL, OPEN_EXISTING, 0, NULL)); 1.42 + DeleteFile(file_name); 1.43 + if (!file.IsValid()) 1.44 + return NULL; 1.45 + 1.46 + CSecurityDesc sd; 1.47 + if (!AtlGetSecurityDescriptor(file.Get(), SE_FILE_OBJECT, &sd, 1.48 + OWNER_SECURITY_INFORMATION | 1.49 + GROUP_SECURITY_INFORMATION | 1.50 + DACL_SECURITY_INFORMATION)) { 1.51 + return NULL; 1.52 + } 1.53 + 1.54 + PSID local_sid; 1.55 + if (!ConvertStringSidToSid(sid.c_str(), &local_sid)) 1.56 + return NULL; 1.57 + 1.58 + CDacl new_dacl; 1.59 + sd.GetDacl(&new_dacl); 1.60 + CSid csid(reinterpret_cast<SID*>(local_sid)); 1.61 + new_dacl.AddAllowedAce(csid, EVENT_ALL_ACCESS); 1.62 + if (!AtlSetDacl(event.Get(), SE_KERNEL_OBJECT, new_dacl)) 1.63 + event.Close(); 1.64 + 1.65 + LocalFree(local_sid); 1.66 + return event.IsValid() ? event.Take() : NULL; 1.67 +} 1.68 + 1.69 +} // namespace 1.70 + 1.71 +namespace sandbox { 1.72 + 1.73 +TEST(AppContainerTest, AllowOpenEvent) { 1.74 + if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) 1.75 + return; 1.76 + 1.77 + TestRunner runner(JOB_UNPROTECTED, USER_UNPROTECTED, USER_UNPROTECTED); 1.78 + 1.79 + const wchar_t capability[] = L"S-1-15-3-12345678-87654321"; 1.80 + base::win::ScopedHandle handle(CreateTaggedEvent(L"test", capability)); 1.81 + ASSERT_TRUE(handle.IsValid()); 1.82 + 1.83 + EXPECT_EQ(SBOX_ALL_OK, 1.84 + runner.broker()->InstallAppContainer(kAppContainerSid, 1.85 + kAppContainerName)); 1.86 + EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->SetCapability(capability)); 1.87 + EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->SetAppContainer(kAppContainerSid)); 1.88 + 1.89 + EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"Event_Open f test")); 1.90 + 1.91 + runner.SetTestState(BEFORE_REVERT); 1.92 + EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"Event_Open f test")); 1.93 + EXPECT_EQ(SBOX_ALL_OK, 1.94 + runner.broker()->UninstallAppContainer(kAppContainerSid)); 1.95 +} 1.96 + 1.97 +TEST(AppContainerTest, DenyOpenEvent) { 1.98 + if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) 1.99 + return; 1.100 + 1.101 + TestRunner runner(JOB_UNPROTECTED, USER_UNPROTECTED, USER_UNPROTECTED); 1.102 + 1.103 + const wchar_t capability[] = L"S-1-15-3-12345678-87654321"; 1.104 + base::win::ScopedHandle handle(CreateTaggedEvent(L"test", capability)); 1.105 + ASSERT_TRUE(handle.IsValid()); 1.106 + 1.107 + EXPECT_EQ(SBOX_ALL_OK, 1.108 + runner.broker()->InstallAppContainer(kAppContainerSid, 1.109 + kAppContainerName)); 1.110 + EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->SetAppContainer(kAppContainerSid)); 1.111 + 1.112 + EXPECT_EQ(SBOX_TEST_DENIED, runner.RunTest(L"Event_Open f test")); 1.113 + 1.114 + runner.SetTestState(BEFORE_REVERT); 1.115 + EXPECT_EQ(SBOX_TEST_DENIED, runner.RunTest(L"Event_Open f test")); 1.116 + EXPECT_EQ(SBOX_ALL_OK, 1.117 + runner.broker()->UninstallAppContainer(kAppContainerSid)); 1.118 +} 1.119 + 1.120 +TEST(AppContainerTest, NoImpersonation) { 1.121 + if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) 1.122 + return; 1.123 + 1.124 + TestRunner runner(JOB_UNPROTECTED, USER_LIMITED, USER_LIMITED); 1.125 + EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->SetAppContainer(kAppContainerSid)); 1.126 +} 1.127 + 1.128 +TEST(AppContainerTest, WantsImpersonation) { 1.129 + if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) 1.130 + return; 1.131 + 1.132 + TestRunner runner(JOB_UNPROTECTED, USER_UNPROTECTED, USER_NON_ADMIN); 1.133 + EXPECT_EQ(SBOX_ERROR_CANNOT_INIT_APPCONTAINER, 1.134 + runner.GetPolicy()->SetAppContainer(kAppContainerSid)); 1.135 +} 1.136 + 1.137 +TEST(AppContainerTest, RequiresImpersonation) { 1.138 + if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) 1.139 + return; 1.140 + 1.141 + TestRunner runner(JOB_UNPROTECTED, USER_RESTRICTED, USER_RESTRICTED); 1.142 + EXPECT_EQ(SBOX_ERROR_CANNOT_INIT_APPCONTAINER, 1.143 + runner.GetPolicy()->SetAppContainer(kAppContainerSid)); 1.144 +} 1.145 + 1.146 +} // namespace sandbox