| 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 "sandbox/linux/seccomp-bpf/sandbox_bpf.h" | 5 #include "sandbox/linux/seccomp-bpf/sandbox_bpf.h" |
| 6 | 6 |
| 7 // Some headers on Android are missing cdefs: crbug.com/172337. | 7 // Some headers on Android are missing cdefs: crbug.com/172337. |
| 8 // (We can't use OS_ANDROID here since build_config.h is not included). | 8 // (We can't use OS_ANDROID here since build_config.h is not included). |
| 9 #if defined(ANDROID) | 9 #if defined(ANDROID) |
| 10 #include <sys/cdefs.h> | 10 #include <sys/cdefs.h> |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 } | 95 } |
| 96 #endif // !defined(NDEBUG) | 96 #endif // !defined(NDEBUG) |
| 97 | 97 |
| 98 // We define a really simple sandbox policy. It is just good enough for us | 98 // We define a really simple sandbox policy. It is just good enough for us |
| 99 // to tell that the sandbox has actually been activated. | 99 // to tell that the sandbox has actually been activated. |
| 100 class ProbePolicy : public SandboxBPFDSLPolicy { | 100 class ProbePolicy : public SandboxBPFDSLPolicy { |
| 101 public: | 101 public: |
| 102 ProbePolicy() {} | 102 ProbePolicy() {} |
| 103 virtual ~ProbePolicy() {} | 103 virtual ~ProbePolicy() {} |
| 104 | 104 |
| 105 virtual ResultExpr EvaluateSyscall(int sysnum) const OVERRIDE { | 105 virtual ResultExpr EvaluateSyscall(int sysnum) const override { |
| 106 switch (sysnum) { | 106 switch (sysnum) { |
| 107 case __NR_getpid: | 107 case __NR_getpid: |
| 108 // Return EPERM so that we can check that the filter actually ran. | 108 // Return EPERM so that we can check that the filter actually ran. |
| 109 return Error(EPERM); | 109 return Error(EPERM); |
| 110 case __NR_exit_group: | 110 case __NR_exit_group: |
| 111 // Allow exit() with a non-default return code. | 111 // Allow exit() with a non-default return code. |
| 112 return Allow(); | 112 return Allow(); |
| 113 default: | 113 default: |
| 114 // Make everything else fail in an easily recognizable way. | 114 // Make everything else fail in an easily recognizable way. |
| 115 return Error(EINVAL); | 115 return Error(EINVAL); |
| 116 } | 116 } |
| 117 } | 117 } |
| 118 | 118 |
| 119 private: | 119 private: |
| 120 DISALLOW_COPY_AND_ASSIGN(ProbePolicy); | 120 DISALLOW_COPY_AND_ASSIGN(ProbePolicy); |
| 121 }; | 121 }; |
| 122 | 122 |
| 123 void ProbeProcess(void) { | 123 void ProbeProcess(void) { |
| 124 if (syscall(__NR_getpid) < 0 && errno == EPERM) { | 124 if (syscall(__NR_getpid) < 0 && errno == EPERM) { |
| 125 syscall(__NR_exit_group, static_cast<intptr_t>(kExpectedExitCode)); | 125 syscall(__NR_exit_group, static_cast<intptr_t>(kExpectedExitCode)); |
| 126 } | 126 } |
| 127 } | 127 } |
| 128 | 128 |
| 129 class AllowAllPolicy : public SandboxBPFDSLPolicy { | 129 class AllowAllPolicy : public SandboxBPFDSLPolicy { |
| 130 public: | 130 public: |
| 131 AllowAllPolicy() {} | 131 AllowAllPolicy() {} |
| 132 virtual ~AllowAllPolicy() {} | 132 virtual ~AllowAllPolicy() {} |
| 133 | 133 |
| 134 virtual ResultExpr EvaluateSyscall(int sysnum) const OVERRIDE { | 134 virtual ResultExpr EvaluateSyscall(int sysnum) const override { |
| 135 DCHECK(SandboxBPF::IsValidSyscallNumber(sysnum)); | 135 DCHECK(SandboxBPF::IsValidSyscallNumber(sysnum)); |
| 136 return Allow(); | 136 return Allow(); |
| 137 } | 137 } |
| 138 | 138 |
| 139 private: | 139 private: |
| 140 DISALLOW_COPY_AND_ASSIGN(AllowAllPolicy); | 140 DISALLOW_COPY_AND_ASSIGN(AllowAllPolicy); |
| 141 }; | 141 }; |
| 142 | 142 |
| 143 void TryVsyscallProcess(void) { | 143 void TryVsyscallProcess(void) { |
| 144 time_t current_time; | 144 time_t current_time; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 // TODO(markus): document the code inside better. | 230 // TODO(markus): document the code inside better. |
| 231 class RedirectToUserSpacePolicyWrapper : public SandboxBPFPolicy { | 231 class RedirectToUserSpacePolicyWrapper : public SandboxBPFPolicy { |
| 232 public: | 232 public: |
| 233 explicit RedirectToUserSpacePolicyWrapper( | 233 explicit RedirectToUserSpacePolicyWrapper( |
| 234 const SandboxBPFPolicy* wrapped_policy) | 234 const SandboxBPFPolicy* wrapped_policy) |
| 235 : wrapped_policy_(wrapped_policy) { | 235 : wrapped_policy_(wrapped_policy) { |
| 236 DCHECK(wrapped_policy_); | 236 DCHECK(wrapped_policy_); |
| 237 } | 237 } |
| 238 | 238 |
| 239 virtual ErrorCode EvaluateSyscall(SandboxBPF* sandbox_compiler, | 239 virtual ErrorCode EvaluateSyscall(SandboxBPF* sandbox_compiler, |
| 240 int system_call_number) const OVERRIDE { | 240 int system_call_number) const override { |
| 241 ErrorCode err = | 241 ErrorCode err = |
| 242 wrapped_policy_->EvaluateSyscall(sandbox_compiler, system_call_number); | 242 wrapped_policy_->EvaluateSyscall(sandbox_compiler, system_call_number); |
| 243 ChangeErrnoToTraps(&err, sandbox_compiler); | 243 ChangeErrnoToTraps(&err, sandbox_compiler); |
| 244 return err; | 244 return err; |
| 245 } | 245 } |
| 246 | 246 |
| 247 virtual ErrorCode InvalidSyscall( | 247 virtual ErrorCode InvalidSyscall( |
| 248 SandboxBPF* sandbox_compiler) const OVERRIDE { | 248 SandboxBPF* sandbox_compiler) const override { |
| 249 return ReturnErrnoViaTrap(sandbox_compiler, ENOSYS); | 249 return ReturnErrnoViaTrap(sandbox_compiler, ENOSYS); |
| 250 } | 250 } |
| 251 | 251 |
| 252 private: | 252 private: |
| 253 ErrorCode ReturnErrnoViaTrap(SandboxBPF* sandbox_compiler, int err) const { | 253 ErrorCode ReturnErrnoViaTrap(SandboxBPF* sandbox_compiler, int err) const { |
| 254 return sandbox_compiler->Trap(ReturnErrno, reinterpret_cast<void*>(err)); | 254 return sandbox_compiler->Trap(ReturnErrno, reinterpret_cast<void*>(err)); |
| 255 } | 255 } |
| 256 | 256 |
| 257 // ChangeErrnoToTraps recursivly iterates through the ErrorCode | 257 // ChangeErrnoToTraps recursivly iterates through the ErrorCode |
| 258 // converting any ERRNO to a userspace trap | 258 // converting any ERRNO to a userspace trap |
| (...skipping 884 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1143 } | 1143 } |
| 1144 } | 1144 } |
| 1145 | 1145 |
| 1146 ErrorCode SandboxBPF::Kill(const char* msg) { | 1146 ErrorCode SandboxBPF::Kill(const char* msg) { |
| 1147 return Trap(BPFFailure, const_cast<char*>(msg)); | 1147 return Trap(BPFFailure, const_cast<char*>(msg)); |
| 1148 } | 1148 } |
| 1149 | 1149 |
| 1150 SandboxBPF::SandboxStatus SandboxBPF::status_ = STATUS_UNKNOWN; | 1150 SandboxBPF::SandboxStatus SandboxBPF::status_ = STATUS_UNKNOWN; |
| 1151 | 1151 |
| 1152 } // namespace sandbox | 1152 } // namespace sandbox |
| OLD | NEW |