| 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/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> |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 #include "content/common/sandbox_linux/bpf_renderer_policy_linux.h" | 28 #include "content/common/sandbox_linux/bpf_renderer_policy_linux.h" |
| 29 #include "content/common/sandbox_linux/sandbox_bpf_base_policy_linux.h" | 29 #include "content/common/sandbox_linux/sandbox_bpf_base_policy_linux.h" |
| 30 #include "content/common/sandbox_linux/sandbox_linux.h" | 30 #include "content/common/sandbox_linux/sandbox_linux.h" |
| 31 #include "sandbox/linux/seccomp-bpf-helpers/baseline_policy.h" | 31 #include "sandbox/linux/seccomp-bpf-helpers/baseline_policy.h" |
| 32 #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h" | 32 #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h" |
| 33 #include "sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h" | 33 #include "sandbox/linux/seccomp-bpf-helpers/syscall_parameters_restrictions.h" |
| 34 #include "sandbox/linux/seccomp-bpf-helpers/syscall_sets.h" | 34 #include "sandbox/linux/seccomp-bpf-helpers/syscall_sets.h" |
| 35 #include "sandbox/linux/seccomp-bpf/sandbox_bpf.h" | 35 #include "sandbox/linux/seccomp-bpf/sandbox_bpf.h" |
| 36 #include "sandbox/linux/services/linux_syscalls.h" | 36 #include "sandbox/linux/services/linux_syscalls.h" |
| 37 | 37 |
| 38 using namespace sandbox::bpf_dsl; |
| 38 using sandbox::BaselinePolicy; | 39 using sandbox::BaselinePolicy; |
| 39 using sandbox::SyscallSets; | 40 using sandbox::SyscallSets; |
| 40 | 41 |
| 41 #else | 42 #else |
| 42 | 43 |
| 43 // Make sure that seccomp-bpf does not get disabled by mistake. Also make sure | 44 // 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 // that we think twice about this when adding a new architecture. |
| 45 #if !defined(ARCH_CPU_MIPS_FAMILY) | 46 #if !defined(ARCH_CPU_MIPS_FAMILY) |
| 46 #error "Seccomp-bpf disabled on supported architecture!" | 47 #error "Seccomp-bpf disabled on supported architecture!" |
| 47 #endif // !defined(ARCH_CPU_MIPS_FAMILY) | 48 #endif // !defined(ARCH_CPU_MIPS_FAMILY) |
| (...skipping 21 matching lines...) Expand all Loading... |
| 69 #else | 70 #else |
| 70 return false; | 71 return false; |
| 71 #endif | 72 #endif |
| 72 } | 73 } |
| 73 | 74 |
| 74 class BlacklistDebugAndNumaPolicy : public SandboxBPFBasePolicy { | 75 class BlacklistDebugAndNumaPolicy : public SandboxBPFBasePolicy { |
| 75 public: | 76 public: |
| 76 BlacklistDebugAndNumaPolicy() {} | 77 BlacklistDebugAndNumaPolicy() {} |
| 77 virtual ~BlacklistDebugAndNumaPolicy() {} | 78 virtual ~BlacklistDebugAndNumaPolicy() {} |
| 78 | 79 |
| 79 virtual ErrorCode EvaluateSyscall(SandboxBPF* sandbox_compiler, | 80 virtual ResultExpr EvaluateSyscall(int system_call_number) const OVERRIDE; |
| 80 int system_call_number) const OVERRIDE; | |
| 81 | 81 |
| 82 private: | 82 private: |
| 83 DISALLOW_COPY_AND_ASSIGN(BlacklistDebugAndNumaPolicy); | 83 DISALLOW_COPY_AND_ASSIGN(BlacklistDebugAndNumaPolicy); |
| 84 }; | 84 }; |
| 85 | 85 |
| 86 ErrorCode BlacklistDebugAndNumaPolicy::EvaluateSyscall(SandboxBPF* sandbox, | 86 ResultExpr BlacklistDebugAndNumaPolicy::EvaluateSyscall(int sysno) const { |
| 87 int sysno) const { | |
| 88 if (!SandboxBPF::IsValidSyscallNumber(sysno)) { | |
| 89 // TODO(jln) we should not have to do that in a trivial policy. | |
| 90 return ErrorCode(ENOSYS); | |
| 91 } | |
| 92 if (SyscallSets::IsDebug(sysno) || SyscallSets::IsNuma(sysno)) | 87 if (SyscallSets::IsDebug(sysno) || SyscallSets::IsNuma(sysno)) |
| 93 return sandbox->Trap(sandbox::CrashSIGSYS_Handler, NULL); | 88 return Trap(sandbox::CrashSIGSYS_Handler, NULL); |
| 94 | 89 |
| 95 return ErrorCode(ErrorCode::ERR_ALLOWED); | 90 return Allow(); |
| 96 } | 91 } |
| 97 | 92 |
| 98 class AllowAllPolicy : public SandboxBPFBasePolicy { | 93 class AllowAllPolicy : public SandboxBPFBasePolicy { |
| 99 public: | 94 public: |
| 100 AllowAllPolicy() {} | 95 AllowAllPolicy() {} |
| 101 virtual ~AllowAllPolicy() {} | 96 virtual ~AllowAllPolicy() {} |
| 102 | 97 |
| 103 virtual ErrorCode EvaluateSyscall(SandboxBPF* sandbox_compiler, | 98 virtual ResultExpr EvaluateSyscall(int system_call_number) const OVERRIDE; |
| 104 int system_call_number) const OVERRIDE; | |
| 105 | 99 |
| 106 private: | 100 private: |
| 107 DISALLOW_COPY_AND_ASSIGN(AllowAllPolicy); | 101 DISALLOW_COPY_AND_ASSIGN(AllowAllPolicy); |
| 108 }; | 102 }; |
| 109 | 103 |
| 110 // Allow all syscalls. | 104 // Allow all syscalls. |
| 111 // This will still deny x32 or IA32 calls in 64 bits mode or | 105 // This will still deny x32 or IA32 calls in 64 bits mode or |
| 112 // 64 bits system calls in compatibility mode. | 106 // 64 bits system calls in compatibility mode. |
| 113 ErrorCode AllowAllPolicy::EvaluateSyscall(SandboxBPF*, int sysno) const { | 107 ResultExpr AllowAllPolicy::EvaluateSyscall(int sysno) const { |
| 114 if (!SandboxBPF::IsValidSyscallNumber(sysno)) { | 108 return Allow(); |
| 115 // TODO(jln) we should not have to do that in a trivial policy. | |
| 116 return ErrorCode(ENOSYS); | |
| 117 } else { | |
| 118 return ErrorCode(ErrorCode::ERR_ALLOWED); | |
| 119 } | |
| 120 } | 109 } |
| 121 | 110 |
| 122 // If a BPF policy is engaged for |process_type|, run a few sanity checks. | 111 // If a BPF policy is engaged for |process_type|, run a few sanity checks. |
| 123 void RunSandboxSanityChecks(const std::string& process_type) { | 112 void RunSandboxSanityChecks(const std::string& process_type) { |
| 124 if (process_type == switches::kRendererProcess || | 113 if (process_type == switches::kRendererProcess || |
| 125 process_type == switches::kWorkerProcess || | 114 process_type == switches::kWorkerProcess || |
| 126 process_type == switches::kGpuProcess || | 115 process_type == switches::kGpuProcess || |
| 127 process_type == switches::kPpapiPluginProcess) { | 116 process_type == switches::kPpapiPluginProcess) { |
| 128 int syscall_ret; | 117 int syscall_ret; |
| 129 errno = 0; | 118 errno = 0; |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 294 scoped_ptr<sandbox::SandboxBPFPolicy> | 283 scoped_ptr<sandbox::SandboxBPFPolicy> |
| 295 SandboxSeccompBPF::GetBaselinePolicy() { | 284 SandboxSeccompBPF::GetBaselinePolicy() { |
| 296 #if defined(USE_SECCOMP_BPF) | 285 #if defined(USE_SECCOMP_BPF) |
| 297 return scoped_ptr<sandbox::SandboxBPFPolicy>(new BaselinePolicy); | 286 return scoped_ptr<sandbox::SandboxBPFPolicy>(new BaselinePolicy); |
| 298 #else | 287 #else |
| 299 return scoped_ptr<sandbox::SandboxBPFPolicy>(); | 288 return scoped_ptr<sandbox::SandboxBPFPolicy>(); |
| 300 #endif // defined(USE_SECCOMP_BPF) | 289 #endif // defined(USE_SECCOMP_BPF) |
| 301 } | 290 } |
| 302 | 291 |
| 303 } // namespace content | 292 } // namespace content |
| OLD | NEW |