seccomp.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package lib
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "os"
  6. "syscall"
  7. "unsafe"
  8. sg "github.com/seccomp/libseccomp-golang"
  9. )
  10. func Seccomp(allowed_syscalls []int, allowed_not_kill_syscalls []int) error {
  11. ctx, err := sg.NewFilter(sg.ActKillProcess)
  12. if err != nil {
  13. return err
  14. }
  15. reader, writer, err := os.Pipe()
  16. if err != nil {
  17. return err
  18. }
  19. defer reader.Close()
  20. defer writer.Close()
  21. for _, syscall := range allowed_syscalls {
  22. ctx.AddRule(sg.ScmpSyscall(syscall), sg.ActAllow)
  23. }
  24. for _, syscall := range allowed_not_kill_syscalls {
  25. ctx.AddRule(sg.ScmpSyscall(syscall), sg.ActErrno)
  26. }
  27. file := os.NewFile(uintptr(writer.Fd()), "pipe")
  28. ctx.ExportBPF(file)
  29. // read from pipe
  30. data := make([]byte, 4096)
  31. n, err := reader.Read(data)
  32. if err != nil {
  33. return err
  34. }
  35. // load bpf
  36. sock_filters := make([]syscall.SockFilter, n/8)
  37. bytesBuffer := bytes.NewBuffer(data)
  38. err = binary.Read(bytesBuffer, binary.LittleEndian, &sock_filters)
  39. if err != nil {
  40. return err
  41. }
  42. bpf := syscall.SockFprog{
  43. Len: uint16(len(sock_filters)),
  44. Filter: &sock_filters[0],
  45. }
  46. _, _, err2 := syscall.Syscall(
  47. SYS_SECCOMP,
  48. uintptr(SeccompSetModeFilter),
  49. uintptr(SeccompFilterFlagTSYNC),
  50. uintptr(unsafe.Pointer(&bpf)),
  51. )
  52. if err2 != 0 {
  53. return err2
  54. }
  55. return nil
  56. }