aboutsummaryrefslogtreecommitdiffhomepage
path: root/helper/bwrap/seccomp.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-01-22 01:51:10 +0900
committerOphestra <cat@gensokyo.uk>2025-01-22 01:52:57 +0900
commit9a239fa1a5ad2ff248ca7a9d39342f66926c9fef (patch)
tree09efadb2ddf4eaeaf153d7e4b7d73e1b20d2fc1a /helper/bwrap/seccomp.go
parent82029948e6d8d047edc02ccff354e16c419e5742 (diff)
helper/bwrap: integrate seccomp into helper interface
This makes API usage much cleaner, and encapsulates all bwrap arguments in argsWt. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'helper/bwrap/seccomp.go')
-rw-r--r--helper/bwrap/seccomp.go83
1 files changed, 83 insertions, 0 deletions
diff --git a/helper/bwrap/seccomp.go b/helper/bwrap/seccomp.go
new file mode 100644
index 00000000..abc2738b
--- /dev/null
+++ b/helper/bwrap/seccomp.go
@@ -0,0 +1,83 @@
+package bwrap
+
+/*
+#cgo linux pkg-config: --static libseccomp
+
+#include "seccomp-export.h"
+*/
+import "C"
+import (
+ "errors"
+ "fmt"
+ "os"
+ "runtime"
+)
+
+var CPrintln func(v ...any)
+
+var resErr = [...]error{
+ 0: nil,
+ 1: errors.New("seccomp_init failed"),
+ 2: errors.New("seccomp_arch_add failed"),
+ 3: errors.New("seccomp_arch_add failed (multiarch)"),
+ 4: errors.New("internal libseccomp failure"),
+ 5: errors.New("seccomp_rule_add failed"),
+ 6: errors.New("seccomp_export_bpf failed"),
+}
+
+type (
+ syscallOpts = C.f_syscall_opts
+)
+
+const (
+ flagDenyNS syscallOpts = C.F_DENY_NS
+ flagDenyTTY syscallOpts = C.F_DENY_TTY
+ flagDenyDevel syscallOpts = C.F_DENY_DEVEL
+ flagMultiarch syscallOpts = C.F_MULTIARCH
+ flagLinux32 syscallOpts = C.F_LINUX32
+ flagCan syscallOpts = C.F_CAN
+ flagBluetooth syscallOpts = C.F_BLUETOOTH
+)
+
+func tmpfile() (*os.File, error) {
+ fd, err := C.f_tmpfile_fd()
+ if err != nil {
+ return nil, err
+ }
+ return os.NewFile(uintptr(fd), "tmpfile"), err
+}
+
+func exportFilter(fd uintptr, opts syscallOpts) error {
+ var (
+ arch C.uint32_t = 0
+ multiarch C.uint32_t = 0
+ )
+ switch runtime.GOARCH {
+ case "386":
+ arch = C.SCMP_ARCH_X86
+ case "amd64":
+ arch = C.SCMP_ARCH_X86_64
+ multiarch = C.SCMP_ARCH_X86
+ case "arm":
+ arch = C.SCMP_ARCH_ARM
+ case "arm64":
+ arch = C.SCMP_ARCH_AARCH64
+ multiarch = C.SCMP_ARCH_ARM
+ }
+
+ res, err := C.f_export_bpf(C.int(fd), arch, multiarch, opts)
+ if re := resErr[res]; re != nil {
+ if err == nil {
+ return re
+ }
+ return fmt.Errorf("%s: %v", re.Error(), err)
+ }
+ return err
+}
+
+//export F_println
+func F_println(v *C.char) {
+ if CPrintln != nil {
+ CPrintln(C.GoString(v))
+ }
+}