15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _ATL_NO_EXCEPTIONS 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <atlbase.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <atlsecurity.h> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_handle.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sandbox/win/src/sync_policy_test.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kAppContainerName[] = L"sbox_test"; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kAppContainerSid[] = 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"S-1-15-2-3251537155-1984446955-2931258699-841473695-1938553385-" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"924012148-2839372144"; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const ULONG kSharing = FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)HANDLE CreateTaggedEvent(const base::string16& name, 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& sid) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedHandle event(CreateEvent(NULL, FALSE, FALSE, name.c_str())); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!event.IsValid()) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wchar_t file_name[MAX_PATH] = {}; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) wchar_t temp_directory[MAX_PATH] = {}; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTempPath(MAX_PATH, temp_directory); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetTempFileName(temp_directory, L"test", 0, file_name); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedHandle file; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file.Set(CreateFile(file_name, GENERIC_READ | STANDARD_RIGHTS_READ, kSharing, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL, OPEN_EXISTING, 0, NULL)); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeleteFile(file_name); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!file.IsValid()) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CSecurityDesc sd; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!AtlGetSecurityDescriptor(file.Get(), SE_FILE_OBJECT, &sd, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OWNER_SECURITY_INFORMATION | 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GROUP_SECURITY_INFORMATION | 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DACL_SECURITY_INFORMATION)) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PSID local_sid; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ConvertStringSidToSid(sid.c_str(), &local_sid)) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CDacl new_dacl; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sd.GetDacl(&new_dacl); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CSid csid(reinterpret_cast<SID*>(local_sid)); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_dacl.AddAllowedAce(csid, EVENT_ALL_ACCESS); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!AtlSetDacl(event.Get(), SE_KERNEL_OBJECT, new_dacl)) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.Close(); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LocalFree(local_sid); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return event.IsValid() ? event.Take() : NULL; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sandbox { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(AppContainerTest, AllowOpenEvent) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestRunner runner(JOB_UNPROTECTED, USER_UNPROTECTED, USER_UNPROTECTED); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const wchar_t capability[] = L"S-1-15-3-12345678-87654321"; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedHandle handle(CreateTaggedEvent(L"test", capability)); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(handle.IsValid()); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SBOX_ALL_OK, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runner.broker()->InstallAppContainer(kAppContainerSid, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAppContainerName)); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->SetCapability(capability)); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->SetAppContainer(kAppContainerSid)); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"Event_Open f test")); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runner.SetTestState(BEFORE_REVERT); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SBOX_TEST_SUCCEEDED, runner.RunTest(L"Event_Open f test")); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SBOX_ALL_OK, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runner.broker()->UninstallAppContainer(kAppContainerSid)); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(AppContainerTest, DenyOpenEvent) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestRunner runner(JOB_UNPROTECTED, USER_UNPROTECTED, USER_UNPROTECTED); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const wchar_t capability[] = L"S-1-15-3-12345678-87654321"; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedHandle handle(CreateTaggedEvent(L"test", capability)); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(handle.IsValid()); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SBOX_ALL_OK, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runner.broker()->InstallAppContainer(kAppContainerSid, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kAppContainerName)); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->SetAppContainer(kAppContainerSid)); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SBOX_TEST_DENIED, runner.RunTest(L"Event_Open f test")); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runner.SetTestState(BEFORE_REVERT); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SBOX_TEST_DENIED, runner.RunTest(L"Event_Open f test")); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SBOX_ALL_OK, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runner.broker()->UninstallAppContainer(kAppContainerSid)); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(AppContainerTest, NoImpersonation) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestRunner runner(JOB_UNPROTECTED, USER_LIMITED, USER_LIMITED); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->SetAppContainer(kAppContainerSid)); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(AppContainerTest, WantsImpersonation) { 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestRunner runner(JOB_UNPROTECTED, USER_UNPROTECTED, USER_NON_ADMIN); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SBOX_ERROR_CANNOT_INIT_APPCONTAINER, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runner.GetPolicy()->SetAppContainer(kAppContainerSid)); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(AppContainerTest, RequiresImpersonation) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::win::OSInfo::GetInstance()->version() < base::win::VERSION_WIN8) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestRunner runner(JOB_UNPROTECTED, USER_RESTRICTED, USER_RESTRICTED); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SBOX_ERROR_CANNOT_INIT_APPCONTAINER, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) runner.GetPolicy()->SetAppContainer(kAppContainerSid)); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace sandbox 145