| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 | 
							- package lib
 
- import (
 
- 	"bytes"
 
- 	"encoding/binary"
 
- 	"os"
 
- 	"syscall"
 
- 	"unsafe"
 
- 	sg "github.com/seccomp/libseccomp-golang"
 
- )
 
- func Seccomp(allowed_syscalls []int, allowed_not_kill_syscalls []int) error {
 
- 	ctx, err := sg.NewFilter(sg.ActKillProcess)
 
- 	if err != nil {
 
- 		return err
 
- 	}
 
- 	reader, writer, err := os.Pipe()
 
- 	if err != nil {
 
- 		return err
 
- 	}
 
- 	defer reader.Close()
 
- 	defer writer.Close()
 
- 	for _, syscall := range allowed_syscalls {
 
- 		ctx.AddRule(sg.ScmpSyscall(syscall), sg.ActAllow)
 
- 	}
 
- 	for _, syscall := range allowed_not_kill_syscalls {
 
- 		ctx.AddRule(sg.ScmpSyscall(syscall), sg.ActErrno)
 
- 	}
 
- 	file := os.NewFile(uintptr(writer.Fd()), "pipe")
 
- 	ctx.ExportBPF(file)
 
- 	// read from pipe
 
- 	data := make([]byte, 4096)
 
- 	n, err := reader.Read(data)
 
- 	if err != nil {
 
- 		return err
 
- 	}
 
- 	// load bpf
 
- 	sock_filters := make([]syscall.SockFilter, n/8)
 
- 	bytesBuffer := bytes.NewBuffer(data)
 
- 	err = binary.Read(bytesBuffer, binary.LittleEndian, &sock_filters)
 
- 	if err != nil {
 
- 		return err
 
- 	}
 
- 	bpf := syscall.SockFprog{
 
- 		Len:    uint16(len(sock_filters)),
 
- 		Filter: &sock_filters[0],
 
- 	}
 
- 	_, _, err2 := syscall.Syscall(
 
- 		SYS_SECCOMP,
 
- 		uintptr(SeccompSetModeFilter),
 
- 		uintptr(SeccompFilterFlagTSYNC),
 
- 		uintptr(unsafe.Pointer(&bpf)),
 
- 	)
 
- 	if err2 != 0 {
 
- 		return err2
 
- 	}
 
- 	return nil
 
- }
 
 
  |