我试图在内核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生成的进程的子进程?
有两个库可以用于此:
- https://godoc.org/github.com/tfogal/ptrace-Package ptrace为ptrace系统调用提供了一个接口
- https://godoc.org/github.com/seccomp/libseccomp-golang-Package seccomp为libseccomp提供绑定,libsecomp是一个封装Linux seccomp系统调用的库。Seccomp使应用程序能够限制其自身及其子级的系统调用使用
免责声明:我是一名c程序员,为libseccomp做出了贡献;但是golang不是我的专长,所以我不确定你的示例代码在那种语言中的等价物是什么。