| OLD | NEW |
| 1 | 1 |
| 2 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 3 // Use of this source code is governed by a BSD-style license that can be | 3 // Use of this source code is governed by a BSD-style license that can be |
| 4 // found in the LICENSE file. | 4 // found in the LICENSE file. |
| 5 // | 5 // |
| 6 // This file implements the Windows service controlling Me2Me host processes | 6 // This file implements the Windows service controlling Me2Me host processes |
| 7 // running within user sessions. | 7 // running within user sessions. |
| 8 | 8 |
| 9 #include "remoting/host/win/unprivileged_process_delegate.h" | 9 #include "remoting/host/win/unprivileged_process_delegate.h" |
| 10 | 10 |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 // Security descriptor of the worker process threads. It gives access SYSTEM | 67 // Security descriptor of the worker process threads. It gives access SYSTEM |
| 68 // full access to the threads. It gives READ_CONTROL, SYNCHRONIZE, | 68 // full access to the threads. It gives READ_CONTROL, SYNCHRONIZE, |
| 69 // THREAD_QUERY_INFORMATION and THREAD_TERMINATE rights to the built-in | 69 // THREAD_QUERY_INFORMATION and THREAD_TERMINATE rights to the built-in |
| 70 // administrators group. | 70 // administrators group. |
| 71 const char kWorkerThreadSd[] = "O:SYG:SYD:(A;;GA;;;SY)(A;;0x120801;;;BA)"; | 71 const char kWorkerThreadSd[] = "O:SYG:SYD:(A;;GA;;;SY)(A;;0x120801;;;BA)"; |
| 72 | 72 |
| 73 // Creates a token with limited access that will be used to run the worker | 73 // Creates a token with limited access that will be used to run the worker |
| 74 // process. | 74 // process. |
| 75 bool CreateRestrictedToken(ScopedHandle* token_out) { | 75 bool CreateRestrictedToken(ScopedHandle* token_out) { |
| 76 // Create a token representing LocalService account. | 76 // Create a token representing LocalService account. |
| 77 HANDLE temp_handle; | 77 ScopedHandle token; |
| 78 if (!LogonUser(L"LocalService", L"NT AUTHORITY", NULL, LOGON32_LOGON_SERVICE, | 78 if (!LogonUser(L"LocalService", L"NT AUTHORITY", NULL, LOGON32_LOGON_SERVICE, |
| 79 LOGON32_PROVIDER_DEFAULT, &temp_handle)) { | 79 LOGON32_PROVIDER_DEFAULT, token.Receive())) { |
| 80 return false; | 80 return false; |
| 81 } | 81 } |
| 82 ScopedHandle token(temp_handle); | |
| 83 | 82 |
| 84 sandbox::RestrictedToken restricted_token; | 83 sandbox::RestrictedToken restricted_token; |
| 85 if (restricted_token.Init(token) != ERROR_SUCCESS) | 84 if (restricted_token.Init(token) != ERROR_SUCCESS) |
| 86 return false; | 85 return false; |
| 87 | 86 |
| 88 // Remove all privileges in the token. | 87 // Remove all privileges in the token. |
| 89 if (restricted_token.DeleteAllPrivileges(NULL) != ERROR_SUCCESS) | 88 if (restricted_token.DeleteAllPrivileges(NULL) != ERROR_SUCCESS) |
| 90 return false; | 89 return false; |
| 91 | 90 |
| 92 // Set low integrity level if supported by the OS. | 91 // Set low integrity level if supported by the OS. |
| 93 if (base::win::GetVersion() >= base::win::VERSION_VISTA) { | 92 if (base::win::GetVersion() >= base::win::VERSION_VISTA) { |
| 94 if (restricted_token.SetIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW) | 93 if (restricted_token.SetIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW) |
| 95 != ERROR_SUCCESS) { | 94 != ERROR_SUCCESS) { |
| 96 return false; | 95 return false; |
| 97 } | 96 } |
| 98 } | 97 } |
| 99 | 98 |
| 100 // Return the resulting token. | 99 // Return the resulting token. |
| 101 if (restricted_token.GetRestrictedTokenHandle(&temp_handle) == | 100 return restricted_token.GetRestrictedTokenHandle(token_out->Receive()) == |
| 102 ERROR_SUCCESS) { | 101 ERROR_SUCCESS; |
| 103 token_out->Set(temp_handle); | |
| 104 return true; | |
| 105 } | |
| 106 return false; | |
| 107 } | 102 } |
| 108 | 103 |
| 109 // Creates a window station with a given name and the default desktop giving | 104 // Creates a window station with a given name and the default desktop giving |
| 110 // the complete access to |logon_sid|. | 105 // the complete access to |logon_sid|. |
| 111 bool CreateWindowStationAndDesktop(ScopedSid logon_sid, | 106 bool CreateWindowStationAndDesktop(ScopedSid logon_sid, |
| 112 WindowStationAndDesktop* handles_out) { | 107 WindowStationAndDesktop* handles_out) { |
| 113 // Convert the logon SID into a string. | 108 // Convert the logon SID into a string. |
| 114 std::string logon_sid_string = ConvertSidToString(logon_sid.get()); | 109 std::string logon_sid_string = ConvertSidToString(logon_sid.get()); |
| 115 if (logon_sid_string.empty()) { | 110 if (logon_sid_string.empty()) { |
| 116 LOG_GETLASTERROR(ERROR) << "Failed to convert a SID to string"; | 111 LOG_GETLASTERROR(ERROR) << "Failed to convert a SID to string"; |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 271 thread_attributes.lpSecurityDescriptor = thread_sd.get(); | 266 thread_attributes.lpSecurityDescriptor = thread_sd.get(); |
| 272 thread_attributes.bInheritHandle = FALSE; | 267 thread_attributes.bInheritHandle = FALSE; |
| 273 | 268 |
| 274 ScopedHandle worker_process; | 269 ScopedHandle worker_process; |
| 275 { | 270 { |
| 276 // Take a lock why any inheritable handles are open to make sure that only | 271 // Take a lock why any inheritable handles are open to make sure that only |
| 277 // one process inherits them. | 272 // one process inherits them. |
| 278 base::AutoLock lock(g_inherit_handles_lock.Get()); | 273 base::AutoLock lock(g_inherit_handles_lock.Get()); |
| 279 | 274 |
| 280 // Create a connected IPC channel. | 275 // Create a connected IPC channel. |
| 281 HANDLE temp_handle; | 276 ScopedHandle client; |
| 282 if (!CreateConnectedIpcChannel(io_task_runner_, this, &temp_handle, | 277 if (!CreateConnectedIpcChannel(io_task_runner_, this, client.Receive(), |
| 283 &server)) { | 278 &server)) { |
| 284 ReportFatalError(); | 279 ReportFatalError(); |
| 285 return; | 280 return; |
| 286 } | 281 } |
| 287 ScopedHandle client(temp_handle); | |
| 288 | 282 |
| 289 // Convert the handle value into a decimal integer. Handle values are 32bit | 283 // Convert the handle value into a decimal integer. Handle values are 32bit |
| 290 // even on 64bit platforms. | 284 // even on 64bit platforms. |
| 291 std::string pipe_handle = base::StringPrintf( | 285 std::string pipe_handle = base::StringPrintf( |
| 292 "%d", reinterpret_cast<ULONG_PTR>(client.Get())); | 286 "%d", reinterpret_cast<ULONG_PTR>(client.Get())); |
| 293 | 287 |
| 294 // Pass the IPC channel via the command line. | 288 // Pass the IPC channel via the command line. |
| 295 CommandLine command_line(target_command_->argv()); | 289 CommandLine command_line(target_command_->argv()); |
| 296 command_line.AppendSwitchASCII(kDaemonPipeSwitchName, pipe_handle); | 290 command_line.AppendSwitchASCII(kDaemonPipeSwitchName, pipe_handle); |
| 297 | 291 |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 396 base::win::ScopedHandle worker_process) { | 390 base::win::ScopedHandle worker_process) { |
| 397 DCHECK(CalledOnValidThread()); | 391 DCHECK(CalledOnValidThread()); |
| 398 DCHECK(!worker_process_.IsValid()); | 392 DCHECK(!worker_process_.IsValid()); |
| 399 | 393 |
| 400 worker_process_ = worker_process.Pass(); | 394 worker_process_ = worker_process.Pass(); |
| 401 | 395 |
| 402 // Report a handle that can be used to wait for the worker process completion, | 396 // Report a handle that can be used to wait for the worker process completion, |
| 403 // query information about the process and duplicate handles. | 397 // query information about the process and duplicate handles. |
| 404 DWORD desired_access = | 398 DWORD desired_access = |
| 405 SYNCHRONIZE | PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION; | 399 SYNCHRONIZE | PROCESS_DUP_HANDLE | PROCESS_QUERY_INFORMATION; |
| 406 HANDLE temp_handle; | 400 ScopedHandle limited_handle; |
| 407 if (!DuplicateHandle(GetCurrentProcess(), | 401 if (!DuplicateHandle(GetCurrentProcess(), |
| 408 worker_process_, | 402 worker_process_, |
| 409 GetCurrentProcess(), | 403 GetCurrentProcess(), |
| 410 &temp_handle, | 404 limited_handle.Receive(), |
| 411 desired_access, | 405 desired_access, |
| 412 FALSE, | 406 FALSE, |
| 413 0)) { | 407 0)) { |
| 414 LOG_GETLASTERROR(ERROR) << "Failed to duplicate a handle"; | 408 LOG_GETLASTERROR(ERROR) << "Failed to duplicate a handle"; |
| 415 ReportFatalError(); | 409 ReportFatalError(); |
| 416 return; | 410 return; |
| 417 } | 411 } |
| 418 ScopedHandle limited_handle(temp_handle); | |
| 419 | 412 |
| 420 event_handler_->OnProcessLaunched(limited_handle.Pass()); | 413 event_handler_->OnProcessLaunched(limited_handle.Pass()); |
| 421 } | 414 } |
| 422 | 415 |
| 423 } // namespace remoting | 416 } // namespace remoting |
| OLD | NEW |