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 "content/browser/utility_process_host_impl.h" | 5 #include "content/browser/utility_process_host_impl.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/base_switches.h" | 9 #include "base/base_switches.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 #include "content/public/browser/browser_thread.h" | 30 #include "content/public/browser/browser_thread.h" |
31 #include "content/public/browser/content_browser_client.h" | 31 #include "content/public/browser/content_browser_client.h" |
32 #include "content/public/browser/utility_process_host_client.h" | 32 #include "content/public/browser/utility_process_host_client.h" |
33 #include "content/public/common/content_switches.h" | 33 #include "content/public/common/content_switches.h" |
34 #include "content/public/common/process_type.h" | 34 #include "content/public/common/process_type.h" |
35 #include "content/public/common/sandbox_type.h" | 35 #include "content/public/common/sandbox_type.h" |
36 #include "content/public/common/sandboxed_process_launcher_delegate.h" | 36 #include "content/public/common/sandboxed_process_launcher_delegate.h" |
37 #include "ipc/ipc_switches.h" | 37 #include "ipc/ipc_switches.h" |
38 #include "ui/base/ui_base_switches.h" | 38 #include "ui/base/ui_base_switches.h" |
39 | 39 |
40 #if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX) | |
41 #include "content/public/browser/zygote_handle_linux.h" | |
42 #endif // defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX) | |
43 | |
44 #if defined(OS_WIN) | 40 #if defined(OS_WIN) |
45 #include "sandbox/win/src/sandbox_policy.h" | 41 #include "sandbox/win/src/sandbox_policy.h" |
46 #include "sandbox/win/src/sandbox_types.h" | 42 #include "sandbox/win/src/sandbox_types.h" |
47 #endif | 43 #endif |
48 | 44 |
49 namespace content { | 45 namespace content { |
50 | 46 |
51 #if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX) | |
52 namespace { | |
53 ZygoteHandle g_utility_zygote; | |
54 } // namespace | |
55 #endif // defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX) | |
56 | |
57 // NOTE: changes to this class need to be reviewed by the security team. | 47 // NOTE: changes to this class need to be reviewed by the security team. |
58 class UtilitySandboxedProcessLauncherDelegate | 48 class UtilitySandboxedProcessLauncherDelegate |
59 : public SandboxedProcessLauncherDelegate { | 49 : public SandboxedProcessLauncherDelegate { |
60 public: | 50 public: |
61 UtilitySandboxedProcessLauncherDelegate(const base::FilePath& exposed_dir, | 51 UtilitySandboxedProcessLauncherDelegate(const base::FilePath& exposed_dir, |
62 bool launch_elevated, | 52 bool launch_elevated, |
63 bool no_sandbox, | 53 bool no_sandbox, |
64 const base::EnvironmentMap& env, | 54 const base::EnvironmentMap& env, |
65 ChildProcessHost* host) | 55 ChildProcessHost* host) |
66 : exposed_dir_(exposed_dir), | 56 : exposed_dir_(exposed_dir), |
67 #if defined(OS_WIN) | 57 #if defined(OS_WIN) |
68 launch_elevated_(launch_elevated) | 58 launch_elevated_(launch_elevated) |
69 #elif defined(OS_POSIX) | 59 #elif defined(OS_POSIX) |
70 env_(env), | 60 env_(env), |
71 #if !defined(OS_MACOSX) && !defined(OS_ANDROID) | |
72 no_sandbox_(no_sandbox), | 61 no_sandbox_(no_sandbox), |
73 #endif // !defined(OS_MACOSX) && !defined(OS_ANDROID) | |
74 ipc_fd_(host->TakeClientFileDescriptor()) | 62 ipc_fd_(host->TakeClientFileDescriptor()) |
75 #endif // OS_WIN | 63 #endif // OS_WIN |
76 {} | 64 {} |
77 | 65 |
78 ~UtilitySandboxedProcessLauncherDelegate() override {} | 66 ~UtilitySandboxedProcessLauncherDelegate() override {} |
79 | 67 |
80 #if defined(OS_WIN) | 68 #if defined(OS_WIN) |
81 bool ShouldLaunchElevated() override { return launch_elevated_; } | 69 bool ShouldLaunchElevated() override { return launch_elevated_; } |
82 | 70 |
83 bool PreSpawnTarget(sandbox::TargetPolicy* policy) override { | 71 bool PreSpawnTarget(sandbox::TargetPolicy* policy) override { |
84 if (exposed_dir_.empty()) | 72 if (exposed_dir_.empty()) |
85 return true; | 73 return true; |
86 | 74 |
87 sandbox::ResultCode result; | 75 sandbox::ResultCode result; |
88 result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES, | 76 result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES, |
89 sandbox::TargetPolicy::FILES_ALLOW_ANY, | 77 sandbox::TargetPolicy::FILES_ALLOW_ANY, |
90 exposed_dir_.value().c_str()); | 78 exposed_dir_.value().c_str()); |
91 if (result != sandbox::SBOX_ALL_OK) | 79 if (result != sandbox::SBOX_ALL_OK) |
92 return false; | 80 return false; |
93 | 81 |
94 base::FilePath exposed_files = exposed_dir_.AppendASCII("*"); | 82 base::FilePath exposed_files = exposed_dir_.AppendASCII("*"); |
95 result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES, | 83 result = policy->AddRule(sandbox::TargetPolicy::SUBSYS_FILES, |
96 sandbox::TargetPolicy::FILES_ALLOW_ANY, | 84 sandbox::TargetPolicy::FILES_ALLOW_ANY, |
97 exposed_files.value().c_str()); | 85 exposed_files.value().c_str()); |
98 return result == sandbox::SBOX_ALL_OK; | 86 return result == sandbox::SBOX_ALL_OK; |
99 } | 87 } |
100 | 88 |
101 #elif defined(OS_POSIX) | 89 #elif defined(OS_POSIX) |
102 | 90 |
103 #if !defined(OS_MACOSX) && !defined(OS_ANDROID) | 91 bool ShouldUseZygote() override { |
104 ZygoteHandle* GetZygote() override { | 92 return !no_sandbox_ && exposed_dir_.empty(); |
105 if (no_sandbox_ || !exposed_dir_.empty()) | |
106 return nullptr; | |
107 return &g_utility_zygote; | |
108 } | 93 } |
109 #endif // !defined(OS_MACOSX) && !defined(OS_ANDROID) | |
110 base::EnvironmentMap GetEnvironment() override { return env_; } | 94 base::EnvironmentMap GetEnvironment() override { return env_; } |
111 base::ScopedFD TakeIpcFd() override { return std::move(ipc_fd_); } | 95 base::ScopedFD TakeIpcFd() override { return std::move(ipc_fd_); } |
112 #endif // OS_WIN | 96 #endif // OS_WIN |
113 | 97 |
114 SandboxType GetSandboxType() override { | 98 SandboxType GetSandboxType() override { |
115 return SANDBOX_TYPE_UTILITY; | 99 return SANDBOX_TYPE_UTILITY; |
116 } | 100 } |
117 | 101 |
118 private: | 102 private: |
119 base::FilePath exposed_dir_; | 103 base::FilePath exposed_dir_; |
120 | 104 |
121 #if defined(OS_WIN) | 105 #if defined(OS_WIN) |
122 bool launch_elevated_; | 106 bool launch_elevated_; |
123 #elif defined(OS_POSIX) | 107 #elif defined(OS_POSIX) |
124 base::EnvironmentMap env_; | 108 base::EnvironmentMap env_; |
125 #if !defined(OS_MACOSX) && !defined(OS_ANDROID) | |
126 bool no_sandbox_; | 109 bool no_sandbox_; |
127 #endif // !defined(OS_MACOSX) && !defined(OS_ANDROID) | |
128 base::ScopedFD ipc_fd_; | 110 base::ScopedFD ipc_fd_; |
129 #endif // OS_WIN | 111 #endif // OS_WIN |
130 }; | 112 }; |
131 | 113 |
132 UtilityMainThreadFactoryFunction g_utility_main_thread_factory = NULL; | 114 UtilityMainThreadFactoryFunction g_utility_main_thread_factory = NULL; |
133 | 115 |
134 UtilityProcessHost* UtilityProcessHost::Create( | 116 UtilityProcessHost* UtilityProcessHost::Create( |
135 const scoped_refptr<UtilityProcessHostClient>& client, | 117 const scoped_refptr<UtilityProcessHostClient>& client, |
136 const scoped_refptr<base::SequencedTaskRunner>& client_task_runner) { | 118 const scoped_refptr<base::SequencedTaskRunner>& client_task_runner) { |
137 return new UtilityProcessHostImpl(client, client_task_runner); | 119 return new UtilityProcessHostImpl(client, client_task_runner); |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 ServiceRegistry* UtilityProcessHostImpl::GetServiceRegistry() { | 213 ServiceRegistry* UtilityProcessHostImpl::GetServiceRegistry() { |
232 if (mojo_application_host_) | 214 if (mojo_application_host_) |
233 return mojo_application_host_->service_registry(); | 215 return mojo_application_host_->service_registry(); |
234 return nullptr; | 216 return nullptr; |
235 } | 217 } |
236 | 218 |
237 void UtilityProcessHostImpl::SetName(const base::string16& name) { | 219 void UtilityProcessHostImpl::SetName(const base::string16& name) { |
238 name_ = name; | 220 name_ = name; |
239 } | 221 } |
240 | 222 |
241 #if defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX) | |
242 // static | |
243 void UtilityProcessHostImpl::EarlyZygoteLaunch() { | |
244 DCHECK(!g_utility_zygote); | |
245 g_utility_zygote = CreateZygote(); | |
246 } | |
247 #endif // defined(OS_POSIX) && !defined(OS_ANDROID) && !defined(OS_MACOSX) | |
248 | |
249 bool UtilityProcessHostImpl::StartProcess() { | 223 bool UtilityProcessHostImpl::StartProcess() { |
250 if (started_) | 224 if (started_) |
251 return true; | 225 return true; |
252 started_ = true; | 226 started_ = true; |
253 | 227 |
254 if (is_batch_mode_) | 228 if (is_batch_mode_) |
255 return true; | 229 return true; |
256 | 230 |
257 // Name must be set or metrics_service will crash in any test which | 231 // Name must be set or metrics_service will crash in any test which |
258 // launches a UtilityProcessHost. | 232 // launches a UtilityProcessHost. |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
397 if (RenderProcessHost::run_renderer_in_process()) | 371 if (RenderProcessHost::run_renderer_in_process()) |
398 handle = base::GetCurrentProcessHandle(); | 372 handle = base::GetCurrentProcessHandle(); |
399 else | 373 else |
400 handle = process_->GetData().handle; | 374 handle = process_->GetData().handle; |
401 | 375 |
402 mojo_application_host_->Activate(this, handle); | 376 mojo_application_host_->Activate(this, handle); |
403 } | 377 } |
404 } | 378 } |
405 | 379 |
406 } // namespace content | 380 } // namespace content |
OLD | NEW |