我正在尝试在内核 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.ForkExec或exec.Command,但两者似乎都仅限于可以通过参数syscall配置的一组 pre-exec 操作.SysProcAttr,虽然它提供对 PTRACE_TRACEME 调用的支持,但它不提供对 SECCOMP 所需的 prctl() 的任何支持。
有没有办法从 GoLang 生成的进程中启动一个“ptraceable”“seccomped”子进程?