gpt4 book ai didi

linux - 在子级中安装seccomp过滤器

转载 作者:行者123 更新时间:2023-12-03 10:09:18 26 4
gpt4 key购买 nike

我想知道是否可以在Go程序的子进程中安装seccomp过滤器。目前,我正在生成子进程,如下所示:

cmd := exec.Command(target)
cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin
cmd.Stderr = os.Stderr
cmd.SysProcAttr = &unix.SysProcAttr{
Ptrace: true,
}

cmd.Start()
cmd.Wait()
这可以正常工作,并且 SysProcAttr提供了一种在子进程中启用Ptrace的机制。但是,似乎也没有在子级中安装seccomp过滤器的任何支持。我知道 https://github.com/elastic/go-seccomp-bpfhttps://github.com/seccomp/libseccomp-golang,但是这些库似乎仅支持在当前进程(以及从当前进程派生的任何子级)中安装seccomp过滤器。我只想在子级而不是父级中安装筛选器,因为我也不想在父级中安装筛选器。
在C语言中,在子进程中安装seccomp过滤器的机制是派生,在当前进程中(从子进程中)安装过滤器,然后执行。但是,似乎在Go中似乎没有支持将fork和exec分开。有什么办法解决这个问题,还是我需要使用C才能正确地做到这一点?
可以将 SysProcAttr扩展为允许使用seccomp过滤器,还是允许在fork之后和exec之前运行任意代码(在某些时候,我假设它先调用fork然后执行)?我将如何实现呢?

最佳答案

我从这里使用forkexechttps://godoc.org/github.com/criyle/go-sandbox/pkg/forkexecelastic/go-seccomp-bpf解决了这个问题。 Seccomp过滤器可以这样安装:

import bseccomp "github.com/elastic/go-seccomp-bpf"
import "github.com/criyle/go-sandbox/pkg/forkexec"

// ...

policy := bseccomp.Policy{
DefaultAction: bseccomp.ActionAllow,
Syscalls: []bseccomp.SyscallGroup{
{
Action: bseccomp.ActionTrace,
Names: []string{
"write",
},
},
},
}

program, err := policy.Assemble()
must(err)
filter, err := ExportBPF(program)
must(err)

bin, err := os.Open(args[0])
must(err)
cmd := forkexec.Runner{
Args: args[0:],
ExecFile: bin.Fd(),
Seccomp: filter.SockFprog(),
StopBeforeSeccomp: true,
Ptrace: true,
}

pid, err := cmd.Start()
must(err)
var ws unix.WaitStatus
_, err = unix.Wait4(pid, &ws, 0, nil)
must(err)
这需要使用 criyle/go-sandbox/pkg/seccomp包进行一些附加功能。
// ExportBPF convert libseccomp filter to kernel readable BPF content
func ExportBPF(filter []bpf.Instruction) (seccomp.Filter, error) {
raw, err := bpf.Assemble(filter)
if err != nil {
return nil, err
}
return sockFilter(raw), nil
}

func sockFilter(raw []bpf.RawInstruction) []syscall.SockFilter {
filter := make([]syscall.SockFilter, 0, len(raw))
for _, instruction := range raw {
filter = append(filter, syscall.SockFilter{
Code: instruction.Op,
Jt: instruction.Jt,
Jf: instruction.Jf,
K: instruction.K,
})
}
return filter
}

关于linux - 在子级中安装seccomp过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65153051/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com