4

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

我发现的所有实现都在 C 中,由于 Go 线程/go-routines 和fork().

示例代码(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 Lang 中执行类似的功能,我们可以使用syscall.ForkExecexec.Command,但两者似乎都仅限于可以通过参数syscall配置的一组 pre-exec 操作.SysProcAttr,虽然它提供对 PTRACE_TRACEME 调用的支持,但它不提供对 SECCOMP 所需的 prctl() 的任何支持。

有没有办法从 GoLang 生成的进程中启动一个“ptraceable”“seccomped”子进程?

4

1 回答 1

1

有两个库可以用于此:

  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 使应用程序能够限制其自身及其子级的系统调用使用。

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

于 2020-08-28T11:14:35.453 回答