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

Side by Side Diff: sandbox/linux/seccomp-bpf/sandbox_bpf_unittest.cc

Issue 226923003: Fixes for sandbox unit tests on Android (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: Created 6 years, 8 months 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | 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 <errno.h> 5 #include <errno.h>
6 #include <pthread.h> 6 #include <pthread.h>
7 #include <sched.h> 7 #include <sched.h>
8 #include <sys/prctl.h> 8 #include <sys/prctl.h>
9 #include <sys/syscall.h> 9 #include <sys/syscall.h>
10 #include <sys/time.h> 10 #include <sys/time.h>
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 206
207 // A simple test that verifies we can return arbitrary errno values. 207 // A simple test that verifies we can return arbitrary errno values.
208 208
209 ErrorCode ErrnoTestPolicy(SandboxBPF*, int sysno, void*) { 209 ErrorCode ErrnoTestPolicy(SandboxBPF*, int sysno, void*) {
210 if (!SandboxBPF::IsValidSyscallNumber(sysno)) { 210 if (!SandboxBPF::IsValidSyscallNumber(sysno)) {
211 // FIXME: we should really not have to do that in a trivial policy 211 // FIXME: we should really not have to do that in a trivial policy
212 return ErrorCode(ENOSYS); 212 return ErrorCode(ENOSYS);
213 } 213 }
214 214
215 switch (sysno) { 215 switch (sysno) {
216 #if defined(ANDROID)
217 case __NR_dup3: // dup2 is a wrapper of dup3 in android
218 #else
216 case __NR_dup2: 219 case __NR_dup2:
220 #endif
217 // Pretend that dup2() worked, but don't actually do anything. 221 // Pretend that dup2() worked, but don't actually do anything.
218 return ErrorCode(0); 222 return ErrorCode(0);
219 case __NR_setuid: 223 case __NR_setuid:
220 #if defined(__NR_setuid32) 224 #if defined(__NR_setuid32)
221 case __NR_setuid32: 225 case __NR_setuid32:
222 #endif 226 #endif
223 // Return errno = 1. 227 // Return errno = 1.
224 return ErrorCode(1); 228 return ErrorCode(1);
225 case __NR_setgid: 229 case __NR_setgid:
226 #if defined(__NR_setgid32) 230 #if defined(__NR_setgid32)
(...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after
696 bool initialized_; 700 bool initialized_;
697 scoped_ptr<class BrokerProcess> broker_process_; 701 scoped_ptr<class BrokerProcess> broker_process_;
698 DISALLOW_COPY_AND_ASSIGN(InitializedOpenBroker); 702 DISALLOW_COPY_AND_ASSIGN(InitializedOpenBroker);
699 }; 703 };
700 704
701 intptr_t BrokerOpenTrapHandler(const struct arch_seccomp_data& args, 705 intptr_t BrokerOpenTrapHandler(const struct arch_seccomp_data& args,
702 void* aux) { 706 void* aux) {
703 BPF_ASSERT(aux); 707 BPF_ASSERT(aux);
704 BrokerProcess* broker_process = static_cast<BrokerProcess*>(aux); 708 BrokerProcess* broker_process = static_cast<BrokerProcess*>(aux);
705 switch (args.nr) { 709 switch (args.nr) {
710 #if defined(ANDROID)
711 case __NR_faccessat: // access is a wrapper of faccessat in android
712 return broker_process->Access(reinterpret_cast<const char*>(args.args[1]),
713 static_cast<int>(args.args[2]));
714 #else
706 case __NR_access: 715 case __NR_access:
707 return broker_process->Access(reinterpret_cast<const char*>(args.args[0]), 716 return broker_process->Access(reinterpret_cast<const char*>(args.args[0]),
708 static_cast<int>(args.args[1])); 717 static_cast<int>(args.args[1]));
718 #endif
709 case __NR_open: 719 case __NR_open:
710 return broker_process->Open(reinterpret_cast<const char*>(args.args[0]), 720 return broker_process->Open(reinterpret_cast<const char*>(args.args[0]),
711 static_cast<int>(args.args[1])); 721 static_cast<int>(args.args[1]));
712 case __NR_openat: 722 case __NR_openat:
713 // We only call open() so if we arrive here, it's because glibc uses 723 // We only call open() so if we arrive here, it's because glibc uses
714 // the openat() system call. 724 // the openat() system call.
715 BPF_ASSERT(static_cast<int>(args.args[0]) == AT_FDCWD); 725 BPF_ASSERT(static_cast<int>(args.args[0]) == AT_FDCWD);
716 return broker_process->Open(reinterpret_cast<const char*>(args.args[1]), 726 return broker_process->Open(reinterpret_cast<const char*>(args.args[1]),
717 static_cast<int>(args.args[2])); 727 static_cast<int>(args.args[2]));
718 default: 728 default:
719 BPF_ASSERT(false); 729 BPF_ASSERT(false);
720 return -ENOSYS; 730 return -ENOSYS;
721 } 731 }
722 } 732 }
723 733
724 ErrorCode DenyOpenPolicy(SandboxBPF* sandbox, int sysno, void* aux) { 734 ErrorCode DenyOpenPolicy(SandboxBPF* sandbox, int sysno, void* aux) {
725 InitializedOpenBroker* iob = static_cast<InitializedOpenBroker*>(aux); 735 InitializedOpenBroker* iob = static_cast<InitializedOpenBroker*>(aux);
726 if (!SandboxBPF::IsValidSyscallNumber(sysno)) { 736 if (!SandboxBPF::IsValidSyscallNumber(sysno)) {
727 return ErrorCode(ENOSYS); 737 return ErrorCode(ENOSYS);
728 } 738 }
729 739
730 switch (sysno) { 740 switch (sysno) {
741 #if defined(ANDROID)
742 case __NR_faccessat:
743 #else
731 case __NR_access: 744 case __NR_access:
745 #endif
732 case __NR_open: 746 case __NR_open:
733 case __NR_openat: 747 case __NR_openat:
734 // We get a InitializedOpenBroker class, but our trap handler wants 748 // We get a InitializedOpenBroker class, but our trap handler wants
735 // the BrokerProcess object. 749 // the BrokerProcess object.
736 return ErrorCode( 750 return ErrorCode(
737 sandbox->Trap(BrokerOpenTrapHandler, iob->broker_process())); 751 sandbox->Trap(BrokerOpenTrapHandler, iob->broker_process()));
738 default: 752 default:
739 return ErrorCode(ErrorCode::ERR_ALLOWED); 753 return ErrorCode(ErrorCode::ERR_ALLOWED);
740 } 754 }
741 } 755 }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
792 ErrorCode SimpleCondTestPolicy(SandboxBPF* sandbox, int sysno, void*) { 806 ErrorCode SimpleCondTestPolicy(SandboxBPF* sandbox, int sysno, void*) {
793 if (!SandboxBPF::IsValidSyscallNumber(sysno)) { 807 if (!SandboxBPF::IsValidSyscallNumber(sysno)) {
794 // FIXME: we should really not have to do that in a trivial policy 808 // FIXME: we should really not have to do that in a trivial policy
795 return ErrorCode(ENOSYS); 809 return ErrorCode(ENOSYS);
796 } 810 }
797 811
798 // We deliberately return unusual errno values upon failure, so that we 812 // We deliberately return unusual errno values upon failure, so that we
799 // can uniquely test for these values. In a "real" policy, you would want 813 // can uniquely test for these values. In a "real" policy, you would want
800 // to return more traditional values. 814 // to return more traditional values.
801 switch (sysno) { 815 switch (sysno) {
816 #if defined(ANDROID)
817 case __NR_openat: // open is a wrapper of openat in android
818 // Allow opening files for reading, but don't allow writing.
819 COMPILE_ASSERT(O_RDONLY == 0, O_RDONLY_must_be_all_zero_bits);
820 return sandbox->Cond(2,
821 ErrorCode::TP_32BIT,
822 ErrorCode::OP_HAS_ANY_BITS,
823 O_ACCMODE /* 0x3 */,
824 ErrorCode(EROFS),
825 ErrorCode(ErrorCode::ERR_ALLOWED));
826 #else
802 case __NR_open: 827 case __NR_open:
803 // Allow opening files for reading, but don't allow writing. 828 // Allow opening files for reading, but don't allow writing.
804 COMPILE_ASSERT(O_RDONLY == 0, O_RDONLY_must_be_all_zero_bits); 829 COMPILE_ASSERT(O_RDONLY == 0, O_RDONLY_must_be_all_zero_bits);
805 return sandbox->Cond(1, 830 return sandbox->Cond(1,
806 ErrorCode::TP_32BIT, 831 ErrorCode::TP_32BIT,
807 ErrorCode::OP_HAS_ANY_BITS, 832 ErrorCode::OP_HAS_ANY_BITS,
808 O_ACCMODE /* 0x3 */, 833 O_ACCMODE /* 0x3 */,
809 ErrorCode(EROFS), 834 ErrorCode(EROFS),
810 ErrorCode(ErrorCode::ERR_ALLOWED)); 835 ErrorCode(ErrorCode::ERR_ALLOWED));
836 #endif
811 case __NR_prctl: 837 case __NR_prctl:
812 // Allow prctl(PR_SET_DUMPABLE) and prctl(PR_GET_DUMPABLE), but 838 // Allow prctl(PR_SET_DUMPABLE) and prctl(PR_GET_DUMPABLE), but
813 // disallow everything else. 839 // disallow everything else.
814 return sandbox->Cond(0, 840 return sandbox->Cond(0,
815 ErrorCode::TP_32BIT, 841 ErrorCode::TP_32BIT,
816 ErrorCode::OP_EQUAL, 842 ErrorCode::OP_EQUAL,
817 PR_SET_DUMPABLE, 843 PR_SET_DUMPABLE,
818 ErrorCode(ErrorCode::ERR_ALLOWED), 844 ErrorCode(ErrorCode::ERR_ALLOWED),
819 sandbox->Cond(0, 845 sandbox->Cond(0,
820 ErrorCode::TP_32BIT, 846 ErrorCode::TP_32BIT,
(...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after
1777 &pid) == -EPERM); 1803 &pid) == -EPERM);
1778 } 1804 }
1779 1805
1780 BPF_TEST(SandboxBPF, PthreadEquality, PthreadPolicyEquality) { PthreadTest(); } 1806 BPF_TEST(SandboxBPF, PthreadEquality, PthreadPolicyEquality) { PthreadTest(); }
1781 1807
1782 BPF_TEST(SandboxBPF, PthreadBitMask, PthreadPolicyBitMask) { PthreadTest(); } 1808 BPF_TEST(SandboxBPF, PthreadBitMask, PthreadPolicyBitMask) { PthreadTest(); }
1783 1809
1784 } // namespace 1810 } // namespace
1785 1811
1786 } // namespace sandbox 1812 } // namespace sandbox
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698