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

Side by Side Diff: sandbox/linux/bpf_dsl/bpf_dsl_more_unittest.cc

Issue 761903003: Update from https://crrev.com/306655 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 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
« no previous file with comments | « sandbox/linux/bpf_dsl/bpf_dsl_impl.h ('k') | sandbox/linux/bpf_dsl/bpf_dsl_unittest.cc » ('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 "sandbox/linux/bpf_dsl/bpf_dsl.h" 5 #include "sandbox/linux/bpf_dsl/bpf_dsl.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <fcntl.h> 8 #include <fcntl.h>
9 #include <pthread.h> 9 #include <pthread.h>
10 #include <sched.h> 10 #include <sched.h>
(...skipping 24 matching lines...) Expand all
35 #include "sandbox/linux/bpf_dsl/policy.h" 35 #include "sandbox/linux/bpf_dsl/policy.h"
36 #include "sandbox/linux/seccomp-bpf/bpf_tests.h" 36 #include "sandbox/linux/seccomp-bpf/bpf_tests.h"
37 #include "sandbox/linux/seccomp-bpf/die.h" 37 #include "sandbox/linux/seccomp-bpf/die.h"
38 #include "sandbox/linux/seccomp-bpf/errorcode.h" 38 #include "sandbox/linux/seccomp-bpf/errorcode.h"
39 #include "sandbox/linux/seccomp-bpf/linux_seccomp.h" 39 #include "sandbox/linux/seccomp-bpf/linux_seccomp.h"
40 #include "sandbox/linux/seccomp-bpf/sandbox_bpf.h" 40 #include "sandbox/linux/seccomp-bpf/sandbox_bpf.h"
41 #include "sandbox/linux/seccomp-bpf/syscall.h" 41 #include "sandbox/linux/seccomp-bpf/syscall.h"
42 #include "sandbox/linux/seccomp-bpf/trap.h" 42 #include "sandbox/linux/seccomp-bpf/trap.h"
43 #include "sandbox/linux/services/linux_syscalls.h" 43 #include "sandbox/linux/services/linux_syscalls.h"
44 #include "sandbox/linux/services/syscall_wrappers.h" 44 #include "sandbox/linux/services/syscall_wrappers.h"
45 #include "sandbox/linux/syscall_broker/broker_file_permission.h"
45 #include "sandbox/linux/syscall_broker/broker_process.h" 46 #include "sandbox/linux/syscall_broker/broker_process.h"
46 #include "sandbox/linux/tests/scoped_temporary_file.h" 47 #include "sandbox/linux/tests/scoped_temporary_file.h"
47 #include "sandbox/linux/tests/unit_tests.h" 48 #include "sandbox/linux/tests/unit_tests.h"
48 #include "testing/gtest/include/gtest/gtest.h" 49 #include "testing/gtest/include/gtest/gtest.h"
49 50
50 // Workaround for Android's prctl.h file. 51 // Workaround for Android's prctl.h file.
51 #ifndef PR_GET_ENDIAN 52 #ifndef PR_GET_ENDIAN
52 #define PR_GET_ENDIAN 19 53 #define PR_GET_ENDIAN 19
53 #endif 54 #endif
54 #ifndef PR_CAPBSET_READ 55 #ifndef PR_CAPBSET_READ
(...skipping 13 matching lines...) Expand all
68 void EnableUnsafeTraps() { 69 void EnableUnsafeTraps() {
69 // The use of UnsafeTrap() causes us to print a warning message. This is 70 // The use of UnsafeTrap() causes us to print a warning message. This is
70 // generally desirable, but it results in the unittest failing, as it doesn't 71 // generally desirable, but it results in the unittest failing, as it doesn't
71 // expect any messages on "stderr". So, temporarily disable messages. The 72 // expect any messages on "stderr". So, temporarily disable messages. The
72 // BPF_TEST() is guaranteed to turn messages back on, after the policy 73 // BPF_TEST() is guaranteed to turn messages back on, after the policy
73 // function has completed. 74 // function has completed.
74 setenv(kSandboxDebuggingEnv, "t", 0); 75 setenv(kSandboxDebuggingEnv, "t", 0);
75 Die::SuppressInfoMessages(true); 76 Die::SuppressInfoMessages(true);
76 } 77 }
77 78
78 // This test should execute no matter whether we have kernel support. So,
79 // we make it a TEST() instead of a BPF_TEST().
80 TEST(SandboxBPF, DISABLE_ON_TSAN(CallSupports)) {
81 // We check that we don't crash, but it's ok if the kernel doesn't
82 // support it.
83 bool seccomp_bpf_supported =
84 SandboxBPF::SupportsSeccompSandbox(-1) == SandboxBPF::STATUS_AVAILABLE;
85 // We want to log whether or not seccomp BPF is actually supported
86 // since actual test coverage depends on it.
87 RecordProperty("SeccompBPFSupported",
88 seccomp_bpf_supported ? "true." : "false.");
89 std::cout << "Seccomp BPF supported: "
90 << (seccomp_bpf_supported ? "true." : "false.") << "\n";
91 RecordProperty("PointerSize", sizeof(void*));
92 std::cout << "Pointer size: " << sizeof(void*) << "\n";
93 }
94
95 SANDBOX_TEST(SandboxBPF, DISABLE_ON_TSAN(CallSupportsTwice)) {
96 SandboxBPF::SupportsSeccompSandbox(-1);
97 SandboxBPF::SupportsSeccompSandbox(-1);
98 }
99
100 // BPF_TEST does a lot of the boiler-plate code around setting up a 79 // BPF_TEST does a lot of the boiler-plate code around setting up a
101 // policy and optional passing data between the caller, the policy and 80 // policy and optional passing data between the caller, the policy and
102 // any Trap() handlers. This is great for writing short and concise tests, 81 // any Trap() handlers. This is great for writing short and concise tests,
103 // and it helps us accidentally forgetting any of the crucial steps in 82 // and it helps us accidentally forgetting any of the crucial steps in
104 // setting up the sandbox. But it wouldn't hurt to have at least one test 83 // setting up the sandbox. But it wouldn't hurt to have at least one test
105 // that explicitly walks through all these steps. 84 // that explicitly walks through all these steps.
106 85
107 intptr_t IncreaseCounter(const struct arch_seccomp_data& args, void* aux) { 86 intptr_t IncreaseCounter(const struct arch_seccomp_data& args, void* aux) {
108 BPF_ASSERT(aux); 87 BPF_ASSERT(aux);
109 int* counter = static_cast<int*>(aux); 88 int* counter = static_cast<int*>(aux);
(...skipping 14 matching lines...) Expand all
124 return Allow(); 103 return Allow();
125 } 104 }
126 105
127 private: 106 private:
128 int* counter_ptr_; 107 int* counter_ptr_;
129 108
130 DISALLOW_COPY_AND_ASSIGN(VerboseAPITestingPolicy); 109 DISALLOW_COPY_AND_ASSIGN(VerboseAPITestingPolicy);
131 }; 110 };
132 111
133 SANDBOX_TEST(SandboxBPF, DISABLE_ON_TSAN(VerboseAPITesting)) { 112 SANDBOX_TEST(SandboxBPF, DISABLE_ON_TSAN(VerboseAPITesting)) {
134 if (SandboxBPF::SupportsSeccompSandbox(-1) == 113 if (SandboxBPF::SupportsSeccompSandbox(
135 sandbox::SandboxBPF::STATUS_AVAILABLE) { 114 SandboxBPF::SeccompLevel::SINGLE_THREADED)) {
136 static int counter = 0; 115 static int counter = 0;
137 116
138 SandboxBPF sandbox; 117 SandboxBPF sandbox(new VerboseAPITestingPolicy(&counter));
139 sandbox.SetSandboxPolicy(new VerboseAPITestingPolicy(&counter)); 118 BPF_ASSERT(sandbox.StartSandbox(SandboxBPF::SeccompLevel::SINGLE_THREADED));
140 BPF_ASSERT(sandbox.StartSandbox(SandboxBPF::PROCESS_SINGLE_THREADED));
141 119
142 BPF_ASSERT_EQ(0, counter); 120 BPF_ASSERT_EQ(0, counter);
143 BPF_ASSERT_EQ(0, syscall(__NR_uname, 0)); 121 BPF_ASSERT_EQ(0, syscall(__NR_uname, 0));
144 BPF_ASSERT_EQ(1, counter); 122 BPF_ASSERT_EQ(1, counter);
145 BPF_ASSERT_EQ(1, syscall(__NR_uname, 0)); 123 BPF_ASSERT_EQ(1, syscall(__NR_uname, 0));
146 BPF_ASSERT_EQ(2, counter); 124 BPF_ASSERT_EQ(2, counter);
147 } 125 }
148 } 126 }
149 127
150 // A simple blacklist test 128 // A simple blacklist test
(...skipping 21 matching lines...) Expand all
172 } 150 }
173 151
174 private: 152 private:
175 DISALLOW_COPY_AND_ASSIGN(BlacklistNanosleepPolicy); 153 DISALLOW_COPY_AND_ASSIGN(BlacklistNanosleepPolicy);
176 }; 154 };
177 155
178 BPF_TEST_C(SandboxBPF, ApplyBasicBlacklistPolicy, BlacklistNanosleepPolicy) { 156 BPF_TEST_C(SandboxBPF, ApplyBasicBlacklistPolicy, BlacklistNanosleepPolicy) {
179 BlacklistNanosleepPolicy::AssertNanosleepFails(); 157 BlacklistNanosleepPolicy::AssertNanosleepFails();
180 } 158 }
181 159
160 BPF_TEST_C(SandboxBPF, UseVsyscall, BlacklistNanosleepPolicy) {
161 time_t current_time;
162 // time() is implemented as a vsyscall. With an older glibc, with
163 // vsyscall=emulate and some versions of the seccomp BPF patch
164 // we may get SIGKILL-ed. Detect this!
165 BPF_ASSERT_NE(static_cast<time_t>(-1), time(&current_time));
166 }
167
182 // Now do a simple whitelist test 168 // Now do a simple whitelist test
183 169
184 class WhitelistGetpidPolicy : public Policy { 170 class WhitelistGetpidPolicy : public Policy {
185 public: 171 public:
186 WhitelistGetpidPolicy() {} 172 WhitelistGetpidPolicy() {}
187 ~WhitelistGetpidPolicy() override {} 173 ~WhitelistGetpidPolicy() override {}
188 174
189 ResultExpr EvaluateSyscall(int sysno) const override { 175 ResultExpr EvaluateSyscall(int sysno) const override {
190 DCHECK(SandboxBPF::IsValidSyscallNumber(sysno)); 176 DCHECK(SandboxBPF::IsValidSyscallNumber(sysno));
191 switch (sysno) { 177 switch (sysno) {
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 BPF_TEST_C(SandboxBPF, StackingPolicy, StackingPolicyPartOne) { 375 BPF_TEST_C(SandboxBPF, StackingPolicy, StackingPolicyPartOne) {
390 errno = 0; 376 errno = 0;
391 BPF_ASSERT(syscall(__NR_getppid, 0) > 0); 377 BPF_ASSERT(syscall(__NR_getppid, 0) > 0);
392 BPF_ASSERT(errno == 0); 378 BPF_ASSERT(errno == 0);
393 379
394 BPF_ASSERT(syscall(__NR_getppid, 1) == -1); 380 BPF_ASSERT(syscall(__NR_getppid, 1) == -1);
395 BPF_ASSERT(errno == EPERM); 381 BPF_ASSERT(errno == EPERM);
396 382
397 // Stack a second sandbox with its own policy. Verify that we can further 383 // Stack a second sandbox with its own policy. Verify that we can further
398 // restrict filters, but we cannot relax existing filters. 384 // restrict filters, but we cannot relax existing filters.
399 SandboxBPF sandbox; 385 SandboxBPF sandbox(new StackingPolicyPartTwo());
400 sandbox.SetSandboxPolicy(new StackingPolicyPartTwo()); 386 BPF_ASSERT(sandbox.StartSandbox(SandboxBPF::SeccompLevel::SINGLE_THREADED));
401 BPF_ASSERT(sandbox.StartSandbox(SandboxBPF::PROCESS_SINGLE_THREADED));
402 387
403 errno = 0; 388 errno = 0;
404 BPF_ASSERT(syscall(__NR_getppid, 0) == -1); 389 BPF_ASSERT(syscall(__NR_getppid, 0) == -1);
405 BPF_ASSERT(errno == EINVAL); 390 BPF_ASSERT(errno == EINVAL);
406 391
407 BPF_ASSERT(syscall(__NR_getppid, 1) == -1); 392 BPF_ASSERT(syscall(__NR_getppid, 1) == -1);
408 BPF_ASSERT(errno == EPERM); 393 BPF_ASSERT(errno == EPERM);
409 } 394 }
410 395
411 // A more complex, but synthetic policy. This tests the correctness of the BPF 396 // A more complex, but synthetic policy. This tests the correctness of the BPF
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after
749 734
750 bool NoOpCallback() { 735 bool NoOpCallback() {
751 return true; 736 return true;
752 } 737 }
753 738
754 // Test a trap handler that makes use of a broker process to open(). 739 // Test a trap handler that makes use of a broker process to open().
755 740
756 class InitializedOpenBroker { 741 class InitializedOpenBroker {
757 public: 742 public:
758 InitializedOpenBroker() : initialized_(false) { 743 InitializedOpenBroker() : initialized_(false) {
759 std::vector<std::string> allowed_files; 744 std::vector<syscall_broker::BrokerFilePermission> permissions;
760 allowed_files.push_back("/proc/allowed"); 745 permissions.push_back(
761 allowed_files.push_back("/proc/cpuinfo"); 746 syscall_broker::BrokerFilePermission::ReadOnly("/proc/allowed"));
747 permissions.push_back(
748 syscall_broker::BrokerFilePermission::ReadOnly("/proc/cpuinfo"));
762 749
763 broker_process_.reset(new syscall_broker::BrokerProcess( 750 broker_process_.reset(
764 EPERM, allowed_files, std::vector<std::string>())); 751 new syscall_broker::BrokerProcess(EPERM, permissions));
765 BPF_ASSERT(broker_process() != NULL); 752 BPF_ASSERT(broker_process() != NULL);
766 BPF_ASSERT(broker_process_->Init(base::Bind(&NoOpCallback))); 753 BPF_ASSERT(broker_process_->Init(base::Bind(&NoOpCallback)));
767 754
768 initialized_ = true; 755 initialized_ = true;
769 } 756 }
770 bool initialized() { return initialized_; } 757 bool initialized() { return initialized_; }
771 class syscall_broker::BrokerProcess* broker_process() { 758 class syscall_broker::BrokerProcess* broker_process() {
772 return broker_process_.get(); 759 return broker_process_.get();
773 } 760 }
774 761
(...skipping 1287 matching lines...) Expand 10 before | Expand all | Expand 10 after
2062 2049
2063 ResultExpr EvaluateSyscall(int system_call_number) const override { 2050 ResultExpr EvaluateSyscall(int system_call_number) const override {
2064 return Trace(kTraceData); 2051 return Trace(kTraceData);
2065 } 2052 }
2066 2053
2067 private: 2054 private:
2068 DISALLOW_COPY_AND_ASSIGN(TraceAllPolicy); 2055 DISALLOW_COPY_AND_ASSIGN(TraceAllPolicy);
2069 }; 2056 };
2070 2057
2071 SANDBOX_TEST(SandboxBPF, DISABLE_ON_TSAN(SeccompRetTrace)) { 2058 SANDBOX_TEST(SandboxBPF, DISABLE_ON_TSAN(SeccompRetTrace)) {
2072 if (SandboxBPF::SupportsSeccompSandbox(-1) != 2059 if (!SandboxBPF::SupportsSeccompSandbox(
2073 sandbox::SandboxBPF::STATUS_AVAILABLE) { 2060 SandboxBPF::SeccompLevel::SINGLE_THREADED)) {
2074 return; 2061 return;
2075 } 2062 }
2076 2063
2077 // This test is disabled on arm due to a kernel bug. 2064 // This test is disabled on arm due to a kernel bug.
2078 // See https://code.google.com/p/chromium/issues/detail?id=383977 2065 // See https://code.google.com/p/chromium/issues/detail?id=383977
2079 #if defined(__arm__) || defined(__aarch64__) 2066 #if defined(__arm__) || defined(__aarch64__)
2080 printf("This test is currently disabled on ARM32/64 due to a kernel bug."); 2067 printf("This test is currently disabled on ARM32/64 due to a kernel bug.");
2081 return; 2068 return;
2082 #endif 2069 #endif
2083 2070
2084 #if defined(__mips__) 2071 #if defined(__mips__)
2085 // TODO: Figure out how to support specificity of handling indirect syscalls 2072 // TODO: Figure out how to support specificity of handling indirect syscalls
2086 // in this test and enable it. 2073 // in this test and enable it.
2087 printf("This test is currently disabled on MIPS."); 2074 printf("This test is currently disabled on MIPS.");
2088 return; 2075 return;
2089 #endif 2076 #endif
2090 2077
2091 pid_t pid = fork(); 2078 pid_t pid = fork();
2092 BPF_ASSERT_NE(-1, pid); 2079 BPF_ASSERT_NE(-1, pid);
2093 if (pid == 0) { 2080 if (pid == 0) {
2094 pid_t my_pid = getpid(); 2081 pid_t my_pid = getpid();
2095 BPF_ASSERT_NE(-1, ptrace(PTRACE_TRACEME, -1, NULL, NULL)); 2082 BPF_ASSERT_NE(-1, ptrace(PTRACE_TRACEME, -1, NULL, NULL));
2096 BPF_ASSERT_EQ(0, raise(SIGSTOP)); 2083 BPF_ASSERT_EQ(0, raise(SIGSTOP));
2097 SandboxBPF sandbox; 2084 SandboxBPF sandbox(new TraceAllPolicy);
2098 sandbox.SetSandboxPolicy(new TraceAllPolicy); 2085 BPF_ASSERT(sandbox.StartSandbox(SandboxBPF::SeccompLevel::SINGLE_THREADED));
2099 BPF_ASSERT(sandbox.StartSandbox(SandboxBPF::PROCESS_SINGLE_THREADED));
2100 2086
2101 // getpid is allowed. 2087 // getpid is allowed.
2102 BPF_ASSERT_EQ(my_pid, sys_getpid()); 2088 BPF_ASSERT_EQ(my_pid, sys_getpid());
2103 2089
2104 // write to stdout is skipped and returns a fake value. 2090 // write to stdout is skipped and returns a fake value.
2105 BPF_ASSERT_EQ(kExpectedReturnValue, 2091 BPF_ASSERT_EQ(kExpectedReturnValue,
2106 syscall(__NR_write, STDOUT_FILENO, "A", 1)); 2092 syscall(__NR_write, STDOUT_FILENO, "A", 1));
2107 2093
2108 // kill is rewritten to exit(kExpectedReturnValue). 2094 // kill is rewritten to exit(kExpectedReturnValue).
2109 syscall(__NR_kill, my_pid, SIGKILL); 2095 syscall(__NR_kill, my_pid, SIGKILL);
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
2260 } 2246 }
2261 2247
2262 BPF_ASSERT(event->IsSignaled()); 2248 BPF_ASSERT(event->IsSignaled());
2263 2249
2264 BlacklistNanosleepPolicy::AssertNanosleepFails(); 2250 BlacklistNanosleepPolicy::AssertNanosleepFails();
2265 2251
2266 return NULL; 2252 return NULL;
2267 } 2253 }
2268 2254
2269 SANDBOX_TEST(SandboxBPF, Tsync) { 2255 SANDBOX_TEST(SandboxBPF, Tsync) {
2270 if (SandboxBPF::SupportsSeccompThreadFilterSynchronization() != 2256 if (!(SandboxBPF::SupportsSeccompSandbox(
2271 SandboxBPF::STATUS_AVAILABLE) { 2257 SandboxBPF::SeccompLevel::MULTI_THREADED))) {
2272 return; 2258 return;
2273 } 2259 }
2274 2260
2275 base::WaitableEvent event(true, false); 2261 base::WaitableEvent event(true, false);
2276 2262
2277 // Create a thread on which to invoke the blocked syscall. 2263 // Create a thread on which to invoke the blocked syscall.
2278 pthread_t thread; 2264 pthread_t thread;
2279 BPF_ASSERT_EQ( 2265 BPF_ASSERT_EQ(
2280 0, pthread_create(&thread, NULL, &TsyncApplyToTwoThreadsFunc, &event)); 2266 0, pthread_create(&thread, NULL, &TsyncApplyToTwoThreadsFunc, &event));
2281 2267
2282 // Test that nanoseelp success. 2268 // Test that nanoseelp success.
2283 const struct timespec ts = {0, 0}; 2269 const struct timespec ts = {0, 0};
2284 BPF_ASSERT_EQ(0, HANDLE_EINTR(syscall(__NR_nanosleep, &ts, NULL))); 2270 BPF_ASSERT_EQ(0, HANDLE_EINTR(syscall(__NR_nanosleep, &ts, NULL)));
2285 2271
2286 // Engage the sandbox. 2272 // Engage the sandbox.
2287 SandboxBPF sandbox; 2273 SandboxBPF sandbox(new BlacklistNanosleepPolicy());
2288 sandbox.SetSandboxPolicy(new BlacklistNanosleepPolicy()); 2274 BPF_ASSERT(sandbox.StartSandbox(SandboxBPF::SeccompLevel::MULTI_THREADED));
2289 BPF_ASSERT(sandbox.StartSandbox(SandboxBPF::PROCESS_MULTI_THREADED));
2290 2275
2291 // This thread should have the filter applied as well. 2276 // This thread should have the filter applied as well.
2292 BlacklistNanosleepPolicy::AssertNanosleepFails(); 2277 BlacklistNanosleepPolicy::AssertNanosleepFails();
2293 2278
2294 // Signal the condition to invoke the system call. 2279 // Signal the condition to invoke the system call.
2295 event.Signal(); 2280 event.Signal();
2296 2281
2297 // Wait for the thread to finish. 2282 // Wait for the thread to finish.
2298 BPF_ASSERT_EQ(0, pthread_join(thread, NULL)); 2283 BPF_ASSERT_EQ(0, pthread_join(thread, NULL));
2299 } 2284 }
2300 2285
2301 class AllowAllPolicy : public Policy { 2286 class AllowAllPolicy : public Policy {
2302 public: 2287 public:
2303 AllowAllPolicy() {} 2288 AllowAllPolicy() {}
2304 ~AllowAllPolicy() override {} 2289 ~AllowAllPolicy() override {}
2305 2290
2306 ResultExpr EvaluateSyscall(int sysno) const override { return Allow(); } 2291 ResultExpr EvaluateSyscall(int sysno) const override { return Allow(); }
2307 2292
2308 private: 2293 private:
2309 DISALLOW_COPY_AND_ASSIGN(AllowAllPolicy); 2294 DISALLOW_COPY_AND_ASSIGN(AllowAllPolicy);
2310 }; 2295 };
2311 2296
2312 SANDBOX_DEATH_TEST( 2297 SANDBOX_DEATH_TEST(
2313 SandboxBPF, 2298 SandboxBPF,
2314 StartMultiThreadedAsSingleThreaded, 2299 StartMultiThreadedAsSingleThreaded,
2315 DEATH_MESSAGE("Cannot start sandbox; process is already multi-threaded")) { 2300 DEATH_MESSAGE("Cannot start sandbox; process is already multi-threaded")) {
2316 base::Thread thread("sandbox.linux.StartMultiThreadedAsSingleThreaded"); 2301 base::Thread thread("sandbox.linux.StartMultiThreadedAsSingleThreaded");
2317 BPF_ASSERT(thread.Start()); 2302 BPF_ASSERT(thread.Start());
2318 2303
2319 SandboxBPF sandbox; 2304 SandboxBPF sandbox(new AllowAllPolicy());
2320 sandbox.SetSandboxPolicy(new AllowAllPolicy()); 2305 BPF_ASSERT(!sandbox.StartSandbox(SandboxBPF::SeccompLevel::SINGLE_THREADED));
2321 BPF_ASSERT(!sandbox.StartSandbox(SandboxBPF::PROCESS_SINGLE_THREADED));
2322 } 2306 }
2323 2307
2324 // http://crbug.com/407357 2308 // http://crbug.com/407357
2325 #if !defined(THREAD_SANITIZER) 2309 #if !defined(THREAD_SANITIZER)
2326 SANDBOX_DEATH_TEST( 2310 SANDBOX_DEATH_TEST(
2327 SandboxBPF, 2311 SandboxBPF,
2328 StartSingleThreadedAsMultiThreaded, 2312 StartSingleThreadedAsMultiThreaded,
2329 DEATH_MESSAGE( 2313 DEATH_MESSAGE(
2330 "Cannot start sandbox; process may be single-threaded when " 2314 "Cannot start sandbox; process may be single-threaded when "
2331 "reported as not")) { 2315 "reported as not")) {
2332 SandboxBPF sandbox; 2316 SandboxBPF sandbox(new AllowAllPolicy());
2333 sandbox.SetSandboxPolicy(new AllowAllPolicy()); 2317 BPF_ASSERT(!sandbox.StartSandbox(SandboxBPF::SeccompLevel::MULTI_THREADED));
2334 BPF_ASSERT(!sandbox.StartSandbox(SandboxBPF::PROCESS_MULTI_THREADED));
2335 } 2318 }
2336 #endif // !defined(THREAD_SANITIZER) 2319 #endif // !defined(THREAD_SANITIZER)
2337 2320
2338 // A stub handler for the UnsafeTrap. Never called. 2321 // A stub handler for the UnsafeTrap. Never called.
2339 intptr_t NoOpHandler(const struct arch_seccomp_data& args, void*) { 2322 intptr_t NoOpHandler(const struct arch_seccomp_data& args, void*) {
2340 return -1; 2323 return -1;
2341 } 2324 }
2342 2325
2343 class UnsafeTrapWithCondPolicy : public Policy { 2326 class UnsafeTrapWithCondPolicy : public Policy {
2344 public: 2327 public:
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2394 BPF_ASSERT_EQ(ENOSYS, errno); 2377 BPF_ASSERT_EQ(ENOSYS, errno);
2395 2378
2396 BPF_ASSERT_EQ(-1, syscall(__NR_setgid, 300)); 2379 BPF_ASSERT_EQ(-1, syscall(__NR_setgid, 300));
2397 BPF_ASSERT_EQ(EPERM, errno); 2380 BPF_ASSERT_EQ(EPERM, errno);
2398 } 2381 }
2399 2382
2400 } // namespace 2383 } // namespace
2401 2384
2402 } // namespace bpf_dsl 2385 } // namespace bpf_dsl
2403 } // namespace sandbox 2386 } // namespace sandbox
OLDNEW
« no previous file with comments | « sandbox/linux/bpf_dsl/bpf_dsl_impl.h ('k') | sandbox/linux/bpf_dsl/bpf_dsl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698