登录
首页 >  Golang >  Go问答

可以在 Go 应用程序中使用 Linux 内核 SECCOMP 配置文件吗?

来源:stackoverflow

时间:2024-03-10 22:39:24 244浏览 收藏

大家好,我们又见面了啊~本文《可以在 Go 应用程序中使用 Linux 内核 SECCOMP 配置文件吗?》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我正在尝试在内核 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);

经过一些研究,我发现为了在 go lang 中执行 fork() 之类的函数,我们可以使用 syscall.forkexec 或 exec.command,但两者似乎都仅限于预执行操作集可以通过参数syscall.sysprocattr进行配置,虽然它提供对ptrace_traceme调用的支持,但它不提供对seccomp所需的prctl()的任何支持。

是否有某种方法可以从 golang 生成的进程启动“ptraceable”“seccomped”子进程?


解决方案


有两个库可以用于此目的:

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

免责声明:我是一名 C 程序员,并为 libseccomp 做出了贡献;但 golang 不是我的专长,所以我不确定该语言中的示例代码的等效内容是什么。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《可以在 Go 应用程序中使用 Linux 内核 SECCOMP 配置文件吗?》文章吧,也可关注golang学习网公众号了解相关技术文章。

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