mirror of
https://github.com/google/sandboxed-api.git
synced 2024-03-22 13:11:30 +08:00
Add DefaultAction(TraceAllSyscalls)
variant to PolicyBuilder
This helps write the kind of 'log, but allow' policy described in
[`notify.h`](b9c84a1f75/sandboxed_api/sandbox2/notify.h (L57)
) for all system calls not mentioned explicitly. One use case is writing a "permissive mode" runtime to give more information during development.
PiperOrigin-RevId: 603766051
Change-Id: I3c72f433a1e21c330b5dd9f1ede2faa570b75b09
This commit is contained in:
parent
044ba1cb90
commit
f708270f35
|
@ -40,6 +40,23 @@ cc_library(
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
cc_library(
|
||||||
|
name = "trace_all_syscalls",
|
||||||
|
hdrs = ["trace_all_syscalls.h"],
|
||||||
|
copts = sapi_platform_copts(),
|
||||||
|
visibility = [
|
||||||
|
"//sandboxed_api/sandbox2:__pkg__",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
|
cc_library(
|
||||||
|
name = "testonly_trace_all_syscalls",
|
||||||
|
testonly = True,
|
||||||
|
hdrs = ["trace_all_syscalls.h"],
|
||||||
|
copts = sapi_platform_copts(),
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
||||||
|
|
||||||
cc_library(
|
cc_library(
|
||||||
name = "allow_unrestricted_networking",
|
name = "allow_unrestricted_networking",
|
||||||
hdrs = ["allow_unrestricted_networking.h"],
|
hdrs = ["allow_unrestricted_networking.h"],
|
||||||
|
@ -563,6 +580,7 @@ cc_library(
|
||||||
":namespace",
|
":namespace",
|
||||||
":policy",
|
":policy",
|
||||||
":syscall",
|
":syscall",
|
||||||
|
":trace_all_syscalls",
|
||||||
":violation_cc_proto",
|
":violation_cc_proto",
|
||||||
"//sandboxed_api:config",
|
"//sandboxed_api:config",
|
||||||
"//sandboxed_api/sandbox2/network_proxy:filtering",
|
"//sandboxed_api/sandbox2/network_proxy:filtering",
|
||||||
|
@ -924,6 +942,7 @@ cc_test(
|
||||||
deps = [
|
deps = [
|
||||||
":comms",
|
":comms",
|
||||||
":sandbox2",
|
":sandbox2",
|
||||||
|
":trace_all_syscalls",
|
||||||
"//sandboxed_api:testing",
|
"//sandboxed_api:testing",
|
||||||
"@com_google_absl//absl/log",
|
"@com_google_absl//absl/log",
|
||||||
"@com_google_absl//absl/strings",
|
"@com_google_absl//absl/strings",
|
||||||
|
|
|
@ -26,6 +26,15 @@ target_link_libraries(sandbox2_allow_all_syscalls PRIVATE
|
||||||
sapi::base
|
sapi::base
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# sandboxed_api/sandbox2:trace_all_syscalls
|
||||||
|
add_library(sandbox2_trace_all_syscalls ${SAPI_LIB_TYPE}
|
||||||
|
trace_all_syscalls.h
|
||||||
|
)
|
||||||
|
add_library(sandbox2::trace_all_syscalls ALIAS sandbox2_trace_all_syscalls)
|
||||||
|
target_link_libraries(sandbox2_trace_all_syscalls PRIVATE
|
||||||
|
sapi::base
|
||||||
|
)
|
||||||
|
|
||||||
# sandboxed_api/sandbox2:allow_unrestricted_networking
|
# sandboxed_api/sandbox2:allow_unrestricted_networking
|
||||||
add_library(sandbox2_allow_unrestricted_networking ${SAPI_LIB_TYPE}
|
add_library(sandbox2_allow_unrestricted_networking ${SAPI_LIB_TYPE}
|
||||||
allow_unrestricted_networking.h
|
allow_unrestricted_networking.h
|
||||||
|
@ -994,6 +1003,7 @@ if(BUILD_TESTING AND SAPI_BUILD_TESTING)
|
||||||
sandbox2::comms
|
sandbox2::comms
|
||||||
sandbox2::regs
|
sandbox2::regs
|
||||||
sandbox2::sandbox2
|
sandbox2::sandbox2
|
||||||
|
sandbox2::trace_all_syscalls
|
||||||
sapi::testing
|
sapi::testing
|
||||||
sapi::test_main
|
sapi::test_main
|
||||||
)
|
)
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include "sandboxed_api/sandbox2/policybuilder.h"
|
#include "sandboxed_api/sandbox2/policybuilder.h"
|
||||||
#include "sandboxed_api/sandbox2/sandbox2.h"
|
#include "sandboxed_api/sandbox2/sandbox2.h"
|
||||||
#include "sandboxed_api/sandbox2/syscall.h"
|
#include "sandboxed_api/sandbox2/syscall.h"
|
||||||
|
#include "sandboxed_api/sandbox2/trace_all_syscalls.h"
|
||||||
#include "sandboxed_api/testing.h"
|
#include "sandboxed_api/testing.h"
|
||||||
|
|
||||||
namespace sandbox2 {
|
namespace sandbox2 {
|
||||||
|
@ -126,5 +127,21 @@ TEST(NotifyTest, PrintPidAndComms) {
|
||||||
EXPECT_THAT(result.reason_code(), Eq(33));
|
EXPECT_THAT(result.reason_code(), Eq(33));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test EventSyscallTrap on personality syscall through TraceAllSyscalls
|
||||||
|
TEST(NotifyTest, TraceAllAllowPersonality) {
|
||||||
|
const std::string path = GetTestSourcePath("sandbox2/testcases/personality");
|
||||||
|
std::vector<std::string> args = {path};
|
||||||
|
auto policy = CreateDefaultPermissiveTestPolicy(path)
|
||||||
|
.DefaultAction(TraceAllSyscalls())
|
||||||
|
.BuildOrDie();
|
||||||
|
Sandbox2 s2(std::make_unique<Executor>(path, args),
|
||||||
|
NotifyTestcasePolicy(path),
|
||||||
|
std::make_unique<PersonalityNotify>(/*allow=*/true));
|
||||||
|
auto result = s2.Run();
|
||||||
|
|
||||||
|
ASSERT_THAT(result.final_status(), Eq(Result::OK));
|
||||||
|
EXPECT_THAT(result.reason_code(), Eq(22));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
} // namespace sandbox2
|
} // namespace sandbox2
|
||||||
|
|
|
@ -60,6 +60,7 @@
|
||||||
#include "sandboxed_api/sandbox2/namespace.h"
|
#include "sandboxed_api/sandbox2/namespace.h"
|
||||||
#include "sandboxed_api/sandbox2/policy.h"
|
#include "sandboxed_api/sandbox2/policy.h"
|
||||||
#include "sandboxed_api/sandbox2/syscall.h"
|
#include "sandboxed_api/sandbox2/syscall.h"
|
||||||
|
#include "sandboxed_api/sandbox2/trace_all_syscalls.h"
|
||||||
#include "sandboxed_api/sandbox2/util/bpf_helper.h"
|
#include "sandboxed_api/sandbox2/util/bpf_helper.h"
|
||||||
#include "sandboxed_api/sandbox2/violation.pb.h"
|
#include "sandboxed_api/sandbox2/violation.pb.h"
|
||||||
#include "sandboxed_api/util/path.h"
|
#include "sandboxed_api/util/path.h"
|
||||||
|
@ -1244,6 +1245,11 @@ PolicyBuilder& PolicyBuilder::DefaultAction(AllowAllSyscalls) {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PolicyBuilder& PolicyBuilder::DefaultAction(TraceAllSyscalls) {
|
||||||
|
default_action_ = SANDBOX2_TRACE;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
absl::StatusOr<std::string> PolicyBuilder::ValidateAbsolutePath(
|
absl::StatusOr<std::string> PolicyBuilder::ValidateAbsolutePath(
|
||||||
absl::string_view path) {
|
absl::string_view path) {
|
||||||
if (!file::IsAbsolutePath(path)) {
|
if (!file::IsAbsolutePath(path)) {
|
||||||
|
|
|
@ -43,6 +43,7 @@ struct bpf_labels;
|
||||||
namespace sandbox2 {
|
namespace sandbox2 {
|
||||||
|
|
||||||
class AllowAllSyscalls;
|
class AllowAllSyscalls;
|
||||||
|
class TraceAllSyscalls;
|
||||||
class UnrestrictedNetworking;
|
class UnrestrictedNetworking;
|
||||||
|
|
||||||
// PolicyBuilder is a helper class to simplify creation of policies. The builder
|
// PolicyBuilder is a helper class to simplify creation of policies. The builder
|
||||||
|
@ -712,6 +713,12 @@ class PolicyBuilder final {
|
||||||
// sandbox-team@ first if unsure.
|
// sandbox-team@ first if unsure.
|
||||||
PolicyBuilder& DefaultAction(AllowAllSyscalls);
|
PolicyBuilder& DefaultAction(AllowAllSyscalls);
|
||||||
|
|
||||||
|
// Changes the default action to SANDBOX2_TRACE.
|
||||||
|
// All syscalls not handled explicitly by the policy will be passed off to
|
||||||
|
// the `sandbox2::Notify` implementation given to the `sandbox2::Sandbox2`
|
||||||
|
// instance.
|
||||||
|
PolicyBuilder& DefaultAction(TraceAllSyscalls);
|
||||||
|
|
||||||
ABSL_DEPRECATED("Use DefaultAction(sandbox2::AllowAllSyscalls()) instead")
|
ABSL_DEPRECATED("Use DefaultAction(sandbox2::AllowAllSyscalls()) instead")
|
||||||
PolicyBuilder& DangerDefaultAllowAll();
|
PolicyBuilder& DangerDefaultAllowAll();
|
||||||
|
|
||||||
|
|
27
sandboxed_api/sandbox2/trace_all_syscalls.h
Normal file
27
sandboxed_api/sandbox2/trace_all_syscalls.h
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
// Copyright 2024 Google LLC
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
#ifndef SANDBOXED_API_SANDBOX2_TRACE_ALL_SYSCALLS_H_
|
||||||
|
#define SANDBOXED_API_SANDBOX2_TRACE_ALL_SYSCALLS_H_
|
||||||
|
|
||||||
|
namespace sandbox2 {
|
||||||
|
|
||||||
|
class TraceAllSyscalls {
|
||||||
|
public:
|
||||||
|
explicit TraceAllSyscalls() = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace sandbox2
|
||||||
|
|
||||||
|
#endif // SANDBOXED_API_SANDBOX2_ALLOW_ALL_SYSCALLS_H_
|
Loading…
Reference in New Issue
Block a user