mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
enable seccomp test on arm64
syscalls in ARM64 is different from that in X86_64, use differen syscallrules for each arch. The auditnumber are also different for different arch. Use LINUX_AUDIT_ARCH to get correct auditnumber. Signed-off-by: Howard Zhang <howard.zhang@arm.com>
This commit is contained in:
+3
-1
@@ -5,7 +5,9 @@ package(licenses = ["notice"])
|
||||
go_binary(
|
||||
name = "victim",
|
||||
testonly = 1,
|
||||
srcs = ["seccomp_test_victim.go"],
|
||||
srcs = ["seccomp_test_victim.go",
|
||||
"seccomp_test_victim_amd64.go",
|
||||
"seccomp_test_victim_arm64.go",],
|
||||
deps = [":seccomp"],
|
||||
)
|
||||
|
||||
|
||||
+31
-31
@@ -91,12 +91,12 @@ func TestBasic(t *testing.T) {
|
||||
specs: []spec{
|
||||
{
|
||||
desc: "Single syscall allowed",
|
||||
data: seccompData{nr: 1, arch: linux.AUDIT_ARCH_X86_64},
|
||||
data: seccompData{nr: 1, arch: LINUX_AUDIT_ARCH},
|
||||
want: linux.SECCOMP_RET_ALLOW,
|
||||
},
|
||||
{
|
||||
desc: "Single syscall disallowed",
|
||||
data: seccompData{nr: 2, arch: linux.AUDIT_ARCH_X86_64},
|
||||
data: seccompData{nr: 2, arch: LINUX_AUDIT_ARCH},
|
||||
want: linux.SECCOMP_RET_TRAP,
|
||||
},
|
||||
},
|
||||
@@ -125,22 +125,22 @@ func TestBasic(t *testing.T) {
|
||||
specs: []spec{
|
||||
{
|
||||
desc: "Multiple rulesets allowed (1a)",
|
||||
data: seccompData{nr: 1, arch: linux.AUDIT_ARCH_X86_64, args: [6]uint64{0x1}},
|
||||
data: seccompData{nr: 1, arch: LINUX_AUDIT_ARCH, args: [6]uint64{0x1}},
|
||||
want: linux.SECCOMP_RET_ALLOW,
|
||||
},
|
||||
{
|
||||
desc: "Multiple rulesets allowed (1b)",
|
||||
data: seccompData{nr: 1, arch: linux.AUDIT_ARCH_X86_64},
|
||||
data: seccompData{nr: 1, arch: LINUX_AUDIT_ARCH},
|
||||
want: linux.SECCOMP_RET_TRAP,
|
||||
},
|
||||
{
|
||||
desc: "Multiple rulesets allowed (2)",
|
||||
data: seccompData{nr: 1, arch: linux.AUDIT_ARCH_X86_64},
|
||||
data: seccompData{nr: 1, arch: LINUX_AUDIT_ARCH},
|
||||
want: linux.SECCOMP_RET_TRAP,
|
||||
},
|
||||
{
|
||||
desc: "Multiple rulesets allowed (2)",
|
||||
data: seccompData{nr: 0, arch: linux.AUDIT_ARCH_X86_64},
|
||||
data: seccompData{nr: 0, arch: LINUX_AUDIT_ARCH},
|
||||
want: linux.SECCOMP_RET_KILL_THREAD,
|
||||
},
|
||||
},
|
||||
@@ -160,42 +160,42 @@ func TestBasic(t *testing.T) {
|
||||
specs: []spec{
|
||||
{
|
||||
desc: "Multiple syscalls allowed (1)",
|
||||
data: seccompData{nr: 1, arch: linux.AUDIT_ARCH_X86_64},
|
||||
data: seccompData{nr: 1, arch: LINUX_AUDIT_ARCH},
|
||||
want: linux.SECCOMP_RET_ALLOW,
|
||||
},
|
||||
{
|
||||
desc: "Multiple syscalls allowed (3)",
|
||||
data: seccompData{nr: 3, arch: linux.AUDIT_ARCH_X86_64},
|
||||
data: seccompData{nr: 3, arch: LINUX_AUDIT_ARCH},
|
||||
want: linux.SECCOMP_RET_ALLOW,
|
||||
},
|
||||
{
|
||||
desc: "Multiple syscalls allowed (5)",
|
||||
data: seccompData{nr: 5, arch: linux.AUDIT_ARCH_X86_64},
|
||||
data: seccompData{nr: 5, arch: LINUX_AUDIT_ARCH},
|
||||
want: linux.SECCOMP_RET_ALLOW,
|
||||
},
|
||||
{
|
||||
desc: "Multiple syscalls disallowed (0)",
|
||||
data: seccompData{nr: 0, arch: linux.AUDIT_ARCH_X86_64},
|
||||
data: seccompData{nr: 0, arch: LINUX_AUDIT_ARCH},
|
||||
want: linux.SECCOMP_RET_TRAP,
|
||||
},
|
||||
{
|
||||
desc: "Multiple syscalls disallowed (2)",
|
||||
data: seccompData{nr: 2, arch: linux.AUDIT_ARCH_X86_64},
|
||||
data: seccompData{nr: 2, arch: LINUX_AUDIT_ARCH},
|
||||
want: linux.SECCOMP_RET_TRAP,
|
||||
},
|
||||
{
|
||||
desc: "Multiple syscalls disallowed (4)",
|
||||
data: seccompData{nr: 4, arch: linux.AUDIT_ARCH_X86_64},
|
||||
data: seccompData{nr: 4, arch: LINUX_AUDIT_ARCH},
|
||||
want: linux.SECCOMP_RET_TRAP,
|
||||
},
|
||||
{
|
||||
desc: "Multiple syscalls disallowed (6)",
|
||||
data: seccompData{nr: 6, arch: linux.AUDIT_ARCH_X86_64},
|
||||
data: seccompData{nr: 6, arch: LINUX_AUDIT_ARCH},
|
||||
want: linux.SECCOMP_RET_TRAP,
|
||||
},
|
||||
{
|
||||
desc: "Multiple syscalls disallowed (100)",
|
||||
data: seccompData{nr: 100, arch: linux.AUDIT_ARCH_X86_64},
|
||||
data: seccompData{nr: 100, arch: LINUX_AUDIT_ARCH},
|
||||
want: linux.SECCOMP_RET_TRAP,
|
||||
},
|
||||
},
|
||||
@@ -231,7 +231,7 @@ func TestBasic(t *testing.T) {
|
||||
specs: []spec{
|
||||
{
|
||||
desc: "Syscall disallowed, action trap",
|
||||
data: seccompData{nr: 2, arch: linux.AUDIT_ARCH_X86_64},
|
||||
data: seccompData{nr: 2, arch: LINUX_AUDIT_ARCH},
|
||||
want: linux.SECCOMP_RET_TRAP,
|
||||
},
|
||||
},
|
||||
@@ -254,12 +254,12 @@ func TestBasic(t *testing.T) {
|
||||
specs: []spec{
|
||||
{
|
||||
desc: "Syscall argument allowed",
|
||||
data: seccompData{nr: 1, arch: linux.AUDIT_ARCH_X86_64, args: [6]uint64{0xf, 0xf}},
|
||||
data: seccompData{nr: 1, arch: LINUX_AUDIT_ARCH, args: [6]uint64{0xf, 0xf}},
|
||||
want: linux.SECCOMP_RET_ALLOW,
|
||||
},
|
||||
{
|
||||
desc: "Syscall argument disallowed",
|
||||
data: seccompData{nr: 1, arch: linux.AUDIT_ARCH_X86_64, args: [6]uint64{0xf, 0xe}},
|
||||
data: seccompData{nr: 1, arch: LINUX_AUDIT_ARCH, args: [6]uint64{0xf, 0xe}},
|
||||
want: linux.SECCOMP_RET_TRAP,
|
||||
},
|
||||
},
|
||||
@@ -284,12 +284,12 @@ func TestBasic(t *testing.T) {
|
||||
specs: []spec{
|
||||
{
|
||||
desc: "Syscall argument allowed, two rules",
|
||||
data: seccompData{nr: 1, arch: linux.AUDIT_ARCH_X86_64, args: [6]uint64{0xf}},
|
||||
data: seccompData{nr: 1, arch: LINUX_AUDIT_ARCH, args: [6]uint64{0xf}},
|
||||
want: linux.SECCOMP_RET_ALLOW,
|
||||
},
|
||||
{
|
||||
desc: "Syscall argument allowed, two rules",
|
||||
data: seccompData{nr: 1, arch: linux.AUDIT_ARCH_X86_64, args: [6]uint64{0xe}},
|
||||
data: seccompData{nr: 1, arch: LINUX_AUDIT_ARCH, args: [6]uint64{0xe}},
|
||||
want: linux.SECCOMP_RET_ALLOW,
|
||||
},
|
||||
},
|
||||
@@ -315,7 +315,7 @@ func TestBasic(t *testing.T) {
|
||||
desc: "64bit syscall argument allowed",
|
||||
data: seccompData{
|
||||
nr: 1,
|
||||
arch: linux.AUDIT_ARCH_X86_64,
|
||||
arch: LINUX_AUDIT_ARCH,
|
||||
args: [6]uint64{0, math.MaxUint64 - 1, math.MaxUint32},
|
||||
},
|
||||
want: linux.SECCOMP_RET_ALLOW,
|
||||
@@ -324,7 +324,7 @@ func TestBasic(t *testing.T) {
|
||||
desc: "64bit syscall argument disallowed",
|
||||
data: seccompData{
|
||||
nr: 1,
|
||||
arch: linux.AUDIT_ARCH_X86_64,
|
||||
arch: LINUX_AUDIT_ARCH,
|
||||
args: [6]uint64{0, math.MaxUint64, math.MaxUint32},
|
||||
},
|
||||
want: linux.SECCOMP_RET_TRAP,
|
||||
@@ -333,7 +333,7 @@ func TestBasic(t *testing.T) {
|
||||
desc: "64bit syscall argument disallowed",
|
||||
data: seccompData{
|
||||
nr: 1,
|
||||
arch: linux.AUDIT_ARCH_X86_64,
|
||||
arch: LINUX_AUDIT_ARCH,
|
||||
args: [6]uint64{0, math.MaxUint64, math.MaxUint32 - 1},
|
||||
},
|
||||
want: linux.SECCOMP_RET_TRAP,
|
||||
@@ -358,32 +358,32 @@ func TestBasic(t *testing.T) {
|
||||
specs: []spec{
|
||||
{
|
||||
desc: "GreaterThan: Syscall argument allowed",
|
||||
data: seccompData{nr: 1, arch: linux.AUDIT_ARCH_X86_64, args: [6]uint64{0x10, 0xffffffff}},
|
||||
data: seccompData{nr: 1, arch: LINUX_AUDIT_ARCH, args: [6]uint64{0x10, 0xffffffff}},
|
||||
want: linux.SECCOMP_RET_ALLOW,
|
||||
},
|
||||
{
|
||||
desc: "GreaterThan: Syscall argument disallowed (equal)",
|
||||
data: seccompData{nr: 1, arch: linux.AUDIT_ARCH_X86_64, args: [6]uint64{0xf, 0xffffffff}},
|
||||
data: seccompData{nr: 1, arch: LINUX_AUDIT_ARCH, args: [6]uint64{0xf, 0xffffffff}},
|
||||
want: linux.SECCOMP_RET_TRAP,
|
||||
},
|
||||
{
|
||||
desc: "Syscall argument disallowed (smaller)",
|
||||
data: seccompData{nr: 1, arch: linux.AUDIT_ARCH_X86_64, args: [6]uint64{0x0, 0xffffffff}},
|
||||
data: seccompData{nr: 1, arch: LINUX_AUDIT_ARCH, args: [6]uint64{0x0, 0xffffffff}},
|
||||
want: linux.SECCOMP_RET_TRAP,
|
||||
},
|
||||
{
|
||||
desc: "GreaterThan2: Syscall argument allowed",
|
||||
data: seccompData{nr: 1, arch: linux.AUDIT_ARCH_X86_64, args: [6]uint64{0x10, 0xfbcd000d}},
|
||||
data: seccompData{nr: 1, arch: LINUX_AUDIT_ARCH, args: [6]uint64{0x10, 0xfbcd000d}},
|
||||
want: linux.SECCOMP_RET_ALLOW,
|
||||
},
|
||||
{
|
||||
desc: "GreaterThan2: Syscall argument disallowed (equal)",
|
||||
data: seccompData{nr: 1, arch: linux.AUDIT_ARCH_X86_64, args: [6]uint64{0x10, 0xabcd000d}},
|
||||
data: seccompData{nr: 1, arch: LINUX_AUDIT_ARCH, args: [6]uint64{0x10, 0xabcd000d}},
|
||||
want: linux.SECCOMP_RET_TRAP,
|
||||
},
|
||||
{
|
||||
desc: "GreaterThan2: Syscall argument disallowed (smaller)",
|
||||
data: seccompData{nr: 1, arch: linux.AUDIT_ARCH_X86_64, args: [6]uint64{0x10, 0xa000ffff}},
|
||||
data: seccompData{nr: 1, arch: LINUX_AUDIT_ARCH, args: [6]uint64{0x10, 0xa000ffff}},
|
||||
want: linux.SECCOMP_RET_TRAP,
|
||||
},
|
||||
},
|
||||
@@ -405,12 +405,12 @@ func TestBasic(t *testing.T) {
|
||||
specs: []spec{
|
||||
{
|
||||
desc: "IP: Syscall instruction pointer allowed",
|
||||
data: seccompData{nr: 1, arch: linux.AUDIT_ARCH_X86_64, args: [6]uint64{}, instructionPointer: 0x7aabbccdd},
|
||||
data: seccompData{nr: 1, arch: LINUX_AUDIT_ARCH, args: [6]uint64{}, instructionPointer: 0x7aabbccdd},
|
||||
want: linux.SECCOMP_RET_ALLOW,
|
||||
},
|
||||
{
|
||||
desc: "IP: Syscall instruction pointer disallowed",
|
||||
data: seccompData{nr: 1, arch: linux.AUDIT_ARCH_X86_64, args: [6]uint64{}, instructionPointer: 0x711223344},
|
||||
data: seccompData{nr: 1, arch: LINUX_AUDIT_ARCH, args: [6]uint64{}, instructionPointer: 0x711223344},
|
||||
want: linux.SECCOMP_RET_TRAP,
|
||||
},
|
||||
},
|
||||
@@ -466,7 +466,7 @@ func TestRandom(t *testing.T) {
|
||||
t.Fatalf("bpf.Compile() got error: %v", err)
|
||||
}
|
||||
for i := uint32(0); i < 200; i++ {
|
||||
data := seccompData{nr: i, arch: linux.AUDIT_ARCH_X86_64}
|
||||
data := seccompData{nr: i, arch: LINUX_AUDIT_ARCH}
|
||||
got, err := bpf.Exec(p, data.asInput())
|
||||
if err != nil {
|
||||
t.Errorf("bpf.Exec() got error: %v, for syscall %d", err, i)
|
||||
|
||||
@@ -31,7 +31,6 @@ func main() {
|
||||
|
||||
syscalls := seccomp.SyscallRules{
|
||||
syscall.SYS_ACCEPT: {},
|
||||
syscall.SYS_ARCH_PRCTL: {},
|
||||
syscall.SYS_BIND: {},
|
||||
syscall.SYS_BRK: {},
|
||||
syscall.SYS_CLOCK_GETTIME: {},
|
||||
@@ -41,7 +40,6 @@ func main() {
|
||||
syscall.SYS_DUP3: {},
|
||||
syscall.SYS_EPOLL_CREATE1: {},
|
||||
syscall.SYS_EPOLL_CTL: {},
|
||||
syscall.SYS_EPOLL_WAIT: {},
|
||||
syscall.SYS_EPOLL_PWAIT: {},
|
||||
syscall.SYS_EXIT: {},
|
||||
syscall.SYS_EXIT_GROUP: {},
|
||||
@@ -68,8 +66,6 @@ func main() {
|
||||
syscall.SYS_MUNLOCK: {},
|
||||
syscall.SYS_MUNMAP: {},
|
||||
syscall.SYS_NANOSLEEP: {},
|
||||
syscall.SYS_NEWFSTATAT: {},
|
||||
syscall.SYS_OPEN: {},
|
||||
syscall.SYS_PPOLL: {},
|
||||
syscall.SYS_PREAD64: {},
|
||||
syscall.SYS_PSELECT6: {},
|
||||
@@ -97,6 +93,9 @@ func main() {
|
||||
syscall.SYS_WRITE: {},
|
||||
syscall.SYS_WRITEV: {},
|
||||
}
|
||||
|
||||
arch_syscalls(syscalls)
|
||||
|
||||
die := *dieFlag
|
||||
if !die {
|
||||
syscalls[syscall.SYS_OPENAT] = []seccomp.Rule{
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
// Copyright 2018 The gVisor Authors.
|
||||
//
|
||||
// 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
|
||||
//
|
||||
// http://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.
|
||||
|
||||
// Test binary used to test that seccomp filters are properly constructed and
|
||||
// indeed kill the process on violation.
|
||||
|
||||
// +build amd64
|
||||
|
||||
package main
|
||||
|
||||
import(
|
||||
"syscall"
|
||||
"gvisor.dev/gvisor/pkg/seccomp"
|
||||
)
|
||||
|
||||
func arch_syscalls(syscalls seccomp.SyscallRules) {
|
||||
syscalls[syscall.SYS_ARCH_PRCTL] = []seccomp.Rule{}
|
||||
syscalls[syscall.SYS_EPOLL_WAIT] = []seccomp.Rule{}
|
||||
syscalls[syscall.SYS_NEWFSTATAT] = []seccomp.Rule{}
|
||||
syscalls[syscall.SYS_OPEN] = []seccomp.Rule{}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
// Copyright 2018 The gVisor Authors.
|
||||
//
|
||||
// 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
|
||||
//
|
||||
// http://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.
|
||||
|
||||
// Test binary used to test that seccomp filters are properly constructed and
|
||||
// indeed kill the process on violation.
|
||||
|
||||
// +build arm64
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"gvisor.dev/gvisor/pkg/seccomp"
|
||||
)
|
||||
|
||||
func arch_syscalls(syscalls seccomp.SyscallRules) {
|
||||
syscalls[syscall.SYS_FSTATAT] = []seccomp.Rule{}
|
||||
}
|
||||
Reference in New Issue
Block a user