|
@@ -23,7 +23,7 @@ func (s *SeccompRunner) WithSeccomp(closures func() error) error {
|
|
|
defer ctx.Release()
|
|
|
|
|
|
for call := range static.ALLOW_SYSCALLS {
|
|
|
- err = ctx.AddRule(sg.ScmpSyscall(call), sg.ActAllow)
|
|
|
+ err = ctx.AddRule(sg.ScmpSyscall(static.ALLOW_SYSCALLS[call]), sg.ActAllow)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
@@ -45,7 +45,6 @@ func (s *SeccompRunner) WithSeccomp(closures func() error) error {
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
-
|
|
|
// load bpf
|
|
|
sock_filters := make([]syscall.SockFilter, n/8)
|
|
|
bytesBuffer := bytes.NewBuffer(data)
|
|
@@ -90,11 +89,13 @@ func (s *SeccompRunner) WithSeccomp(closures func() error) error {
|
|
|
|
|
|
defer syscall.Close(int(stdout_writer))
|
|
|
defer syscall.Close(int(stderr_writer))
|
|
|
+ defer syscall.Exit(0)
|
|
|
|
|
|
bpf := syscall.SockFprog{
|
|
|
Len: uint16(len(sock_filters)),
|
|
|
Filter: &sock_filters[0],
|
|
|
}
|
|
|
+
|
|
|
_, _, err2 := syscall.RawSyscall6(syscall.SYS_PRCTL, syscall.PR_SET_SECCOMP, 2, uintptr(unsafe.Pointer(&bpf)), 0, 0, 0)
|
|
|
if err2 != 0 {
|
|
|
response := fmt.Sprintf("prctl failed: %d\n", err2)
|
|
@@ -102,6 +103,20 @@ func (s *SeccompRunner) WithSeccomp(closures func() error) error {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
+ _, _, err2 = syscall.RawSyscall(syscall.SYS_SETGID, uintptr(static.SANDBOX_GROUP_ID), 0, 0)
|
|
|
+ if err2 != 0 {
|
|
|
+ response := fmt.Sprintf("setgid failed: %v\n", err2)
|
|
|
+ _, _ = syscall.Write(int(stderr_writer), []byte(response))
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ _, _, err2 = syscall.RawSyscall(syscall.SYS_SETUID, uintptr(static.SANDBOX_USER_UID), 0, 0)
|
|
|
+ if err2 != 0 {
|
|
|
+ response := fmt.Sprintf("setuid failed: %v\n", err2)
|
|
|
+ _, _ = syscall.Write(int(stderr_writer), []byte(response))
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
err := closures()
|
|
|
if err != nil {
|
|
|
response := fmt.Sprintf("%v\n", err)
|
|
@@ -121,12 +136,12 @@ func (s *SeccompRunner) WithSeccomp(closures func() error) error {
|
|
|
|
|
|
// read from stderr pipe
|
|
|
data := make([]byte, 4096)
|
|
|
- n, err := syscall.Read(int(stderr_reader), data)
|
|
|
+ _, err := syscall.Read(int(stderr_reader), data)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
- fmt.Println(string(data[:n]))
|
|
|
+ fmt.Println(string(data))
|
|
|
}
|
|
|
|
|
|
return nil
|