【发布时间】:2020-11-12 12:26:18
【问题描述】:
我正在尝试实现一个支持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);
经过一些研究,我发现为了在 Go Lang 中执行类似 fork() 的函数,我们可以使用 syscall.ForkExec 或 exec.Command,但两者似乎都仅限于可以执行的预执行操作集通过参数syscall.SysProcAttr 进行配置,虽然它提供了对 PTRACE_TRACEME 调用的支持,但它不提供对 SECCOMP 所需的 prctl() 的任何支持。
有没有办法从 GoLang 生成的进程中启动“ptraceable”“seccomped”子进程?
【问题讨论】:
-
您没有提及选项的原因是您正在查看跨平台库,并且您正在搜索 Linux 特定人员 (Seccomp)。我还没有完成您的要求,但找到了这个:golang.org/pkg/syscall/#Syscall 和此处的示例:*.com/a/43183700/544721,也许这就是您想要的处理方式?
-
我没有跨平台库的需求,只是没有找到任何直接使用 fork() 系统调用的建议。我会试一试。您能否提供您的评论作为答案?如果它有效,它可以正确解决我的问题:)
标签: go system-calls ptrace seccomp