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 #ifndef SANDBOX_LINUX_SECCOMP_BPF_SANDBOX_BPF_H__ | 5 #ifndef SANDBOX_LINUX_SECCOMP_BPF_SANDBOX_BPF_H__ |
6 #define SANDBOX_LINUX_SECCOMP_BPF_SANDBOX_BPF_H__ | 6 #define SANDBOX_LINUX_SECCOMP_BPF_SANDBOX_BPF_H__ |
7 | 7 |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <sys/types.h> | 9 #include <sys/types.h> |
10 #include <sys/wait.h> | 10 #include <sys/wait.h> |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 // StartSandbox(), the program should indicate whether or not the sandbox | 58 // StartSandbox(), the program should indicate whether or not the sandbox |
59 // should try and engage with multi-thread support. | 59 // should try and engage with multi-thread support. |
60 enum SandboxThreadState { | 60 enum SandboxThreadState { |
61 PROCESS_INVALID, | 61 PROCESS_INVALID, |
62 PROCESS_SINGLE_THREADED, // The program is currently single-threaded. | 62 PROCESS_SINGLE_THREADED, // The program is currently single-threaded. |
63 // Note: PROCESS_MULTI_THREADED requires experimental kernel support that | 63 // Note: PROCESS_MULTI_THREADED requires experimental kernel support that |
64 // has not been contributed to upstream Linux. | 64 // has not been contributed to upstream Linux. |
65 PROCESS_MULTI_THREADED, // The program may be multi-threaded. | 65 PROCESS_MULTI_THREADED, // The program may be multi-threaded. |
66 }; | 66 }; |
67 | 67 |
68 // When calling setSandboxPolicy(), the caller can provide an arbitrary | |
69 // pointer in |aux|. This pointer will then be forwarded to the sandbox | |
70 // policy each time a call is made through an EvaluateSyscall function | |
71 // pointer. One common use case would be to pass the "aux" pointer as an | |
72 // argument to Trap() functions. | |
73 typedef ErrorCode (*EvaluateSyscall)(SandboxBPF* sandbox_compiler, | |
74 int system_call_number, | |
75 void* aux); | |
76 // A vector of BPF instructions that need to be installed as a filter | 68 // A vector of BPF instructions that need to be installed as a filter |
77 // program in the kernel. | 69 // program in the kernel. |
78 typedef std::vector<struct sock_filter> Program; | 70 typedef std::vector<struct sock_filter> Program; |
79 | 71 |
80 // Constructors and destructors. | 72 // Constructors and destructors. |
81 // NOTE: Setting a policy and starting the sandbox is a one-way operation. | 73 // NOTE: Setting a policy and starting the sandbox is a one-way operation. |
82 // The kernel does not provide any option for unloading a loaded | 74 // The kernel does not provide any option for unloading a loaded |
83 // sandbox. Strictly speaking, that means we should disallow calling | 75 // sandbox. Strictly speaking, that means we should disallow calling |
84 // the destructor, if StartSandbox() has ever been called. In practice, | 76 // the destructor, if StartSandbox() has ever been called. In practice, |
85 // this makes it needlessly complicated to operate on "Sandbox" | 77 // this makes it needlessly complicated to operate on "Sandbox" |
(...skipping 16 matching lines...) Expand all Loading... |
102 // provided by the caller. | 94 // provided by the caller. |
103 static SandboxStatus SupportsSeccompSandbox(int proc_fd); | 95 static SandboxStatus SupportsSeccompSandbox(int proc_fd); |
104 | 96 |
105 // The sandbox needs to be able to access files in "/proc/self". If this | 97 // The sandbox needs to be able to access files in "/proc/self". If this |
106 // directory is not accessible when "startSandbox()" gets called, the caller | 98 // directory is not accessible when "startSandbox()" gets called, the caller |
107 // can provide an already opened file descriptor by calling "set_proc_fd()". | 99 // can provide an already opened file descriptor by calling "set_proc_fd()". |
108 // The sandbox becomes the new owner of this file descriptor and will | 100 // The sandbox becomes the new owner of this file descriptor and will |
109 // eventually close it when "StartSandbox()" executes. | 101 // eventually close it when "StartSandbox()" executes. |
110 void set_proc_fd(int proc_fd); | 102 void set_proc_fd(int proc_fd); |
111 | 103 |
112 // The system call evaluator function is called with the system | |
113 // call number. It can decide to allow the system call unconditionally | |
114 // by returning ERR_ALLOWED; it can deny the system call unconditionally by | |
115 // returning an appropriate "errno" value; or it can request inspection | |
116 // of system call argument(s) by returning a suitable ErrorCode. | |
117 // The "aux" parameter can be used to pass optional data to the system call | |
118 // evaluator. There are different possible uses for this data, but one of the | |
119 // use cases would be for the policy to then forward this pointer to a Trap() | |
120 // handler. In this case, of course, the data that is pointed to must remain | |
121 // valid for the entire time that Trap() handlers can be called; typically, | |
122 // this would be the lifetime of the program. | |
123 // DEPRECATED: use the policy interface below. | |
124 void SetSandboxPolicyDeprecated(EvaluateSyscall syscallEvaluator, void* aux); | |
125 | |
126 // Set the BPF policy as |policy|. Ownership of |policy| is transfered here | 104 // Set the BPF policy as |policy|. Ownership of |policy| is transfered here |
127 // to the sandbox object. | 105 // to the sandbox object. |
128 void SetSandboxPolicy(SandboxBPFPolicy* policy); | 106 void SetSandboxPolicy(SandboxBPFPolicy* policy); |
129 | 107 |
130 // We can use ErrorCode to request calling of a trap handler. This method | 108 // We can use ErrorCode to request calling of a trap handler. This method |
131 // performs the required wrapping of the callback function into an | 109 // performs the required wrapping of the callback function into an |
132 // ErrorCode object. | 110 // ErrorCode object. |
133 // The "aux" field can carry a pointer to arbitrary data. See EvaluateSyscall | 111 // The "aux" field can carry a pointer to arbitrary data. See EvaluateSyscall |
134 // for a description of how to pass data from SetSandboxPolicy() to a Trap() | 112 // for a description of how to pass data from SetSandboxPolicy() to a Trap() |
135 // handler. | 113 // handler. |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 typedef std::map<uint32_t, ErrorCode> ErrMap; | 200 typedef std::map<uint32_t, ErrorCode> ErrMap; |
223 typedef std::set<ErrorCode, struct ErrorCode::LessThan> Conds; | 201 typedef std::set<ErrorCode, struct ErrorCode::LessThan> Conds; |
224 | 202 |
225 // Get a file descriptor pointing to "/proc", if currently available. | 203 // Get a file descriptor pointing to "/proc", if currently available. |
226 int proc_fd() { return proc_fd_; } | 204 int proc_fd() { return proc_fd_; } |
227 | 205 |
228 // Creates a subprocess and runs "code_in_sandbox" inside of the specified | 206 // Creates a subprocess and runs "code_in_sandbox" inside of the specified |
229 // policy. The caller has to make sure that "this" has not yet been | 207 // policy. The caller has to make sure that "this" has not yet been |
230 // initialized with any other policies. | 208 // initialized with any other policies. |
231 bool RunFunctionInPolicy(void (*code_in_sandbox)(), | 209 bool RunFunctionInPolicy(void (*code_in_sandbox)(), |
232 EvaluateSyscall syscall_evaluator, | 210 scoped_ptr<SandboxBPFPolicy> policy); |
233 void* aux); | |
234 | 211 |
235 // Performs a couple of sanity checks to verify that the kernel supports the | 212 // Performs a couple of sanity checks to verify that the kernel supports the |
236 // features that we need for successful sandboxing. | 213 // features that we need for successful sandboxing. |
237 // The caller has to make sure that "this" has not yet been initialized with | 214 // The caller has to make sure that "this" has not yet been initialized with |
238 // any other policies. | 215 // any other policies. |
239 bool KernelSupportSeccompBPF(); | 216 bool KernelSupportSeccompBPF(); |
240 | 217 |
241 // Verify that the current policy passes some basic sanity checks. | 218 // Verify that the current policy passes some basic sanity checks. |
242 void PolicySanityChecks(SandboxBPFPolicy* policy); | 219 void PolicySanityChecks(SandboxBPFPolicy* policy); |
243 | 220 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 scoped_ptr<const SandboxBPFPolicy> policy_; | 259 scoped_ptr<const SandboxBPFPolicy> policy_; |
283 Conds* conds_; | 260 Conds* conds_; |
284 bool sandbox_has_started_; | 261 bool sandbox_has_started_; |
285 | 262 |
286 DISALLOW_COPY_AND_ASSIGN(SandboxBPF); | 263 DISALLOW_COPY_AND_ASSIGN(SandboxBPF); |
287 }; | 264 }; |
288 | 265 |
289 } // namespace sandbox | 266 } // namespace sandbox |
290 | 267 |
291 #endif // SANDBOX_LINUX_SECCOMP_BPF_SANDBOX_BPF_H__ | 268 #endif // SANDBOX_LINUX_SECCOMP_BPF_SANDBOX_BPF_H__ |
OLD | NEW |