go之是否可以从 Go 进程应用 Linux 内核 SECCOMP 配置文件

daizhj 阅读:20 2025-06-02 22:19:02 评论:0

我正在尝试在 kernel SECCOMP 的支持下实现系统调用跟踪器过滤器通过过滤一些系统调用类型来减少开销。
我发现的所有实现都在 C 中,由于 Go 线程/go-routines 和 fork() 的特殊考虑,我无法弄清楚如何将其映射到 Go。 .
示例代码(C):

if ((pid = fork()) == 0) { 
 
    ptrace(PTRACE_TRACEME, 0, 0, 0); 
    /* To avoid the need for CAP_SYS_ADMIN */ 
    if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1) { 
        perror("prctl(PR_SET_NO_NEW_PRIVS)"); 
        return 1; 
    } 
    if (prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog) == -1) { 
        perror("when setting seccomp filter"); 
        return 1; 
    } 
    kill(getpid(), SIGSTOP); 
    return execvp(argv[1], argv + 1); 
经过一些研究,我发现为了执行 fork()我们可以使用 Go 语言中的类似函数 syscall.ForkExecexec.Command , 但两者似乎都仅限于可以通过参数 syscall.SysProcAttr 配置的一组 pre-exec 操作,虽然它提供对 PTRACE_TRACEME 调用的支持,但它不提供对 SECCOMP 所需的 prctl() 的任何支持。
有没有办法从 GoLang 生成的进程中启动一个“ptraceable”“seccomped”子进程?

请您参考如下方法:

有两个库可以用于此:

  • https://godoc.org/github.com/tfogal/ptrace - 包 ptrace 提供了 ptrace 系统调用的接口(interface)。
  • https://godoc.org/github.com/seccomp/libseccomp-golang - 包 seccomp 为 libseccomp 提供绑定(bind),这是一个包装 Linux seccomp 系统调用的库。 Seccomp 使应用程序能够限制其自身及其子级的系统调用使用。

  • 免责声明:我是一名 c 程序员,并为 libseccomp 做出了贡献;但是 golang 不是我的专长,所以我不确定在那种语言中你的示例代码是什么等价物。


    标签:linux
    声明

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    关注我们

    一个IT知识分享的公众号