| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "sandbox/win/src/broker_services.h" | 5 #include "sandbox/win/src/broker_services.h" |
| 6 | 6 |
| 7 #include <AclAPI.h> | 7 #include <AclAPI.h> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 delete peer; | 106 delete peer; |
| 107 } else { | 107 } else { |
| 108 NOTREACHED(); | 108 NOTREACHED(); |
| 109 } | 109 } |
| 110 } | 110 } |
| 111 | 111 |
| 112 } // namespace | 112 } // namespace |
| 113 | 113 |
| 114 namespace sandbox { | 114 namespace sandbox { |
| 115 | 115 |
| 116 // TODO(rvargas): Replace this structure with a std::pair of ScopedHandles. | |
| 117 struct BrokerServicesBase::TokenPair { | |
| 118 TokenPair(base::win::ScopedHandle initial_token, | |
| 119 base::win::ScopedHandle lockdown_token) | |
| 120 : initial(initial_token.Pass()), | |
| 121 lockdown(lockdown_token.Pass()) { | |
| 122 } | |
| 123 | |
| 124 base::win::ScopedHandle initial; | |
| 125 base::win::ScopedHandle lockdown; | |
| 126 }; | |
| 127 | |
| 128 BrokerServicesBase::BrokerServicesBase() : thread_pool_(NULL) { | 116 BrokerServicesBase::BrokerServicesBase() : thread_pool_(NULL) { |
| 129 } | 117 } |
| 130 | 118 |
| 131 // The broker uses a dedicated worker thread that services the job completion | 119 // The broker uses a dedicated worker thread that services the job completion |
| 132 // port to perform policy notifications and associated cleanup tasks. | 120 // port to perform policy notifications and associated cleanup tasks. |
| 133 ResultCode BrokerServicesBase::Init() { | 121 ResultCode BrokerServicesBase::Init() { |
| 134 if (job_port_.IsValid() || (NULL != thread_pool_)) | 122 if (job_port_.IsValid() || (NULL != thread_pool_)) |
| 135 return SBOX_ERROR_UNEXPECTED_CALL; | 123 return SBOX_ERROR_UNEXPECTED_CALL; |
| 136 | 124 |
| 137 ::InitializeCriticalSection(&lock_); | 125 ::InitializeCriticalSection(&lock_); |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 // This downcast is safe as long as we control CreatePolicy() | 307 // This downcast is safe as long as we control CreatePolicy() |
| 320 PolicyBase* policy_base = static_cast<PolicyBase*>(policy); | 308 PolicyBase* policy_base = static_cast<PolicyBase*>(policy); |
| 321 | 309 |
| 322 if (policy_base->GetAppContainer() && policy_base->GetLowBoxSid()) | 310 if (policy_base->GetAppContainer() && policy_base->GetLowBoxSid()) |
| 323 return SBOX_ERROR_BAD_PARAMS; | 311 return SBOX_ERROR_BAD_PARAMS; |
| 324 | 312 |
| 325 // Construct the tokens and the job object that we are going to associate | 313 // Construct the tokens and the job object that we are going to associate |
| 326 // with the soon to be created target process. | 314 // with the soon to be created target process. |
| 327 base::win::ScopedHandle initial_token; | 315 base::win::ScopedHandle initial_token; |
| 328 base::win::ScopedHandle lockdown_token; | 316 base::win::ScopedHandle lockdown_token; |
| 317 base::win::ScopedHandle lowbox_token; |
| 329 ResultCode result = SBOX_ALL_OK; | 318 ResultCode result = SBOX_ALL_OK; |
| 330 | 319 |
| 331 result = policy_base->MakeTokens(&initial_token, &lockdown_token); | 320 result = |
| 321 policy_base->MakeTokens(&initial_token, &lockdown_token, &lowbox_token); |
| 332 if (SBOX_ALL_OK != result) | 322 if (SBOX_ALL_OK != result) |
| 333 return result; | 323 return result; |
| 334 | 324 |
| 335 base::win::ScopedHandle job; | 325 base::win::ScopedHandle job; |
| 336 result = policy_base->MakeJobObject(&job); | 326 result = policy_base->MakeJobObject(&job); |
| 337 if (SBOX_ALL_OK != result) | 327 if (SBOX_ALL_OK != result) |
| 338 return result; | 328 return result; |
| 339 | 329 |
| 340 // Initialize the startup information from the policy. | 330 // Initialize the startup information from the policy. |
| 341 base::win::StartupInformation startup_info; | 331 base::win::StartupInformation startup_info; |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 std::vector<DWORD> inherited_handle_information(inherited_handle_list.size()); | 428 std::vector<DWORD> inherited_handle_information(inherited_handle_list.size()); |
| 439 for (size_t i = 0; i < inherited_handle_list.size(); ++i) { | 429 for (size_t i = 0; i < inherited_handle_list.size(); ++i) { |
| 440 const HANDLE& inherited_handle = inherited_handle_list[i]; | 430 const HANDLE& inherited_handle = inherited_handle_list[i]; |
| 441 ::GetHandleInformation(inherited_handle, &inherited_handle_information[i]); | 431 ::GetHandleInformation(inherited_handle, &inherited_handle_information[i]); |
| 442 ::SetHandleInformation(inherited_handle, HANDLE_FLAG_PROTECT_FROM_CLOSE, 0); | 432 ::SetHandleInformation(inherited_handle, HANDLE_FLAG_PROTECT_FROM_CLOSE, 0); |
| 443 } | 433 } |
| 444 | 434 |
| 445 // Create the TargetProces object and spawn the target suspended. Note that | 435 // Create the TargetProces object and spawn the target suspended. Note that |
| 446 // Brokerservices does not own the target object. It is owned by the Policy. | 436 // Brokerservices does not own the target object. It is owned by the Policy. |
| 447 base::win::ScopedProcessInformation process_info; | 437 base::win::ScopedProcessInformation process_info; |
| 448 TargetProcess* target = new TargetProcess(initial_token.Pass(), | 438 TargetProcess* target = |
| 449 lockdown_token.Pass(), | 439 new TargetProcess(initial_token.Pass(), lockdown_token.Pass(), |
| 450 job.Get(), | 440 lowbox_token.Pass(), job.Get(), thread_pool_); |
| 451 thread_pool_); | |
| 452 | 441 |
| 453 DWORD win_result = target->Create(exe_path, command_line, inherit_handles, | 442 DWORD win_result = target->Create(exe_path, command_line, inherit_handles, |
| 454 policy_base->GetLowBoxSid() ? true : false, | |
| 455 startup_info, &process_info); | 443 startup_info, &process_info); |
| 456 | 444 |
| 457 // Restore the previous handle protection values. | 445 // Restore the previous handle protection values. |
| 458 for (size_t i = 0; i < inherited_handle_list.size(); ++i) { | 446 for (size_t i = 0; i < inherited_handle_list.size(); ++i) { |
| 459 ::SetHandleInformation(inherited_handle_list[i], | 447 ::SetHandleInformation(inherited_handle_list[i], |
| 460 HANDLE_FLAG_PROTECT_FROM_CLOSE, | 448 HANDLE_FLAG_PROTECT_FROM_CLOSE, |
| 461 inherited_handle_information[i]); | 449 inherited_handle_information[i]); |
| 462 } | 450 } |
| 463 | 451 |
| 464 policy_base->ClearSharedHandles(); | 452 policy_base->ClearSharedHandles(); |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 return SBOX_ERROR_UNSUPPORTED; | 564 return SBOX_ERROR_UNSUPPORTED; |
| 577 | 565 |
| 578 base::string16 name = LookupAppContainer(sid); | 566 base::string16 name = LookupAppContainer(sid); |
| 579 if (name.empty()) | 567 if (name.empty()) |
| 580 return SBOX_ERROR_INVALID_APP_CONTAINER; | 568 return SBOX_ERROR_INVALID_APP_CONTAINER; |
| 581 | 569 |
| 582 return DeleteAppContainer(sid); | 570 return DeleteAppContainer(sid); |
| 583 } | 571 } |
| 584 | 572 |
| 585 } // namespace sandbox | 573 } // namespace sandbox |
| OLD | NEW |