Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(282)

Side by Side Diff: content/browser/child_process_launcher_helper_mac.cc

Issue 2931173003: Implement the V2 sandbox in the process launcher. (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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 "base/command_line.h"
6 #include "base/feature_list.h"
7 #include "base/files/file_util.h"
8 #include "base/mac/bundle_locations.h"
9 #include "base/mac/mac_util.h"
5 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
6 #include "base/path_service.h" 11 #include "base/path_service.h"
7 #include "base/posix/global_descriptors.h" 12 #include "base/posix/global_descriptors.h"
8 #include "content/browser/bootstrap_sandbox_manager_mac.h" 13 #include "content/browser/bootstrap_sandbox_manager_mac.h"
9 #include "content/browser/child_process_launcher.h" 14 #include "content/browser/child_process_launcher.h"
10 #include "content/browser/child_process_launcher_helper.h" 15 #include "content/browser/child_process_launcher_helper.h"
11 #include "content/browser/child_process_launcher_helper_posix.h" 16 #include "content/browser/child_process_launcher_helper_posix.h"
12 #include "content/browser/mach_broker_mac.h" 17 #include "content/browser/mach_broker_mac.h"
18 #include "content/common/sandbox_mac.h"
19 #include "content/grit/content_resources.h"
20 #include "content/public/browser/content_browser_client.h"
21 #include "content/public/common/content_client.h"
22 #include "content/public/common/content_paths.h"
23 #include "content/public/common/content_switches.h"
13 #include "content/public/common/result_codes.h" 24 #include "content/public/common/result_codes.h"
14 #include "content/public/common/sandboxed_process_launcher_delegate.h" 25 #include "content/public/common/sandboxed_process_launcher_delegate.h"
15 #include "mojo/edk/embedder/scoped_platform_handle.h" 26 #include "mojo/edk/embedder/scoped_platform_handle.h"
16 #include "sandbox/mac/bootstrap_sandbox.h" 27 #include "sandbox/mac/bootstrap_sandbox.h"
17 #include "sandbox/mac/pre_exec_delegate.h" 28 #include "sandbox/mac/pre_exec_delegate.h"
29 #include "sandbox/mac/seatbelt_exec.h"
30
31 #include <unistd.h>
18 32
19 namespace content { 33 namespace content {
20 namespace internal { 34 namespace internal {
21 35
22 mojo::edk::ScopedPlatformHandle 36 mojo::edk::ScopedPlatformHandle
23 ChildProcessLauncherHelper::PrepareMojoPipeHandlesOnClientThread() { 37 ChildProcessLauncherHelper::PrepareMojoPipeHandlesOnClientThread() {
24 DCHECK_CURRENTLY_ON(client_thread_id_); 38 DCHECK_CURRENTLY_ON(client_thread_id_);
25 return mojo::edk::ScopedPlatformHandle(); 39 return mojo::edk::ScopedPlatformHandle();
26 } 40 }
27 41
(...skipping 12 matching lines...) Expand all
40 54
41 void ChildProcessLauncherHelper::BeforeLaunchOnLauncherThread( 55 void ChildProcessLauncherHelper::BeforeLaunchOnLauncherThread(
42 const FileMappedForLaunch& files_to_register, 56 const FileMappedForLaunch& files_to_register,
43 base::LaunchOptions* options) { 57 base::LaunchOptions* options) {
44 // Convert FD mapping to FileHandleMappingVector. 58 // Convert FD mapping to FileHandleMappingVector.
45 std::unique_ptr<base::FileHandleMappingVector> fds_to_map = 59 std::unique_ptr<base::FileHandleMappingVector> fds_to_map =
46 files_to_register.GetMappingWithIDAdjustment( 60 files_to_register.GetMappingWithIDAdjustment(
47 base::GlobalDescriptors::kBaseDescriptor); 61 base::GlobalDescriptors::kBaseDescriptor);
48 62
49 options->environ = delegate_->GetEnvironment(); 63 options->environ = delegate_->GetEnvironment();
64
65 base::Feature kV2SandboxFeature{"V2SandboxFeature",
Robert Sesek 2017/06/12 21:13:54 This should go in content_features.cc/h and needs
Greg K 2017/06/13 18:27:21 Done.
66 base::FEATURE_DISABLED_BY_DEFAULT};
67 if (base::FeatureList::IsEnabled(kV2SandboxFeature) &&
68 GetProcessType() == std::string(switches::kRendererProcess)) {
69 base::StringPiece renderer_sb = GetContentClient()->GetDataResource(
70 IDR_RENDERER_SANDBOX_V2_PROFILE, ui::SCALE_FACTOR_NONE);
71
72 seatbelt_exec_client_ = base::MakeUnique<sandbox::SeatbeltExecClient>();
73
74 const base::CommandLine* command_line =
75 base::CommandLine::ForCurrentProcess();
76 bool enable_logging =
77 command_line->HasSwitch(switches::kEnableSandboxLogging);
78
79 CHECK(seatbelt_exec_client_->SetBooleanParameter(
80 Sandbox::kSandboxEnableLogging, enable_logging));
81 CHECK(seatbelt_exec_client_->SetBooleanParameter(
82 Sandbox::kSandboxDisableDenialLogging, !enable_logging));
83
84 std::string homedir =
85 Sandbox::GetCanonicalSandboxPath(base::GetHomeDir()).value();
86 CHECK(seatbelt_exec_client_->SetParameter(Sandbox::kSandboxHomedirAsLiteral,
87 homedir));
88
89 bool elcap_or_later = base::mac::IsAtLeastOS10_11();
90 CHECK(seatbelt_exec_client_->SetBooleanParameter(
91 Sandbox::kSandboxElCapOrLater, elcap_or_later));
92
93 std::string bundle_path =
94 Sandbox::GetCanonicalSandboxPath(base::mac::MainBundlePath()).value();
95 CHECK(seatbelt_exec_client_->SetParameter(Sandbox::kSandboxBundlePath,
96 bundle_path));
97
98 std::string bundle_id = base::mac::GetOuterBundleIdentifier();
99 CHECK(seatbelt_exec_client_->SetParameter(Sandbox::kSandboxChromeBundleId,
100 bundle_id));
101
102 CHECK(seatbelt_exec_client_->SetParameter(Sandbox::kSandboxChromePID,
103 std::to_string(getpid())));
104
105 std::string logging_path =
106 GetContentClient()->browser()->GetLoggingFileName().value();
107 CHECK(seatbelt_exec_client_->SetParameter(
108 Sandbox::kSandboxLoggingPathAsLiteral, logging_path));
109
110 #if defined(COMPONENT_BUILD)
111 // For component builds, allow access to one directory level higher, where
112 // the dylibs live.
113 base::FilePath bundle_path = base::mac::MainBundlePath();
114 base::FilePath component_path = bundle_path.Append("..");
115 std::string component_path_canonical =
116 Sandbox::GetCanonicalSandboxPath(component_path).value();
117 CHECK(seatbelt_exec_client_->SetParameter(Sandbox::kSandboxComponentPath,
118 component_path_canonical));
119 #endif
120
121 std::string profile = renderer_sb.as_string();
122 seatbelt_exec_client_->SetProfile(profile);
123
124 int pipe = seatbelt_exec_client_->SendProfileAndGetFD();
125 fds_to_map->push_back(std::make_pair(pipe, pipe));
126
127 base::FilePath helper_executable;
128 CHECK(PathService::Get(content::CHILD_PROCESS_EXE, &helper_executable));
129
130 base::CommandLine wrapper(helper_executable);
131
132 wrapper.AppendSwitch(switches::kEnableV2Sandbox);
133 wrapper.AppendArg("--fd_mapping=" + std::to_string(pipe));
134 // base::CommandLine::AppendArguments messes up the arguments.
135 for (size_t i = 1; i < command_line_->argv().size(); i++)
136 wrapper.AppendArg(command_line_->argv()[i]);
137 command_line_.reset(new base::CommandLine(wrapper));
138 }
139
50 // fds_to_remap will de deleted in AfterLaunchOnLauncherThread() below. 140 // fds_to_remap will de deleted in AfterLaunchOnLauncherThread() below.
51 options->fds_to_remap = fds_to_map.release(); 141 options->fds_to_remap = fds_to_map.release();
52 142
53 // Hold the MachBroker lock for the duration of LaunchProcess. The child will 143 // Hold the MachBroker lock for the duration of LaunchProcess. The child will
54 // send its task port to the parent almost immediately after startup. The Mach 144 // send its task port to the parent almost immediately after startup. The Mach
55 // message will be delivered to the parent, but updating the record of the 145 // message will be delivered to the parent, but updating the record of the
56 // launch will wait until after the placeholder PID is inserted below. This 146 // launch will wait until after the placeholder PID is inserted below. This
57 // ensures that while the child process may send its port to the parent prior 147 // ensures that while the child process may send its port to the parent prior
58 // to the parent leaving LaunchProcess, the order in which the record in 148 // to the parent leaving LaunchProcess, the order in which the record in
59 // MachBroker is updated is correct. 149 // MachBroker is updated is correct.
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 base::File OpenFileToShare(const base::FilePath& path, 254 base::File OpenFileToShare(const base::FilePath& path,
165 base::MemoryMappedFile::Region* region) { 255 base::MemoryMappedFile::Region* region) {
166 // Not used yet (until required files are described in the service manifest on 256 // Not used yet (until required files are described in the service manifest on
167 // Mac). 257 // Mac).
168 NOTREACHED(); 258 NOTREACHED();
169 return base::File(); 259 return base::File();
170 } 260 }
171 261
172 } // namespace internal 262 } // namespace internal
173 } // namespace content 263 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698