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