| 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/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 AutoLock lock(&lock_); | 350 AutoLock lock(&lock_); |
| 351 | 351 |
| 352 // This downcast is safe as long as we control CreatePolicy() | 352 // This downcast is safe as long as we control CreatePolicy() |
| 353 PolicyBase* policy_base = static_cast<PolicyBase*>(policy); | 353 PolicyBase* policy_base = static_cast<PolicyBase*>(policy); |
| 354 | 354 |
| 355 if (policy_base->GetAppContainer() && policy_base->GetLowBoxSid()) | 355 if (policy_base->GetAppContainer() && policy_base->GetLowBoxSid()) |
| 356 return SBOX_ERROR_BAD_PARAMS; | 356 return SBOX_ERROR_BAD_PARAMS; |
| 357 | 357 |
| 358 // Construct the tokens and the job object that we are going to associate | 358 // Construct the tokens and the job object that we are going to associate |
| 359 // with the soon to be created target process. | 359 // with the soon to be created target process. |
| 360 HANDLE initial_token_temp; | 360 base::win::ScopedHandle initial_token; |
| 361 HANDLE lockdown_token_temp; | 361 base::win::ScopedHandle lockdown_token; |
| 362 ResultCode result = SBOX_ALL_OK; | 362 ResultCode result = SBOX_ALL_OK; |
| 363 | 363 |
| 364 if (IsTokenCacheable(policy_base)) { | 364 if (IsTokenCacheable(policy_base)) { |
| 365 // Create the master tokens only once and save them in a cache. That way | 365 // Create the master tokens only once and save them in a cache. That way |
| 366 // can just duplicate them to avoid hammering LSASS on every sandboxed | 366 // can just duplicate them to avoid hammering LSASS on every sandboxed |
| 367 // process launch. | 367 // process launch. |
| 368 uint32_t token_key = GenerateTokenCacheKey(policy_base); | 368 uint32_t token_key = GenerateTokenCacheKey(policy_base); |
| 369 TokenCacheMap::iterator it = token_cache_.find(token_key); | 369 TokenCacheMap::iterator it = token_cache_.find(token_key); |
| 370 HANDLE initial_token_temp; |
| 371 HANDLE lockdown_token_temp; |
| 370 if (it != token_cache_.end()) { | 372 if (it != token_cache_.end()) { |
| 371 initial_token_temp = it->second.first; | 373 initial_token_temp = it->second.first; |
| 372 lockdown_token_temp = it->second.second; | 374 lockdown_token_temp = it->second.second; |
| 373 } else { | 375 } else { |
| 374 result = | 376 result = policy_base->MakeTokens(&initial_token, &lockdown_token); |
| 375 policy_base->MakeTokens(&initial_token_temp, &lockdown_token_temp); | |
| 376 if (SBOX_ALL_OK != result) | 377 if (SBOX_ALL_OK != result) |
| 377 return result; | 378 return result; |
| 378 token_cache_[token_key] = | 379 token_cache_[token_key] = |
| 379 std::pair<HANDLE, HANDLE>(initial_token_temp, lockdown_token_temp); | 380 std::make_pair(initial_token.Get(), lockdown_token.Get()); |
| 381 initial_token_temp = initial_token.Take(); |
| 382 lockdown_token_temp = lockdown_token.Take(); |
| 380 } | 383 } |
| 381 | 384 |
| 382 if (!::DuplicateToken(initial_token_temp, SecurityImpersonation, | 385 if (!::DuplicateToken(initial_token_temp, SecurityImpersonation, |
| 383 &initial_token_temp)) { | 386 &initial_token_temp)) { |
| 384 return SBOX_ERROR_GENERIC; | 387 return SBOX_ERROR_GENERIC; |
| 385 } | 388 } |
| 389 initial_token.Set(initial_token_temp); |
| 386 | 390 |
| 387 if (!::DuplicateTokenEx(lockdown_token_temp, TOKEN_ALL_ACCESS, 0, | 391 if (!::DuplicateTokenEx(lockdown_token_temp, TOKEN_ALL_ACCESS, 0, |
| 388 SecurityIdentification, TokenPrimary, | 392 SecurityIdentification, TokenPrimary, |
| 389 &lockdown_token_temp)) { | 393 &lockdown_token_temp)) { |
| 390 return SBOX_ERROR_GENERIC; | 394 return SBOX_ERROR_GENERIC; |
| 391 } | 395 } |
| 396 lockdown_token.Set(lockdown_token_temp); |
| 392 } else { | 397 } else { |
| 393 result = policy_base->MakeTokens(&initial_token_temp, &lockdown_token_temp); | 398 result = policy_base->MakeTokens(&initial_token, &lockdown_token); |
| 394 if (SBOX_ALL_OK != result) | 399 if (SBOX_ALL_OK != result) |
| 395 return result; | 400 return result; |
| 396 } | 401 } |
| 397 | 402 |
| 398 base::win::ScopedHandle initial_token(initial_token_temp); | |
| 399 base::win::ScopedHandle lockdown_token(lockdown_token_temp); | |
| 400 | |
| 401 HANDLE job_temp; | 403 HANDLE job_temp; |
| 402 result = policy_base->MakeJobObject(&job_temp); | 404 result = policy_base->MakeJobObject(&job_temp); |
| 403 if (SBOX_ALL_OK != result) | 405 if (SBOX_ALL_OK != result) |
| 404 return result; | 406 return result; |
| 405 | 407 |
| 406 base::win::ScopedHandle job(job_temp); | 408 base::win::ScopedHandle job(job_temp); |
| 407 | 409 |
| 408 // Initialize the startup information from the policy. | 410 // Initialize the startup information from the policy. |
| 409 base::win::StartupInformation startup_info; | 411 base::win::StartupInformation startup_info; |
| 410 // The liftime of |mitigations| and |inherit_handle_list| have to be at least | 412 // The liftime of |mitigations| and |inherit_handle_list| have to be at least |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 619 return SBOX_ERROR_UNSUPPORTED; | 621 return SBOX_ERROR_UNSUPPORTED; |
| 620 | 622 |
| 621 base::string16 name = LookupAppContainer(sid); | 623 base::string16 name = LookupAppContainer(sid); |
| 622 if (name.empty()) | 624 if (name.empty()) |
| 623 return SBOX_ERROR_INVALID_APP_CONTAINER; | 625 return SBOX_ERROR_INVALID_APP_CONTAINER; |
| 624 | 626 |
| 625 return DeleteAppContainer(sid); | 627 return DeleteAppContainer(sid); |
| 626 } | 628 } |
| 627 | 629 |
| 628 } // namespace sandbox | 630 } // namespace sandbox |
| OLD | NEW |