登录
首页 >  Golang >  Go问答

在子进程中应用 seccomp 过滤器

来源:stackoverflow

时间:2024-02-21 08:21:24 364浏览 收藏

学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《在子进程中应用 seccomp 过滤器》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

问题内容

我想知道是否可以在 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-bpf 和 https://github.com/seccomp/libseccomp-golang 但这些库似乎只支持在当前进程中安装 seccomp 过滤器(以及任何子进程)从当前进程生成)。我只想在子级中安装过滤器,而不是在父级中安装,因为我不希望父级也被沙箱化。

在 c 中,在子进程中安装 seccomp 过滤器的机制是分叉,在当前进程中(从子进程中)安装过滤器,然后执行。然而,go 中似乎不支持像这样分离 fork 和 exec。有什么办法可以解决这个问题,还是我需要使用 c 来正确完成此操作?

是否可以扩展sysprocattr以允许seccomp过滤器,或者允许在fork之后和exec之前运行任意代码(在某些时候我假设它调用fork然后调用exec)?我将如何实施这个?


解决方案


我通过使用此处的 forkexec 包解决了这个问题:https://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)

这需要使用 riyle/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
}

终于介绍完啦!小伙伴们,这篇关于《在子进程中应用 seccomp 过滤器》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>