| Index: sandbox/win/src/process_thread_policy.cc
|
| diff --git a/sandbox/win/src/process_thread_policy.cc b/sandbox/win/src/process_thread_policy.cc
|
| deleted file mode 100644
|
| index 514e7d674f48339949d8c2e8838731ca02aad04f..0000000000000000000000000000000000000000
|
| --- a/sandbox/win/src/process_thread_policy.cc
|
| +++ /dev/null
|
| @@ -1,264 +0,0 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "sandbox/win/src/process_thread_policy.h"
|
| -
|
| -#include <stdint.h>
|
| -
|
| -#include <string>
|
| -
|
| -#include "base/memory/free_deleter.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "sandbox/win/src/ipc_tags.h"
|
| -#include "sandbox/win/src/nt_internals.h"
|
| -#include "sandbox/win/src/policy_engine_opcodes.h"
|
| -#include "sandbox/win/src/policy_params.h"
|
| -#include "sandbox/win/src/sandbox_types.h"
|
| -#include "sandbox/win/src/win_utils.h"
|
| -
|
| -namespace {
|
| -
|
| -// These are the only safe rights that can be given to a sandboxed
|
| -// process for the process created by the broker. All others are potential
|
| -// vectors of privilege elevation.
|
| -const DWORD kProcessRights = SYNCHRONIZE |
|
| - PROCESS_QUERY_INFORMATION |
|
| - PROCESS_QUERY_LIMITED_INFORMATION |
|
| - PROCESS_TERMINATE |
|
| - PROCESS_SUSPEND_RESUME;
|
| -
|
| -const DWORD kThreadRights = SYNCHRONIZE |
|
| - THREAD_TERMINATE |
|
| - THREAD_SUSPEND_RESUME |
|
| - THREAD_QUERY_INFORMATION |
|
| - THREAD_QUERY_LIMITED_INFORMATION |
|
| - THREAD_SET_LIMITED_INFORMATION;
|
| -
|
| -// Creates a child process and duplicates the handles to 'target_process'. The
|
| -// remaining parameters are the same as CreateProcess().
|
| -BOOL CreateProcessExWHelper(HANDLE target_process, BOOL give_full_access,
|
| - LPCWSTR lpApplicationName, LPWSTR lpCommandLine,
|
| - LPSECURITY_ATTRIBUTES lpProcessAttributes,
|
| - LPSECURITY_ATTRIBUTES lpThreadAttributes,
|
| - BOOL bInheritHandles, DWORD dwCreationFlags,
|
| - LPVOID lpEnvironment, LPCWSTR lpCurrentDirectory,
|
| - LPSTARTUPINFOW lpStartupInfo,
|
| - LPPROCESS_INFORMATION lpProcessInformation) {
|
| - if (!::CreateProcessW(lpApplicationName, lpCommandLine, lpProcessAttributes,
|
| - lpThreadAttributes, bInheritHandles, dwCreationFlags,
|
| - lpEnvironment, lpCurrentDirectory, lpStartupInfo,
|
| - lpProcessInformation)) {
|
| - return FALSE;
|
| - }
|
| -
|
| - DWORD process_access = kProcessRights;
|
| - DWORD thread_access = kThreadRights;
|
| - if (give_full_access) {
|
| - process_access = PROCESS_ALL_ACCESS;
|
| - thread_access = THREAD_ALL_ACCESS;
|
| - }
|
| - if (!::DuplicateHandle(::GetCurrentProcess(), lpProcessInformation->hProcess,
|
| - target_process, &lpProcessInformation->hProcess,
|
| - process_access, FALSE, DUPLICATE_CLOSE_SOURCE)) {
|
| - ::CloseHandle(lpProcessInformation->hThread);
|
| - return FALSE;
|
| - }
|
| - if (!::DuplicateHandle(::GetCurrentProcess(), lpProcessInformation->hThread,
|
| - target_process, &lpProcessInformation->hThread,
|
| - thread_access, FALSE, DUPLICATE_CLOSE_SOURCE)) {
|
| - return FALSE;
|
| - }
|
| - return TRUE;
|
| -}
|
| -
|
| -}
|
| -
|
| -namespace sandbox {
|
| -
|
| -bool ProcessPolicy::GenerateRules(const wchar_t* name,
|
| - TargetPolicy::Semantics semantics,
|
| - LowLevelPolicy* policy) {
|
| - scoped_ptr<PolicyRule> process;
|
| - switch (semantics) {
|
| - case TargetPolicy::PROCESS_MIN_EXEC: {
|
| - process.reset(new PolicyRule(GIVE_READONLY));
|
| - break;
|
| - };
|
| - case TargetPolicy::PROCESS_ALL_EXEC: {
|
| - process.reset(new PolicyRule(GIVE_ALLACCESS));
|
| - break;
|
| - };
|
| - default: {
|
| - return false;
|
| - };
|
| - }
|
| -
|
| - if (!process->AddStringMatch(IF, NameBased::NAME, name, CASE_INSENSITIVE)) {
|
| - return false;
|
| - }
|
| - if (!policy->AddRule(IPC_CREATEPROCESSW_TAG, process.get())) {
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -NTSTATUS ProcessPolicy::OpenThreadAction(const ClientInfo& client_info,
|
| - uint32_t desired_access,
|
| - uint32_t thread_id,
|
| - HANDLE* handle) {
|
| - *handle = NULL;
|
| -
|
| - NtOpenThreadFunction NtOpenThread = NULL;
|
| - ResolveNTFunctionPtr("NtOpenThread", &NtOpenThread);
|
| -
|
| - OBJECT_ATTRIBUTES attributes = {0};
|
| - attributes.Length = sizeof(attributes);
|
| - CLIENT_ID client_id = {0};
|
| - client_id.UniqueProcess = reinterpret_cast<PVOID>(
|
| - static_cast<ULONG_PTR>(client_info.process_id));
|
| - client_id.UniqueThread =
|
| - reinterpret_cast<PVOID>(static_cast<ULONG_PTR>(thread_id));
|
| -
|
| - HANDLE local_handle = NULL;
|
| - NTSTATUS status = NtOpenThread(&local_handle, desired_access, &attributes,
|
| - &client_id);
|
| - if (NT_SUCCESS(status)) {
|
| - if (!::DuplicateHandle(::GetCurrentProcess(), local_handle,
|
| - client_info.process, handle, 0, FALSE,
|
| - DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) {
|
| - return STATUS_ACCESS_DENIED;
|
| - }
|
| - }
|
| -
|
| - return status;
|
| -}
|
| -
|
| -NTSTATUS ProcessPolicy::OpenProcessAction(const ClientInfo& client_info,
|
| - uint32_t desired_access,
|
| - uint32_t process_id,
|
| - HANDLE* handle) {
|
| - *handle = NULL;
|
| -
|
| - NtOpenProcessFunction NtOpenProcess = NULL;
|
| - ResolveNTFunctionPtr("NtOpenProcess", &NtOpenProcess);
|
| -
|
| - if (client_info.process_id != process_id)
|
| - return STATUS_ACCESS_DENIED;
|
| -
|
| - OBJECT_ATTRIBUTES attributes = {0};
|
| - attributes.Length = sizeof(attributes);
|
| - CLIENT_ID client_id = {0};
|
| - client_id.UniqueProcess = reinterpret_cast<PVOID>(
|
| - static_cast<ULONG_PTR>(client_info.process_id));
|
| - HANDLE local_handle = NULL;
|
| - NTSTATUS status = NtOpenProcess(&local_handle, desired_access, &attributes,
|
| - &client_id);
|
| - if (NT_SUCCESS(status)) {
|
| - if (!::DuplicateHandle(::GetCurrentProcess(), local_handle,
|
| - client_info.process, handle, 0, FALSE,
|
| - DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) {
|
| - return STATUS_ACCESS_DENIED;
|
| - }
|
| - }
|
| -
|
| - return status;
|
| -}
|
| -
|
| -NTSTATUS ProcessPolicy::OpenProcessTokenAction(const ClientInfo& client_info,
|
| - HANDLE process,
|
| - uint32_t desired_access,
|
| - HANDLE* handle) {
|
| - *handle = NULL;
|
| - NtOpenProcessTokenFunction NtOpenProcessToken = NULL;
|
| - ResolveNTFunctionPtr("NtOpenProcessToken", &NtOpenProcessToken);
|
| -
|
| - if (CURRENT_PROCESS != process)
|
| - return STATUS_ACCESS_DENIED;
|
| -
|
| - HANDLE local_handle = NULL;
|
| - NTSTATUS status = NtOpenProcessToken(client_info.process, desired_access,
|
| - &local_handle);
|
| - if (NT_SUCCESS(status)) {
|
| - if (!::DuplicateHandle(::GetCurrentProcess(), local_handle,
|
| - client_info.process, handle, 0, FALSE,
|
| - DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) {
|
| - return STATUS_ACCESS_DENIED;
|
| - }
|
| - }
|
| - return status;
|
| -}
|
| -
|
| -NTSTATUS ProcessPolicy::OpenProcessTokenExAction(const ClientInfo& client_info,
|
| - HANDLE process,
|
| - uint32_t desired_access,
|
| - uint32_t attributes,
|
| - HANDLE* handle) {
|
| - *handle = NULL;
|
| - NtOpenProcessTokenExFunction NtOpenProcessTokenEx = NULL;
|
| - ResolveNTFunctionPtr("NtOpenProcessTokenEx", &NtOpenProcessTokenEx);
|
| -
|
| - if (CURRENT_PROCESS != process)
|
| - return STATUS_ACCESS_DENIED;
|
| -
|
| - HANDLE local_handle = NULL;
|
| - NTSTATUS status = NtOpenProcessTokenEx(client_info.process, desired_access,
|
| - attributes, &local_handle);
|
| - if (NT_SUCCESS(status)) {
|
| - if (!::DuplicateHandle(::GetCurrentProcess(), local_handle,
|
| - client_info.process, handle, 0, FALSE,
|
| - DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) {
|
| - return STATUS_ACCESS_DENIED;
|
| - }
|
| - }
|
| - return status;
|
| -}
|
| -
|
| -DWORD ProcessPolicy::CreateProcessWAction(EvalResult eval_result,
|
| - const ClientInfo& client_info,
|
| - const base::string16 &app_name,
|
| - const base::string16 &command_line,
|
| - PROCESS_INFORMATION* process_info) {
|
| - // The only action supported is ASK_BROKER which means create the process.
|
| - if (GIVE_ALLACCESS != eval_result && GIVE_READONLY != eval_result) {
|
| - return ERROR_ACCESS_DENIED;
|
| - }
|
| -
|
| - STARTUPINFO startup_info = {0};
|
| - startup_info.cb = sizeof(startup_info);
|
| - scoped_ptr<wchar_t, base::FreeDeleter>
|
| - cmd_line(_wcsdup(command_line.c_str()));
|
| -
|
| - BOOL should_give_full_access = (GIVE_ALLACCESS == eval_result);
|
| - if (!CreateProcessExWHelper(client_info.process, should_give_full_access,
|
| - app_name.c_str(), cmd_line.get(), NULL, NULL,
|
| - FALSE, 0, NULL, NULL, &startup_info,
|
| - process_info)) {
|
| - return ERROR_ACCESS_DENIED;
|
| - }
|
| - return ERROR_SUCCESS;
|
| -}
|
| -
|
| -DWORD ProcessPolicy::CreateThreadAction(
|
| - const ClientInfo& client_info,
|
| - const SIZE_T stack_size,
|
| - const LPTHREAD_START_ROUTINE start_address,
|
| - const LPVOID parameter,
|
| - const DWORD creation_flags,
|
| - LPDWORD thread_id,
|
| - HANDLE* handle) {
|
| - HANDLE local_handle =
|
| - ::CreateRemoteThread(client_info.process, nullptr, stack_size,
|
| - start_address, parameter, creation_flags, thread_id);
|
| - if (!local_handle) {
|
| - return ::GetLastError();
|
| - }
|
| - if (!::DuplicateHandle(::GetCurrentProcess(), local_handle,
|
| - client_info.process, handle, 0, FALSE,
|
| - DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) {
|
| - return ERROR_ACCESS_DENIED;
|
| - }
|
| - return ERROR_SUCCESS;
|
| -}
|
| -
|
| -} // namespace sandbox
|
|
|