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

Side by Side Diff: content/common/sandbox_linux/sandbox_seccomp_bpf_linux.cc

Issue 117803002: Make building seccomp-bpf a GYP condition (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Excludes files to be IDE friendly. Created 7 years 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 | Annotate | Revision Log
« no previous file with comments | « components/nacl/loader/nacl_sandbox_linux.cc ('k') | content/content_common.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/common/sandbox_linux/sandbox_seccomp_bpf_linux.h" 5 #include "content/common/sandbox_linux/sandbox_seccomp_bpf_linux.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <fcntl.h> 8 #include <fcntl.h>
9 #include <sys/socket.h> 9 #include <sys/socket.h>
10 #include <sys/stat.h> 10 #include <sys/stat.h>
11 #include <sys/stat.h> 11 #include <sys/stat.h>
12 #include <sys/types.h> 12 #include <sys/types.h>
13 #include <sys/types.h> 13 #include <sys/types.h>
14 14
15 #include "base/basictypes.h" 15 #include "base/basictypes.h"
16 #include "base/command_line.h" 16 #include "base/command_line.h"
17 #include "base/logging.h" 17 #include "base/logging.h"
18 #include "build/build_config.h" 18 #include "build/build_config.h"
19 #include "content/public/common/content_switches.h" 19 #include "content/public/common/content_switches.h"
20 #include "sandbox/linux/seccomp-bpf/sandbox_bpf_policy.h"
20 21
21 // These are the only architectures supported for now. 22 #if defined(USE_SECCOMP_BPF)
22 #if defined(__i386__) || defined(__x86_64__) || \
23 (defined(__arm__) && (defined(__thumb__) || defined(__ARM_EABI__)))
24 #define SECCOMP_BPF_SANDBOX
25 #endif
26 23
27 #if defined(SECCOMP_BPF_SANDBOX)
28 #include "base/posix/eintr_wrapper.h" 24 #include "base/posix/eintr_wrapper.h"
29 #include "content/common/sandbox_linux/bpf_cros_arm_gpu_policy_linux.h" 25 #include "content/common/sandbox_linux/bpf_cros_arm_gpu_policy_linux.h"
30 #include "content/common/sandbox_linux/bpf_gpu_policy_linux.h" 26 #include "content/common/sandbox_linux/bpf_gpu_policy_linux.h"
31 #include "content/common/sandbox_linux/bpf_ppapi_policy_linux.h" 27 #include "content/common/sandbox_linux/bpf_ppapi_policy_linux.h"
32 #include "content/common/sandbox_linux/bpf_renderer_policy_linux.h" 28 #include "content/common/sandbox_linux/bpf_renderer_policy_linux.h"
33 #include "content/common/sandbox_linux/sandbox_bpf_base_policy_linux.h" 29 #include "content/common/sandbox_linux/sandbox_bpf_base_policy_linux.h"
34 #include "content/common/sandbox_linux/sandbox_linux.h" 30 #include "content/common/sandbox_linux/sandbox_linux.h"
35 #include "sandbox/linux/seccomp-bpf-helpers/baseline_policy.h" 31 #include "sandbox/linux/seccomp-bpf-helpers/baseline_policy.h"
36 #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h" 32 #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h"
37 #include "sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h" 33 #include "sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h"
38 #include "sandbox/linux/seccomp-bpf-helpers/syscall_sets.h" 34 #include "sandbox/linux/seccomp-bpf-helpers/syscall_sets.h"
39 #include "sandbox/linux/seccomp-bpf/sandbox_bpf.h" 35 #include "sandbox/linux/seccomp-bpf/sandbox_bpf.h"
40 #include "sandbox/linux/seccomp-bpf/sandbox_bpf_policy.h"
41 #include "sandbox/linux/services/linux_syscalls.h" 36 #include "sandbox/linux/services/linux_syscalls.h"
42 37
43 using sandbox::BaselinePolicy; 38 using sandbox::BaselinePolicy;
44 using sandbox::SyscallSets; 39 using sandbox::SyscallSets;
45 40
41 #else
42
43 // Make sure that seccomp-bpf does not get disabled by mistake. Also make sure
44 // that we think twice about this when adding a new architecture.
45 #if !defined(ARCH_CPU_MIPS_FAMILY)
46 #error "Seccomp-bpf disabled on supported architecture!"
47 #endif // !defined(ARCH_CPU_MIPS_FAMILY)
48
49 #endif //
50
46 namespace content { 51 namespace content {
47 52
53 #if defined(USE_SECCOMP_BPF)
48 namespace { 54 namespace {
49 55
50 void StartSandboxWithPolicy(sandbox::SandboxBPFPolicy* policy); 56 void StartSandboxWithPolicy(sandbox::SandboxBPFPolicy* policy);
51 57
52 inline bool IsChromeOS() { 58 inline bool IsChromeOS() {
53 #if defined(OS_CHROMEOS) 59 #if defined(OS_CHROMEOS)
54 return true; 60 return true;
55 #else 61 #else
56 return false; 62 return false;
57 #endif 63 #endif
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 // Avoid -Wunused-function with no-op code. 213 // Avoid -Wunused-function with no-op code.
208 ignore_result(IsChromeOS); 214 ignore_result(IsChromeOS);
209 ignore_result(IsArchitectureArm); 215 ignore_result(IsArchitectureArm);
210 ignore_result(RunSandboxSanityChecks); 216 ignore_result(RunSandboxSanityChecks);
211 return false; 217 return false;
212 } 218 }
213 #endif // !defined(IN_NACL_HELPER) 219 #endif // !defined(IN_NACL_HELPER)
214 220
215 } // namespace 221 } // namespace
216 222
217 #endif // SECCOMP_BPF_SANDBOX 223 #endif // USE_SECCOMP_BPF
218 224
219 // Is seccomp BPF globally enabled? 225 // Is seccomp BPF globally enabled?
220 bool SandboxSeccompBPF::IsSeccompBPFDesired() { 226 bool SandboxSeccompBPF::IsSeccompBPFDesired() {
221 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 227 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
222 if (!command_line.HasSwitch(switches::kNoSandbox) && 228 if (!command_line.HasSwitch(switches::kNoSandbox) &&
223 !command_line.HasSwitch(switches::kDisableSeccompFilterSandbox)) { 229 !command_line.HasSwitch(switches::kDisableSeccompFilterSandbox)) {
224 return true; 230 return true;
225 } else { 231 } else {
226 return false; 232 return false;
227 } 233 }
228 } 234 }
229 235
230 bool SandboxSeccompBPF::ShouldEnableSeccompBPF( 236 bool SandboxSeccompBPF::ShouldEnableSeccompBPF(
231 const std::string& process_type) { 237 const std::string& process_type) {
232 #if defined(SECCOMP_BPF_SANDBOX) 238 #if defined(USE_SECCOMP_BPF)
233 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 239 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
234 if (process_type == switches::kGpuProcess) 240 if (process_type == switches::kGpuProcess)
235 return !command_line.HasSwitch(switches::kDisableGpuSandbox); 241 return !command_line.HasSwitch(switches::kDisableGpuSandbox);
236 242
237 return true; 243 return true;
238 #endif // SECCOMP_BPF_SANDBOX 244 #endif // USE_SECCOMP_BPF
239 return false; 245 return false;
240 } 246 }
241 247
242 bool SandboxSeccompBPF::SupportsSandbox() { 248 bool SandboxSeccompBPF::SupportsSandbox() {
243 #if defined(SECCOMP_BPF_SANDBOX) 249 #if defined(USE_SECCOMP_BPF)
244 // TODO(jln): pass the saved proc_fd_ from the LinuxSandbox singleton 250 // TODO(jln): pass the saved proc_fd_ from the LinuxSandbox singleton
245 // here. 251 // here.
246 SandboxBPF::SandboxStatus bpf_sandbox_status = 252 SandboxBPF::SandboxStatus bpf_sandbox_status =
247 SandboxBPF::SupportsSeccompSandbox(-1); 253 SandboxBPF::SupportsSeccompSandbox(-1);
248 // Kernel support is what we are interested in here. Other status 254 // Kernel support is what we are interested in here. Other status
249 // such as STATUS_UNAVAILABLE (has threads) still indicate kernel support. 255 // such as STATUS_UNAVAILABLE (has threads) still indicate kernel support.
250 // We make this a negative check, since if there is a bug, we would rather 256 // We make this a negative check, since if there is a bug, we would rather
251 // "fail closed" (expect a sandbox to be available and try to start it). 257 // "fail closed" (expect a sandbox to be available and try to start it).
252 if (bpf_sandbox_status != SandboxBPF::STATUS_UNSUPPORTED) { 258 if (bpf_sandbox_status != SandboxBPF::STATUS_UNSUPPORTED) {
253 return true; 259 return true;
254 } 260 }
255 #endif 261 #endif
256 return false; 262 return false;
257 } 263 }
258 264
259 bool SandboxSeccompBPF::StartSandbox(const std::string& process_type) { 265 bool SandboxSeccompBPF::StartSandbox(const std::string& process_type) {
260 #if defined(SECCOMP_BPF_SANDBOX) 266 #if defined(USE_SECCOMP_BPF)
261 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); 267 const CommandLine& command_line = *CommandLine::ForCurrentProcess();
262 268
263 if (IsSeccompBPFDesired() && // Global switches policy. 269 if (IsSeccompBPFDesired() && // Global switches policy.
264 ShouldEnableSeccompBPF(process_type) && // Process-specific policy. 270 ShouldEnableSeccompBPF(process_type) && // Process-specific policy.
265 SupportsSandbox()) { 271 SupportsSandbox()) {
266 // If the kernel supports the sandbox, and if the command line says we 272 // If the kernel supports the sandbox, and if the command line says we
267 // should enable it, enable it or die. 273 // should enable it, enable it or die.
268 bool started_sandbox = StartBPFSandbox(command_line, process_type); 274 bool started_sandbox = StartBPFSandbox(command_line, process_type);
269 CHECK(started_sandbox); 275 CHECK(started_sandbox);
270 return true; 276 return true;
271 } 277 }
272 #endif 278 #endif
273 return false; 279 return false;
274 } 280 }
275 281
276 bool SandboxSeccompBPF::StartSandboxWithExternalPolicy( 282 bool SandboxSeccompBPF::StartSandboxWithExternalPolicy(
277 scoped_ptr<sandbox::SandboxBPFPolicy> policy) { 283 scoped_ptr<sandbox::SandboxBPFPolicy> policy) {
278 #if defined(SECCOMP_BPF_SANDBOX) 284 #if defined(USE_SECCOMP_BPF)
279 if (IsSeccompBPFDesired() && SupportsSandbox()) { 285 if (IsSeccompBPFDesired() && SupportsSandbox()) {
280 CHECK(policy); 286 CHECK(policy);
281 StartSandboxWithPolicy(policy.release()); 287 StartSandboxWithPolicy(policy.release());
282 return true; 288 return true;
283 } 289 }
284 #endif // defined(SECCOMP_BPF_SANDBOX) 290 #endif // defined(USE_SECCOMP_BPF)
285 return false; 291 return false;
286 } 292 }
287 293
288 scoped_ptr<sandbox::SandboxBPFPolicy> 294 scoped_ptr<sandbox::SandboxBPFPolicy>
289 SandboxSeccompBPF::GetBaselinePolicy() { 295 SandboxSeccompBPF::GetBaselinePolicy() {
290 #if defined(SECCOMP_BPF_SANDBOX) 296 #if defined(USE_SECCOMP_BPF)
291 return scoped_ptr<sandbox::SandboxBPFPolicy>(new BaselinePolicy); 297 return scoped_ptr<sandbox::SandboxBPFPolicy>(new BaselinePolicy);
292 #else 298 #else
293 return scoped_ptr<sandbox::SandboxBPFPolicy>(); 299 return scoped_ptr<sandbox::SandboxBPFPolicy>();
294 #endif // defined(SECCOMP_BPF_SANDBOX) 300 #endif // defined(USE_SECCOMP_BPF)
295 } 301 }
296 302
297 } // namespace content 303 } // namespace content
OLDNEW
« no previous file with comments | « components/nacl/loader/nacl_sandbox_linux.cc ('k') | content/content_common.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698