| Index: sandbox/win/src/registry_policy.cc
|
| diff --git a/sandbox/win/src/registry_policy.cc b/sandbox/win/src/registry_policy.cc
|
| deleted file mode 100644
|
| index ec66380814250d00d50a5db1792162ba2979b9ec..0000000000000000000000000000000000000000
|
| --- a/sandbox/win/src/registry_policy.cc
|
| +++ /dev/null
|
| @@ -1,227 +0,0 @@
|
| -// Copyright (c) 2006-2008 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 <stdint.h>
|
| -
|
| -#include <string>
|
| -
|
| -#include "sandbox/win/src/registry_policy.h"
|
| -
|
| -#include "base/logging.h"
|
| -#include "sandbox/win/src/ipc_tags.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/sandbox_utils.h"
|
| -#include "sandbox/win/src/win_utils.h"
|
| -
|
| -namespace {
|
| -
|
| -static const uint32_t kAllowedRegFlags =
|
| - KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY | KEY_READ |
|
| - GENERIC_READ | GENERIC_EXECUTE | READ_CONTROL;
|
| -
|
| -// Opens the key referenced by |obj_attributes| with |access| and
|
| -// checks what permission was given. Remove the WRITE flags and update
|
| -// |access| with the new value.
|
| -NTSTATUS TranslateMaximumAllowed(OBJECT_ATTRIBUTES* obj_attributes,
|
| - DWORD* access) {
|
| - NtOpenKeyFunction NtOpenKey = NULL;
|
| - ResolveNTFunctionPtr("NtOpenKey", &NtOpenKey);
|
| -
|
| - NtCloseFunction NtClose = NULL;
|
| - ResolveNTFunctionPtr("NtClose", &NtClose);
|
| -
|
| - NtQueryObjectFunction NtQueryObject = NULL;
|
| - ResolveNTFunctionPtr("NtQueryObject", &NtQueryObject);
|
| -
|
| - // Open the key.
|
| - HANDLE handle;
|
| - NTSTATUS status = NtOpenKey(&handle, *access, obj_attributes);
|
| - if (!NT_SUCCESS(status))
|
| - return status;
|
| -
|
| - OBJECT_BASIC_INFORMATION info = {0};
|
| - status = NtQueryObject(handle, ObjectBasicInformation, &info, sizeof(info),
|
| - NULL);
|
| - CHECK(NT_SUCCESS(NtClose(handle)));
|
| - if (!NT_SUCCESS(status))
|
| - return status;
|
| -
|
| - *access = info.GrantedAccess & kAllowedRegFlags;
|
| - return STATUS_SUCCESS;
|
| -}
|
| -
|
| -NTSTATUS NtCreateKeyInTarget(HANDLE* target_key_handle,
|
| - ACCESS_MASK desired_access,
|
| - OBJECT_ATTRIBUTES* obj_attributes,
|
| - ULONG title_index,
|
| - UNICODE_STRING* class_name,
|
| - ULONG create_options,
|
| - ULONG* disposition,
|
| - HANDLE target_process) {
|
| - NtCreateKeyFunction NtCreateKey = NULL;
|
| - ResolveNTFunctionPtr("NtCreateKey", &NtCreateKey);
|
| -
|
| - if (MAXIMUM_ALLOWED & desired_access) {
|
| - NTSTATUS status = TranslateMaximumAllowed(obj_attributes, &desired_access);
|
| - if (!NT_SUCCESS(status))
|
| - return STATUS_ACCESS_DENIED;
|
| - }
|
| -
|
| - HANDLE local_handle = INVALID_HANDLE_VALUE;
|
| - NTSTATUS status = NtCreateKey(&local_handle, desired_access, obj_attributes,
|
| - title_index, class_name, create_options,
|
| - disposition);
|
| - if (!NT_SUCCESS(status))
|
| - return status;
|
| -
|
| - if (!::DuplicateHandle(::GetCurrentProcess(), local_handle,
|
| - target_process, target_key_handle, 0, FALSE,
|
| - DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) {
|
| - return STATUS_ACCESS_DENIED;
|
| - }
|
| - return STATUS_SUCCESS;
|
| -}
|
| -
|
| -NTSTATUS NtOpenKeyInTarget(HANDLE* target_key_handle,
|
| - ACCESS_MASK desired_access,
|
| - OBJECT_ATTRIBUTES* obj_attributes,
|
| - HANDLE target_process) {
|
| - NtOpenKeyFunction NtOpenKey = NULL;
|
| - ResolveNTFunctionPtr("NtOpenKey", &NtOpenKey);
|
| -
|
| - if (MAXIMUM_ALLOWED & desired_access) {
|
| - NTSTATUS status = TranslateMaximumAllowed(obj_attributes, &desired_access);
|
| - if (!NT_SUCCESS(status))
|
| - return STATUS_ACCESS_DENIED;
|
| - }
|
| -
|
| - HANDLE local_handle = INVALID_HANDLE_VALUE;
|
| - NTSTATUS status = NtOpenKey(&local_handle, desired_access, obj_attributes);
|
| -
|
| - if (!NT_SUCCESS(status))
|
| - return status;
|
| -
|
| - if (!::DuplicateHandle(::GetCurrentProcess(), local_handle,
|
| - target_process, target_key_handle, 0, FALSE,
|
| - DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) {
|
| - return STATUS_ACCESS_DENIED;
|
| - }
|
| - return STATUS_SUCCESS;
|
| -}
|
| -
|
| -}
|
| -
|
| -namespace sandbox {
|
| -
|
| -bool RegistryPolicy::GenerateRules(const wchar_t* name,
|
| - TargetPolicy::Semantics semantics,
|
| - LowLevelPolicy* policy) {
|
| - base::string16 resovled_name(name);
|
| - if (resovled_name.empty()) {
|
| - return false;
|
| - }
|
| -
|
| - if (!ResolveRegistryName(resovled_name, &resovled_name))
|
| - return false;
|
| -
|
| - name = resovled_name.c_str();
|
| -
|
| - EvalResult result = ASK_BROKER;
|
| -
|
| - PolicyRule open(result);
|
| - PolicyRule create(result);
|
| -
|
| - switch (semantics) {
|
| - case TargetPolicy::REG_ALLOW_READONLY: {
|
| - // We consider all flags that are not known to be readonly as potentially
|
| - // used for write. Here we also support MAXIMUM_ALLOWED, but we are going
|
| - // to expand it to read-only before the call.
|
| - uint32_t restricted_flags = ~(kAllowedRegFlags | MAXIMUM_ALLOWED);
|
| - open.AddNumberMatch(IF_NOT, OpenKey::ACCESS, restricted_flags, AND);
|
| - create.AddNumberMatch(IF_NOT, OpenKey::ACCESS, restricted_flags, AND);
|
| - break;
|
| - }
|
| - case TargetPolicy::REG_ALLOW_ANY: {
|
| - break;
|
| - }
|
| - default: {
|
| - NOTREACHED();
|
| - return false;
|
| - }
|
| - }
|
| -
|
| - if (!create.AddStringMatch(IF, OpenKey::NAME, name, CASE_INSENSITIVE) ||
|
| - !policy->AddRule(IPC_NTCREATEKEY_TAG, &create)) {
|
| - return false;
|
| - }
|
| -
|
| - if (!open.AddStringMatch(IF, OpenKey::NAME, name, CASE_INSENSITIVE) ||
|
| - !policy->AddRule(IPC_NTOPENKEY_TAG, &open)) {
|
| - return false;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| -bool RegistryPolicy::CreateKeyAction(EvalResult eval_result,
|
| - const ClientInfo& client_info,
|
| - const base::string16& key,
|
| - uint32_t attributes,
|
| - HANDLE root_directory,
|
| - uint32_t desired_access,
|
| - uint32_t title_index,
|
| - uint32_t create_options,
|
| - HANDLE* handle,
|
| - NTSTATUS* nt_status,
|
| - ULONG* disposition) {
|
| - // The only action supported is ASK_BROKER which means create the requested
|
| - // file as specified.
|
| - if (ASK_BROKER != eval_result) {
|
| - *nt_status = STATUS_ACCESS_DENIED;
|
| - return false;
|
| - }
|
| -
|
| - // We don't support creating link keys, volatile keys or backup/restore.
|
| - if (create_options) {
|
| - *nt_status = STATUS_ACCESS_DENIED;
|
| - return false;
|
| - }
|
| -
|
| - UNICODE_STRING uni_name = {0};
|
| - OBJECT_ATTRIBUTES obj_attributes = {0};
|
| - InitObjectAttribs(key, attributes, root_directory, &obj_attributes,
|
| - &uni_name, NULL);
|
| - *nt_status = NtCreateKeyInTarget(handle, desired_access, &obj_attributes,
|
| - title_index, NULL, create_options,
|
| - disposition, client_info.process);
|
| - return true;
|
| -}
|
| -
|
| -bool RegistryPolicy::OpenKeyAction(EvalResult eval_result,
|
| - const ClientInfo& client_info,
|
| - const base::string16& key,
|
| - uint32_t attributes,
|
| - HANDLE root_directory,
|
| - uint32_t desired_access,
|
| - HANDLE* handle,
|
| - NTSTATUS* nt_status) {
|
| - // The only action supported is ASK_BROKER which means open the requested
|
| - // file as specified.
|
| - if (ASK_BROKER != eval_result) {
|
| - *nt_status = STATUS_ACCESS_DENIED;
|
| - return true;
|
| - }
|
| -
|
| - UNICODE_STRING uni_name = {0};
|
| - OBJECT_ATTRIBUTES obj_attributes = {0};
|
| - InitObjectAttribs(key, attributes, root_directory, &obj_attributes,
|
| - &uni_name, NULL);
|
| - *nt_status = NtOpenKeyInTarget(handle, desired_access, &obj_attributes,
|
| - client_info.process);
|
| - return true;
|
| -}
|
| -
|
| -} // namespace sandbox
|
|
|