blob: 8c3f8420a87e7ec76dbea4915a72d8507bfe13a8 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SANDBOX_LINUX_SECCOMP_BPF_HELPERS_SECCOMP_STARTER_ANDROID_H_
#define SANDBOX_LINUX_SECCOMP_BPF_HELPERS_SECCOMP_STARTER_ANDROID_H_
#include "base/macros.h"
#include "sandbox/sandbox_buildflags.h"
#include "sandbox/sandbox_export.h"
#if BUILDFLAG(USE_SECCOMP_BPF)
#include <memory>
#include "sandbox/linux/bpf_dsl/policy.h"
#endif
namespace sandbox {
namespace bpf_dsl {
class Policy;
}
enum class SeccompSandboxStatus {
NOT_SUPPORTED = 0, // Seccomp is not supported.
DETECTION_FAILED, // Run-time detection of Seccomp+TSYNC failed.
FEATURE_DISABLED, // Sandbox was disabled by FeatureList. Obsolete/unused.
FEATURE_ENABLED, // Sandbox was enabled by FeatureList. Obsolete/unused.
ENGAGED, // Sandbox was enabled and successfully turned on.
STATUS_MAX
// This enum is used by an UMA histogram, so only append values.
};
// This helper class can be used to start a Seccomp-BPF sandbox on Android. It
// helps by doing compile- and run-time checks to see if Seccomp should be
// supported on the given device.
class SANDBOX_EXPORT SeccompStarterAndroid {
public:
// Constructs a sandbox starter helper. The |build_sdk_int| and |device| are
// used to detect whether Seccomp is supported.
SeccompStarterAndroid(int build_sdk_int, const char* device);
~SeccompStarterAndroid();
// Sets the BPF policy to apply. This must be called before StartSandbox()
// if BUILDFLAG(USE_SECCOMP_BPF) is true.
void set_policy(std::unique_ptr<bpf_dsl::Policy> policy) {
policy_ = std::move(policy);
}
// Attempts to turn on the seccomp sandbox. Returns true iff the sandbox
// was started successfully.
bool StartSandbox();
// Returns detailed status information about the sandbox. This will only
// yield an interesting value after StartSandbox() is called.
SeccompSandboxStatus status() const { return status_; }
private:
// Determines if the running device should support Seccomp, based on the
// Android SDK version.
bool IsSupportedBySDK() const;
const int sdk_int_;
const char* const device_;
SeccompSandboxStatus status_ = SeccompSandboxStatus::NOT_SUPPORTED;
std::unique_ptr<bpf_dsl::Policy> policy_;
DISALLOW_COPY_AND_ASSIGN(SeccompStarterAndroid);
};
} // namespace sandbox
#endif // SANDBOX_LINUX_SECCOMP_BPF_HELPERS_SECCOMP_STARTER_ANDROID_H_