1*ec63e07aSXin Li // Copyright 2019 Google LLC
2*ec63e07aSXin Li //
3*ec63e07aSXin Li // Licensed under the Apache License, Version 2.0 (the "License");
4*ec63e07aSXin Li // you may not use this file except in compliance with the License.
5*ec63e07aSXin Li // You may obtain a copy of the License at
6*ec63e07aSXin Li //
7*ec63e07aSXin Li // https://www.apache.org/licenses/LICENSE-2.0
8*ec63e07aSXin Li //
9*ec63e07aSXin Li // Unless required by applicable law or agreed to in writing, software
10*ec63e07aSXin Li // distributed under the License is distributed on an "AS IS" BASIS,
11*ec63e07aSXin Li // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*ec63e07aSXin Li // See the License for the specific language governing permissions and
13*ec63e07aSXin Li // limitations under the License.
14*ec63e07aSXin Li
15*ec63e07aSXin Li #include "sandboxed_api/sandbox2/syscall.h"
16*ec63e07aSXin Li
17*ec63e07aSXin Li #include <linux/audit.h>
18*ec63e07aSXin Li
19*ec63e07aSXin Li #include <cstdint>
20*ec63e07aSXin Li #include <string>
21*ec63e07aSXin Li #include <vector>
22*ec63e07aSXin Li
23*ec63e07aSXin Li #include "absl/strings/str_format.h"
24*ec63e07aSXin Li #include "absl/strings/str_join.h"
25*ec63e07aSXin Li #include "absl/strings/string_view.h"
26*ec63e07aSXin Li #include "sandboxed_api/config.h"
27*ec63e07aSXin Li #include "sandboxed_api/sandbox2/syscall_defs.h"
28*ec63e07aSXin Li
29*ec63e07aSXin Li #ifndef AUDIT_ARCH_PPC64LE
30*ec63e07aSXin Li #define AUDIT_ARCH_PPC64LE (EM_PPC64 | __AUDIT_ARCH_64BIT | __AUDIT_ARCH_LE)
31*ec63e07aSXin Li #endif
32*ec63e07aSXin Li
33*ec63e07aSXin Li namespace sandbox2 {
34*ec63e07aSXin Li
GetArchDescription(sapi::cpu::Architecture arch)35*ec63e07aSXin Li std::string Syscall::GetArchDescription(sapi::cpu::Architecture arch) {
36*ec63e07aSXin Li switch (arch) {
37*ec63e07aSXin Li case sapi::cpu::kX8664:
38*ec63e07aSXin Li return "[X86-64]";
39*ec63e07aSXin Li case sapi::cpu::kX86:
40*ec63e07aSXin Li return "[X86-32]";
41*ec63e07aSXin Li case sapi::cpu::kPPC64LE:
42*ec63e07aSXin Li return "[PPC-64]";
43*ec63e07aSXin Li case sapi::cpu::kArm64:
44*ec63e07aSXin Li return "[Arm-64]";
45*ec63e07aSXin Li case sapi::cpu::kArm:
46*ec63e07aSXin Li return "[Arm-32]";
47*ec63e07aSXin Li default:
48*ec63e07aSXin Li return absl::StrFormat("[UNKNOWN_ARCH:%d]", arch);
49*ec63e07aSXin Li }
50*ec63e07aSXin Li }
51*ec63e07aSXin Li
GetHostAuditArch()52*ec63e07aSXin Li uint32_t Syscall::GetHostAuditArch() {
53*ec63e07aSXin Li switch (sapi::host_cpu::Architecture()) {
54*ec63e07aSXin Li case sapi::cpu::kX8664:
55*ec63e07aSXin Li return AUDIT_ARCH_X86_64;
56*ec63e07aSXin Li case sapi::cpu::kPPC64LE:
57*ec63e07aSXin Li return AUDIT_ARCH_PPC64LE;
58*ec63e07aSXin Li case sapi::cpu::kArm64:
59*ec63e07aSXin Li return AUDIT_ARCH_AARCH64;
60*ec63e07aSXin Li case sapi::cpu::kArm:
61*ec63e07aSXin Li return AUDIT_ARCH_ARM;
62*ec63e07aSXin Li default:
63*ec63e07aSXin Li // The static_assert() in config.h should prevent us from ever getting
64*ec63e07aSXin Li // here.
65*ec63e07aSXin Li return 0; // Not reached
66*ec63e07aSXin Li }
67*ec63e07aSXin Li }
68*ec63e07aSXin Li
GetName() const69*ec63e07aSXin Li std::string Syscall::GetName() const {
70*ec63e07aSXin Li if (absl::string_view name = SyscallTable::get(arch_).GetName(nr_);
71*ec63e07aSXin Li !name.empty()) {
72*ec63e07aSXin Li return std::string(name);
73*ec63e07aSXin Li }
74*ec63e07aSXin Li return absl::StrFormat("UNKNOWN[%d/0x%x]", nr_, nr_);
75*ec63e07aSXin Li }
76*ec63e07aSXin Li
GetArgumentsDescription() const77*ec63e07aSXin Li std::vector<std::string> Syscall::GetArgumentsDescription() const {
78*ec63e07aSXin Li return SyscallTable::get(arch_).GetArgumentsDescription(nr_, args_.data(),
79*ec63e07aSXin Li pid_);
80*ec63e07aSXin Li }
81*ec63e07aSXin Li
GetDescription() const82*ec63e07aSXin Li std::string Syscall::GetDescription() const {
83*ec63e07aSXin Li const std::string arch = GetArchDescription(arch_);
84*ec63e07aSXin Li const std::string args = absl::StrJoin(GetArgumentsDescription(), ", ");
85*ec63e07aSXin Li return absl::StrFormat("%s %s [%d](%s) IP: %#x, STACK: %#x", arch, GetName(),
86*ec63e07aSXin Li nr_, args, ip_, sp_);
87*ec63e07aSXin Li }
88*ec63e07aSXin Li
89*ec63e07aSXin Li } // namespace sandbox2
90