add_seccomp.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package lib
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "fmt"
  6. "os"
  7. "syscall"
  8. "unsafe"
  9. "github.com/langgenius/dify-sandbox/internal/static"
  10. sg "github.com/seccomp/libseccomp-golang"
  11. )
  12. //var allow_syscalls = []int{}
  13. func InitSeccomp() error {
  14. // disabled_syscall, err := strconv.Atoi(os.Getenv("DISABLE_SYSCALL"))
  15. // if err != nil {
  16. // disabled_syscall = -1
  17. // }
  18. ctx, err := sg.NewFilter(sg.ActKillProcess)
  19. if err != nil {
  20. return err
  21. }
  22. defer ctx.Release()
  23. // for i := 0; i < 400; i++ {
  24. // allow_syscalls = append(allow_syscalls, i)
  25. // }
  26. for _, syscall := range static.ALLOW_SYSCALLS {
  27. // if syscall == disabled_syscall {
  28. // continue
  29. // }
  30. err = ctx.AddRule(sg.ScmpSyscall(syscall), sg.ActAllow)
  31. if err != nil {
  32. return err
  33. }
  34. }
  35. reader, writer, err := os.Pipe()
  36. if err != nil {
  37. return err
  38. }
  39. defer reader.Close()
  40. defer writer.Close()
  41. file := os.NewFile(uintptr(writer.Fd()), "pipe")
  42. ctx.ExportBPF(file)
  43. // read from pipe
  44. data := make([]byte, 4096)
  45. n, err := reader.Read(data)
  46. if err != nil {
  47. return err
  48. }
  49. // load bpf
  50. sock_filters := make([]syscall.SockFilter, n/8)
  51. bytesBuffer := bytes.NewBuffer(data)
  52. err = binary.Read(bytesBuffer, binary.LittleEndian, &sock_filters)
  53. if err != nil {
  54. return err
  55. }
  56. bpf := syscall.SockFprog{
  57. Len: uint16(len(sock_filters)),
  58. Filter: &sock_filters[0],
  59. }
  60. _, _, err2 := syscall.RawSyscall6(syscall.SYS_PRCTL, syscall.PR_SET_SECCOMP, 2, uintptr(unsafe.Pointer(&bpf)), 0, 0, 0)
  61. if err2 != 0 {
  62. return fmt.Errorf("prctl failed: %v", err2)
  63. }
  64. return nil
  65. }