有可能从Go进程中应用Linux内核SECCOMP配置文件吗



我试图在内核SECCOMP过滤器的支持下实现一个系统调用跟踪器,通过过滤一些系统调用类型来减少开销。

我发现的所有实现都是用C语言实现的,由于Go线程化/Go例程和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。命令,但两者似乎都局限于可以通过参数syscall配置的一组预执行操作。SysProcAttr,虽然它提供了对PTRACE_TRACEME调用的支持,但它不提供对SECCOMP所需的prctl((的任何支持。

有没有办法推出一个";ptraceable"seccomped";GoLang生成的进程的子进程?

有两个库可以用于此:

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

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

最新更新