#ifdef UNSAFE_BUFFERS_BUILD
#pragma allow_unsafe_buffers
#endif
#include <errno.h>
#include <fcntl.h>
#include <sys/inotify.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <memory>
#include <tuple>
#include <type_traits>
#include <vector>
#include "base/files/file.h"
#include "base/files/file_path.h"
#include "base/files/file_path_watcher.h"
#include "base/files/file_path_watcher_inotify.h"
#include "base/files/file_util.h"
#include "base/files/scoped_file.h"
#include "base/files/scoped_temp_dir.h"
#include "base/functional/bind.h"
#include "base/functional/callback.h"
#include "base/logging.h"
#include "base/memory/raw_ptr.h"
#include "base/posix/eintr_wrapper.h"
#include "base/run_loop.h"
#include "base/test/bind.h"
#include "base/test/task_environment.h"
#include "build/build_config.h"
#include "sandbox/linux/bpf_dsl/bpf_dsl.h"
#include "sandbox/linux/bpf_dsl/policy.h"
#include "sandbox/linux/bpf_dsl/seccomp_macros.h"
#include "sandbox/linux/seccomp-bpf/bpf_tests.h"
#include "sandbox/linux/seccomp-bpf/sandbox_bpf.h"
#include "sandbox/linux/seccomp-bpf/sandbox_bpf_test_runner.h"
#include "sandbox/linux/syscall_broker/broker_client.h"
#include "sandbox/linux/syscall_broker/broker_command.h"
#include "sandbox/linux/syscall_broker/broker_file_permission.h"
#include "sandbox/linux/syscall_broker/broker_process.h"
#include "sandbox/linux/system_headers/linux_seccomp.h"
#include "sandbox/linux/system_headers/linux_stat.h"
#include "sandbox/linux/system_headers/linux_syscalls.h"
#include "sandbox/linux/tests/scoped_temporary_file.h"
#include "sandbox/linux/tests/test_utils.h"
#include "sandbox/linux/tests/unit_tests.h"
#include "testing/gtest/include/gtest/gtest-param-test.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace sandbox {
Allow;
Arg;
Error;
If;
ResultExpr;
Trap;
BrokerProcess;
BrokerType;
BrokerCommandSet;
BrokerFilePermission;
class InitializedOpenBroker { … };
intptr_t BrokerOpenTrapHandler(const struct arch_seccomp_data& args,
void* aux) { … }
class DenyOpenPolicy : public bpf_dsl::Policy { … };
BPF_TEST(SandboxBPF,
UseOpenBroker,
DenyOpenPolicy,
InitializedOpenBroker ) { … }
#if !defined(THREAD_SANITIZER)
namespace {
const int kFakeErrnoSentinel = …;
void ConvertKernelStatToLibcStat(default_stat_struct& in_stat,
struct stat& out_stat) { … }
}
class Syscaller { … };
class IPCSyscaller : public Syscaller { … };
#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \
BUILDFLAG(IS_ANDROID)) && \
defined(__x86_64__)
#define DIRECT_SYSCALLER_ENABLED
#endif
#if defined(DIRECT_SYSCALLER_ENABLED)
class DirectSyscaller : public Syscaller { … };
#endif
class LibcSyscaller : public Syscaller { … };
enum class SyscallerType { … };
class BrokerTestDelegate { … };
namespace syscall_broker {
class HandleFilesystemViaBrokerPolicy : public bpf_dsl::Policy { … };
}
class BPFTesterBrokerDelegate : public BPFTesterDelegate { … };
namespace {
struct BrokerTestConfiguration { … };
const std::vector<BrokerTestConfiguration> broker_test_configs = …;
}
void RunSingleBrokerTest(BrokerTestDelegate* test_delegate,
const BrokerTestConfiguration& test_config) { … }
template <typename T>
void RunAllBrokerTests() { … }
template <typename T>
void RunIPCBrokerTests() { … }
class TestOpenAccessNullDelegate final : public BrokerTestDelegate { … };
TEST(BrokerProcessIntegrationTest, TestOpenAccessNull) { … }
template <int DENIED_ERRNO>
class TestOpenFilePermsDelegate final : public BrokerTestDelegate { … };
TEST(BrokerProcessIntegrationTest, TestOpenFilePermsEPERM) { … }
TEST(BrokerProcessIntegrationTest, TestOpenFilePermsENOENT) { … }
class BadPathsDelegate final : public BrokerTestDelegate { … };
TEST(BrokerProcessIntegrationTest, BadPaths) { … }
template <bool recursive>
class OpenCpuinfoDelegate final : public BrokerTestDelegate { … };
TEST(BrokerProcessIntegrationTest, OpenCpuinfoRecursive) { … }
TEST(BrokerProcessIntegrationTest, OpenCpuinfoNonRecursive) { … }
class OpenFileRWDelegate final : public BrokerTestDelegate { … };
TEST(BrokerProcessIntegrationTest, OpenFileRW) { … }
class BrokerDiedDelegate final : public BrokerTestDelegate { … };
TEST(BrokerProcessIntegrationTest, BrokerDied) { … }
class OpenComplexFlagsDelegate final : public BrokerTestDelegate { … };
TEST(BrokerProcessIntegrationTest, OpenComplexFlags) { … }
class RewriteProcSelfDelegate final : public BrokerTestDelegate { … };
TEST(BrokerProcessIntegrationTest, RewriteProcSelf) { … }
class CreateFileDelegate final : public BrokerTestDelegate { … };
TEST(BrokerProcessIntegrationTest, CreateFile) { … }
class StatFileDelegate : public BrokerTestDelegate { … };
template <bool follow_links>
class StatFileNoCommandDelegate final : public StatFileDelegate { … };
TEST(BrokerProcessIntegrationTest, StatFileNoCommandFollowLinks) { … }
TEST(BrokerProcessIntegrationTest, StatFileNoCommandNoFollowLinks) { … }
template <bool follow_links>
class StatFilesNoPermissionDelegate final : public StatFileDelegate { … };
TEST(BrokerProcessIntegrationTest, StatFilesNoPermissionFollowLinks) { … }
TEST(BrokerProcessIntegrationTest, StatFilesNoPermissionNoFollowLinks) { … }
template <bool follow_links>
class StatNonexistentFileWithPermissionsDelegate final
: public StatFileDelegate { … };
TEST(BrokerProcessIntegrationTest,
StatNonexistentFileWithPermissionsFollowLinks) { … }
TEST(BrokerProcessIntegrationTest,
StatNonexistentFileWithPermissionsNoFollowLinks) { … }
template <bool follow_links>
class StatNonexistentFileWithCreatePermissionsDelegate final
: public StatFileDelegate { … };
TEST(BrokerProcessIntegrationTest,
StatNonexistentFileWithCreatePermissionsFollowLinks) { … }
TEST(BrokerProcessIntegrationTest,
StatNonexistentFileWithCreatePermissionsNoFollowLinks) { … }
template <bool follow_links>
class StatFileWithPermissionsDelegate final : public StatFileDelegate { … };
TEST(BrokerProcessIntegrationTest, StatFileWithPermissionsFollowLinks) { … }
TEST(BrokerProcessIntegrationTest, StatFileWithPermissionsNoFollowLinks) { … }
class RenameTestDelegate : public BrokerTestDelegate { … };
class RenameNoCommandDelegate final : public RenameTestDelegate { … };
TEST(BrokerProcessIntegrationTest, RenameNoCommand) { … }
class RenameNoPermNewDelegate final : public RenameTestDelegate { … };
TEST(BrokerProcessIntegrationTest, RenameNoPermNew) { … }
class RenameNoPermOldDelegate final : public RenameTestDelegate { … };
TEST(BrokerProcessIntegrationTest, RenameNoPermOld) { … }
class RenameReadPermNewDelegate final : public RenameTestDelegate { … };
TEST(BrokerProcessIntegrationTest, RenameReadPermNew) { … }
class RenameReadPermOldDelegate final : public RenameTestDelegate { … };
TEST(BrokerProcessIntegrationTest, RenameReadPermOld) { … }
class RenameWritePermsBothDelegate final : public RenameTestDelegate { … };
TEST(BrokerProcessIntegrationTest, RenameWritePermsBoth) { … }
class ReadlinkTestDelegate : public BrokerTestDelegate { … };
class ReadlinkNoCommandDelegate final : public ReadlinkTestDelegate { … };
TEST(BrokerProcessIntegrationTest, ReadlinkNoCommand) { … }
void ReadlinkNoCommandDelegate::RunTestInSandboxedChild(Syscaller* syscaller) { … }
class ReadlinkNonexistentNoPermissionsDelegate final
: public ReadlinkTestDelegate { … };
TEST(BrokerProcessIntegrationTest, ReadlinkNonexistentNoPermissions) { … }
class ReadlinkNoPermissionsDelegate final : public ReadlinkTestDelegate { … };
TEST(BrokerProcessIntegrationTest, ReadlinkNoPermissions) { … }
class ReadlinkNonexistentWithPermissionsDelegate final
: public ReadlinkTestDelegate { … };
TEST(BrokerProcessIntegrationTest, ReadlinkNonexistentWithPermissions) { … }
class ReadlinkFileWithPermissionsDelegate final : public ReadlinkTestDelegate { … };
TEST(BrokerProcessIntegrationTest, ReadlinkFileWithPermissions) { … }
class ReadlinkFileWithPermissionsSmallBufferDelegate final
: public ReadlinkTestDelegate { … };
TEST(BrokerProcessIntegrationTest, ReadlinkFileWithPermissionsSmallBuffer) { … }
class MkdirTestDelegate : public BrokerTestDelegate { … };
class MkdirNoCommandDelegate final : public MkdirTestDelegate { … };
TEST(BrokerProcessIntegrationTest, MkdirNoCommand) { … }
class MkdirNonexistentNoPermissionsDelegate final : public MkdirTestDelegate { … };
TEST(BrokerProcessIntegrationTest, MkdirNonexistentNoPermissions) { … }
class MkdirFileNoPermissionsDelegate final : public MkdirTestDelegate { … };
TEST(BrokerProcessIntegrationTest, MkdirFileNoPermissions) { … }
class MkdirNonexistentROPermissionsDelegate final : public MkdirTestDelegate { … };
TEST(BrokerProcessIntegrationTest, MkdirNonexistentROPermissions) { … }
class MkdirFileROPermissionsDelegate final : public MkdirTestDelegate { … };
TEST(BrokerProcessIntegrationTest, MkdirFileROPermissions) { … }
class MkdirNonExistentRWPermissionsDelegate final : public MkdirTestDelegate { … };
TEST(BrokerProcessIntegrationTest, MkdirNonExistentRWPermissions) { … }
class MkdirFileRWPermissionsDelegate final : public MkdirTestDelegate { … };
TEST(BrokerProcessIntegrationTest, MkdirFileRWPermissions) { … }
class MkdirNonExistentRWCPermissionsDelegate final : public MkdirTestDelegate { … };
TEST(BrokerProcessIntegrationTest, MkdirNonExistentRWCPermissions) { … }
class MkdirFileRWCPermissionsDelegate final : public MkdirTestDelegate { … };
TEST(BrokerProcessIntegrationTest, MkdirFileRWCPermissions) { … }
class RmdirTestDelegate : public BrokerTestDelegate { … };
class RmdirNoCommandDelegate final : public RmdirTestDelegate { … };
TEST(BrokerProcessIntegrationTest, RmdirNoCommand) { … }
class RmdirNonexistentNoPermissionsDelegate final : public RmdirTestDelegate { … };
TEST(BrokerProcessIntegrationTest, RmdirNonexistentNoPermissions) { … }
class RmdirFileNoPermissionsDelegate final : public RmdirTestDelegate { … };
TEST(BrokerProcessIntegrationTest, RmdirFileNoPermissions) { … }
class RmdirNonexistentROPermissionsDelegate final : public RmdirTestDelegate { … };
TEST(BrokerProcessIntegrationTest, RmdirNonexistentROPermissions) { … }
class RmdirFileROPermissionsDelegate final : public RmdirTestDelegate { … };
TEST(BrokerProcessIntegrationTest, RmdirFileROPermissions) { … }
class RmdirNonExistentRWPermissionsDelegate final : public RmdirTestDelegate { … };
TEST(BrokerProcessIntegrationTest, RmdirNonExistentRWPermissions) { … }
class RmdirFileRWPermissionsDelegate final : public RmdirTestDelegate { … };
TEST(BrokerProcessIntegrationTest, RmdirFileRWPermissions) { … }
class RmdirNonExistentRWCPermissionsDelegate final : public RmdirTestDelegate { … };
TEST(BrokerProcessIntegrationTest, RmdirNonExistentRWCPermissions) { … }
class RmdirFileRWCPermissionsDelegate final : public RmdirTestDelegate { … };
TEST(BrokerProcessIntegrationTest, RmdirFileRWCPermissions) { … }
class UnlinkTestDelegate : public BrokerTestDelegate { … };
class UnlinkNoCommandDelegate final : public UnlinkTestDelegate { … };
TEST(BrokerProcessIntegrationTest, UnlinkNoCommand) { … }
class UnlinkNonexistentNoPermissionsDelegate final : public UnlinkTestDelegate { … };
TEST(BrokerProcessIntegrationTest, UnlinkNonexistentNoPermissions) { … }
class UnlinkFileNoPermissionsDelegate final : public UnlinkTestDelegate { … };
TEST(BrokerProcessIntegrationTest, UnlinkFileNoPermissions) { … }
class UnlinkNonexistentROPermissionsDelegate final : public UnlinkTestDelegate { … };
TEST(BrokerProcessIntegrationTest, UnlinkNonexistentROPermissions) { … }
class UnlinkFileROPermissionsDelegate final : public UnlinkTestDelegate { … };
TEST(BrokerProcessIntegrationTest, UnlinkFileROPermissions) { … }
class UnlinkNonExistentRWPermissionsDelegate final : public UnlinkTestDelegate { … };
TEST(BrokerProcessIntegrationTest, UnlinkNonExistentRWPermissions) { … }
class UnlinkFileRWPermissionsDelegate final : public UnlinkTestDelegate { … };
TEST(BrokerProcessIntegrationTest, UnlinkFileRWPermissions) { … }
class UnlinkNonExistentRWCPermissionsDelegate final
: public UnlinkTestDelegate { … };
TEST(BrokerProcessIntegrationTest, UnlinkNonExistentRWCPermissions) { … }
class UnlinkFileRWCPermissionsDelegate final : public UnlinkTestDelegate { … };
TEST(BrokerProcessIntegrationTest, UnlinkFileRWCPermissions) { … }
class InotifyAddWatchDelegate : public BrokerTestDelegate { … };
class InotifyAddWatchNoCommandDelegate final : public InotifyAddWatchDelegate { … };
TEST(BrokerProcessIntegrationTest, InotifyAddWatchNoCommand) { … }
class InotifyAddWatchNoPermissionsDelegate final
: public InotifyAddWatchDelegate { … };
TEST(BrokerProcessIntegrationTest, InotifyAddWatchNoPermissions) { … }
class InotifyAddWatchBadArgumentsDelegate final
: public InotifyAddWatchDelegate { … };
TEST(BrokerProcessIntegrationTest, InotifyAddWatchBadArguments) { … }
class InotifyAddWatchSuccessDelegate final : public InotifyAddWatchDelegate { … };
TEST(BrokerProcessIntegrationTest, InotifyAddWatchSuccess) { … }
class BaseFilePathWatcherDelegate final : public InotifyAddWatchDelegate { … };
TEST(BrokerProcessIntegrationTest, BaseFilePathWatcherInotifyTest) { … }
#endif
}