OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/bpf_cros_arm_gpu_policy_linux.h" | 5 #include "content/common/sandbox_linux/bpf_cros_arm_gpu_policy_linux.h" |
6 | 6 |
7 #include <dlfcn.h> | 7 #include <dlfcn.h> |
8 #include <errno.h> | 8 #include <errno.h> |
9 #include <fcntl.h> | 9 #include <fcntl.h> |
10 #include <sys/socket.h> | 10 #include <sys/socket.h> |
11 #include <sys/stat.h> | 11 #include <sys/stat.h> |
12 #include <sys/types.h> | 12 #include <sys/types.h> |
13 #include <unistd.h> | 13 #include <unistd.h> |
14 | 14 |
15 #include <string> | 15 #include <string> |
16 #include <vector> | 16 #include <vector> |
17 | 17 |
18 #include "base/bind.h" | 18 #include "base/bind.h" |
19 #include "base/compiler_specific.h" | 19 #include "base/compiler_specific.h" |
20 #include "base/logging.h" | 20 #include "base/logging.h" |
21 #include "base/memory/scoped_ptr.h" | 21 #include "base/memory/scoped_ptr.h" |
22 #include "build/build_config.h" | 22 #include "build/build_config.h" |
23 #include "content/common/sandbox_linux/sandbox_bpf_base_policy_linux.h" | 23 #include "content/common/sandbox_linux/sandbox_bpf_base_policy_linux.h" |
24 #include "content/common/sandbox_linux/sandbox_seccomp_bpf_linux.h" | 24 #include "content/common/sandbox_linux/sandbox_seccomp_bpf_linux.h" |
25 #include "sandbox/linux/seccomp-bpf-helpers/syscall_sets.h" | 25 #include "sandbox/linux/seccomp-bpf-helpers/syscall_sets.h" |
26 #include "sandbox/linux/seccomp-bpf/sandbox_bpf.h" | 26 #include "sandbox/linux/seccomp-bpf/sandbox_bpf.h" |
27 #include "sandbox/linux/services/linux_syscalls.h" | 27 #include "sandbox/linux/services/linux_syscalls.h" |
28 | 28 |
29 using sandbox::ErrorCode; | 29 using namespace sandbox::bpf_dsl; |
30 using sandbox::SandboxBPF; | |
31 using sandbox::SyscallSets; | 30 using sandbox::SyscallSets; |
32 | 31 |
33 namespace content { | 32 namespace content { |
34 | 33 |
35 namespace { | 34 namespace { |
36 | 35 |
37 inline bool IsChromeOS() { | 36 inline bool IsChromeOS() { |
38 #if defined(OS_CHROMEOS) | 37 #if defined(OS_CHROMEOS) |
39 return true; | 38 return true; |
40 #else | 39 #else |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 AddArmMaliGpuWhitelist(read_whitelist, write_whitelist); | 91 AddArmMaliGpuWhitelist(read_whitelist, write_whitelist); |
93 } | 92 } |
94 | 93 |
95 class CrosArmGpuBrokerProcessPolicy : public CrosArmGpuProcessPolicy { | 94 class CrosArmGpuBrokerProcessPolicy : public CrosArmGpuProcessPolicy { |
96 public: | 95 public: |
97 static sandbox::SandboxBPFPolicy* Create() { | 96 static sandbox::SandboxBPFPolicy* Create() { |
98 return new CrosArmGpuBrokerProcessPolicy(); | 97 return new CrosArmGpuBrokerProcessPolicy(); |
99 } | 98 } |
100 virtual ~CrosArmGpuBrokerProcessPolicy() {} | 99 virtual ~CrosArmGpuBrokerProcessPolicy() {} |
101 | 100 |
102 virtual ErrorCode EvaluateSyscall(SandboxBPF* sandbox_compiler, | 101 virtual ResultExpr EvaluateSyscall(int system_call_number) const OVERRIDE; |
103 int system_call_number) const OVERRIDE; | |
104 | 102 |
105 private: | 103 private: |
106 CrosArmGpuBrokerProcessPolicy() : CrosArmGpuProcessPolicy(false) {} | 104 CrosArmGpuBrokerProcessPolicy() : CrosArmGpuProcessPolicy(false) {} |
107 DISALLOW_COPY_AND_ASSIGN(CrosArmGpuBrokerProcessPolicy); | 105 DISALLOW_COPY_AND_ASSIGN(CrosArmGpuBrokerProcessPolicy); |
108 }; | 106 }; |
109 | 107 |
110 // A GPU broker policy is the same as a GPU policy with open and | 108 // A GPU broker policy is the same as a GPU policy with open and |
111 // openat allowed. | 109 // openat allowed. |
112 ErrorCode CrosArmGpuBrokerProcessPolicy::EvaluateSyscall(SandboxBPF* sandbox, | 110 ResultExpr CrosArmGpuBrokerProcessPolicy::EvaluateSyscall(int sysno) const { |
113 int sysno) const { | |
114 switch (sysno) { | 111 switch (sysno) { |
115 case __NR_access: | 112 case __NR_access: |
116 case __NR_open: | 113 case __NR_open: |
117 case __NR_openat: | 114 case __NR_openat: |
118 return ErrorCode(ErrorCode::ERR_ALLOWED); | 115 return Allow(); |
119 default: | 116 default: |
120 return CrosArmGpuProcessPolicy::EvaluateSyscall(sandbox, sysno); | 117 return CrosArmGpuProcessPolicy::EvaluateSyscall(sysno); |
121 } | 118 } |
122 } | 119 } |
123 | 120 |
124 } // namespace | 121 } // namespace |
125 | 122 |
126 CrosArmGpuProcessPolicy::CrosArmGpuProcessPolicy(bool allow_shmat) | 123 CrosArmGpuProcessPolicy::CrosArmGpuProcessPolicy(bool allow_shmat) |
127 : allow_shmat_(allow_shmat) {} | 124 : allow_shmat_(allow_shmat) {} |
128 | 125 |
129 CrosArmGpuProcessPolicy::~CrosArmGpuProcessPolicy() {} | 126 CrosArmGpuProcessPolicy::~CrosArmGpuProcessPolicy() {} |
130 | 127 |
131 ErrorCode CrosArmGpuProcessPolicy::EvaluateSyscall(SandboxBPF* sandbox, | 128 ResultExpr CrosArmGpuProcessPolicy::EvaluateSyscall(int sysno) const { |
132 int sysno) const { | |
133 #if defined(__arm__) | 129 #if defined(__arm__) |
134 if (allow_shmat_ && sysno == __NR_shmat) | 130 if (allow_shmat_ && sysno == __NR_shmat) |
135 return ErrorCode(ErrorCode::ERR_ALLOWED); | 131 return Allow(); |
136 #endif // defined(__arm__) | 132 #endif // defined(__arm__) |
137 | 133 |
138 switch (sysno) { | 134 switch (sysno) { |
139 #if defined(__arm__) | 135 #if defined(__arm__) |
140 // ARM GPU sandbox is started earlier so we need to allow networking | 136 // ARM GPU sandbox is started earlier so we need to allow networking |
141 // in the sandbox. | 137 // in the sandbox. |
142 case __NR_connect: | 138 case __NR_connect: |
143 case __NR_getpeername: | 139 case __NR_getpeername: |
144 case __NR_getsockname: | 140 case __NR_getsockname: |
145 case __NR_sysinfo: | 141 case __NR_sysinfo: |
146 case __NR_uname: | 142 case __NR_uname: |
147 return ErrorCode(ErrorCode::ERR_ALLOWED); | 143 return Allow(); |
148 // Allow only AF_UNIX for |domain|. | 144 // Allow only AF_UNIX for |domain|. |
149 case __NR_socket: | 145 case __NR_socket: |
150 case __NR_socketpair: | 146 case __NR_socketpair: |
151 return sandbox->Cond(0, ErrorCode::TP_32BIT, | 147 return If(Arg<int>(0) == AF_UNIX).Then(Allow()).Else(Error(EPERM)); |
152 ErrorCode::OP_EQUAL, AF_UNIX, | |
153 ErrorCode(ErrorCode::ERR_ALLOWED), | |
154 ErrorCode(EPERM)); | |
155 #endif // defined(__arm__) | 148 #endif // defined(__arm__) |
156 default: | 149 default: |
157 if (SyscallSets::IsAdvancedScheduler(sysno)) | 150 if (SyscallSets::IsAdvancedScheduler(sysno)) |
158 return ErrorCode(ErrorCode::ERR_ALLOWED); | 151 return Allow(); |
159 | 152 |
160 // Default to the generic GPU policy. | 153 // Default to the generic GPU policy. |
161 return GpuProcessPolicy::EvaluateSyscall(sandbox, sysno); | 154 return GpuProcessPolicy::EvaluateSyscall(sysno); |
162 } | 155 } |
163 } | 156 } |
164 | 157 |
165 bool CrosArmGpuProcessPolicy::PreSandboxHook() { | 158 bool CrosArmGpuProcessPolicy::PreSandboxHook() { |
166 DCHECK(IsChromeOS() && IsArchitectureArm()); | 159 DCHECK(IsChromeOS() && IsArchitectureArm()); |
167 // Create a new broker process. | 160 // Create a new broker process. |
168 DCHECK(!broker_process()); | 161 DCHECK(!broker_process()); |
169 | 162 |
170 std::vector<std::string> read_whitelist_extra; | 163 std::vector<std::string> read_whitelist_extra; |
171 std::vector<std::string> write_whitelist_extra; | 164 std::vector<std::string> write_whitelist_extra; |
(...skipping 11 matching lines...) Expand all Loading... |
183 // Preload the Tegra V4L2 (video decode acceleration) library. | 176 // Preload the Tegra V4L2 (video decode acceleration) library. |
184 dlopen("/usr/lib/libtegrav4l2.so", dlopen_flag); | 177 dlopen("/usr/lib/libtegrav4l2.so", dlopen_flag); |
185 // Resetting errno since platform-specific libraries will fail on other | 178 // Resetting errno since platform-specific libraries will fail on other |
186 // platforms. | 179 // platforms. |
187 errno = 0; | 180 errno = 0; |
188 | 181 |
189 return true; | 182 return true; |
190 } | 183 } |
191 | 184 |
192 } // namespace content | 185 } // namespace content |
OLD | NEW |