Files
gvisor/pkg/seccomp/victim/seccomp_test_victim.go
Michael PrattandgVisor bot 46833fbeee Allow prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME) through syscall filters
As of https://go.dev/cl/646095, the Go runtime calls
prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME) when mapping memory to annotate
mappings in /proc/self/maps. Since this is a system call made throughout the
application lifetime, it needs to be allowed through the system call filters.

PiperOrigin-RevId: 734182524
2025-03-06 09:54:22 -08:00

120 lines
4.5 KiB
Go

// 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.
package main
import (
"flag"
"fmt"
"os"
"golang.org/x/sys/unix"
"gvisor.dev/gvisor/pkg/seccomp"
)
func main() {
dieFlag := flag.Bool("die", false, "trips over the filter if true")
flag.Parse()
syscalls := seccomp.MakeSyscallRules(map[uintptr]seccomp.SyscallRule{
unix.SYS_ACCEPT: seccomp.MatchAll{},
unix.SYS_BIND: seccomp.MatchAll{},
unix.SYS_BRK: seccomp.MatchAll{},
unix.SYS_CLOCK_GETTIME: seccomp.MatchAll{},
unix.SYS_CLONE: seccomp.MatchAll{},
unix.SYS_CLOSE: seccomp.MatchAll{},
unix.SYS_DUP: seccomp.MatchAll{},
unix.SYS_DUP3: seccomp.MatchAll{},
unix.SYS_EPOLL_CREATE1: seccomp.MatchAll{},
unix.SYS_EPOLL_CTL: seccomp.MatchAll{},
unix.SYS_EPOLL_PWAIT: seccomp.MatchAll{},
unix.SYS_EXIT: seccomp.MatchAll{},
unix.SYS_EXIT_GROUP: seccomp.MatchAll{},
unix.SYS_FALLOCATE: seccomp.MatchAll{},
unix.SYS_FCHMOD: seccomp.MatchAll{},
unix.SYS_FCNTL: seccomp.MatchAll{},
unix.SYS_FSTAT: seccomp.MatchAll{},
unix.SYS_FSYNC: seccomp.MatchAll{},
unix.SYS_FTRUNCATE: seccomp.MatchAll{},
unix.SYS_FUTEX: seccomp.MatchAll{},
unix.SYS_GETDENTS64: seccomp.MatchAll{},
unix.SYS_GETPEERNAME: seccomp.MatchAll{},
unix.SYS_GETPID: seccomp.MatchAll{},
unix.SYS_GETSOCKNAME: seccomp.MatchAll{},
unix.SYS_GETSOCKOPT: seccomp.MatchAll{},
unix.SYS_GETTID: seccomp.MatchAll{},
unix.SYS_GETTIMEOFDAY: seccomp.MatchAll{},
unix.SYS_LISTEN: seccomp.MatchAll{},
unix.SYS_LSEEK: seccomp.MatchAll{},
unix.SYS_MADVISE: seccomp.MatchAll{},
unix.SYS_MINCORE: seccomp.MatchAll{},
unix.SYS_MMAP: seccomp.MatchAll{},
unix.SYS_MPROTECT: seccomp.MatchAll{},
unix.SYS_MUNLOCK: seccomp.MatchAll{},
unix.SYS_MUNMAP: seccomp.MatchAll{},
unix.SYS_NANOSLEEP: seccomp.MatchAll{},
unix.SYS_OPENAT: seccomp.MatchAll{},
unix.SYS_PPOLL: seccomp.MatchAll{},
unix.SYS_PRCTL: seccomp.MatchAll{},
unix.SYS_PREAD64: seccomp.MatchAll{},
unix.SYS_PSELECT6: seccomp.MatchAll{},
unix.SYS_PWRITE64: seccomp.MatchAll{},
unix.SYS_READ: seccomp.MatchAll{},
unix.SYS_READLINKAT: seccomp.MatchAll{},
unix.SYS_READV: seccomp.MatchAll{},
unix.SYS_RECVMSG: seccomp.MatchAll{},
unix.SYS_RENAMEAT: seccomp.MatchAll{},
unix.SYS_RESTART_SYSCALL: seccomp.MatchAll{},
unix.SYS_RT_SIGACTION: seccomp.MatchAll{},
unix.SYS_RT_SIGPROCMASK: seccomp.MatchAll{},
unix.SYS_RT_SIGRETURN: seccomp.MatchAll{},
unix.SYS_SCHED_YIELD: seccomp.MatchAll{},
unix.SYS_SENDMSG: seccomp.MatchAll{},
unix.SYS_SETITIMER: seccomp.MatchAll{},
unix.SYS_SET_ROBUST_LIST: seccomp.MatchAll{},
unix.SYS_SETSOCKOPT: seccomp.MatchAll{},
unix.SYS_SHUTDOWN: seccomp.MatchAll{},
unix.SYS_SIGALTSTACK: seccomp.MatchAll{},
unix.SYS_SOCKET: seccomp.MatchAll{},
unix.SYS_SYNC_FILE_RANGE: seccomp.MatchAll{},
unix.SYS_TGKILL: seccomp.MatchAll{},
unix.SYS_UTIMENSAT: seccomp.MatchAll{},
unix.SYS_WRITE: seccomp.MatchAll{},
unix.SYS_WRITEV: seccomp.MatchAll{},
})
arch_syscalls(syscalls)
// We choose a syscall that is unlikely to be called by Go runtime,
// even with race or other instrumentation enabled.
syscall := uintptr(unix.SYS_UMASK)
die := *dieFlag
if !die {
syscalls.Set(syscall, seccomp.PerArg{
seccomp.EqualTo(0),
})
}
if err := seccomp.Install(syscalls, seccomp.NewSyscallRules(), seccomp.DefaultProgramOptions()); err != nil {
fmt.Printf("Failed to install seccomp: %v\n", err)
os.Exit(1)
}
fmt.Printf("Filters installed\n")
unix.RawSyscall(syscall, 0, 0, 0)
fmt.Printf("Syscall was allowed!!!\n")
}