我正在使用 Go 代码作为模块编写一个简单的沙箱,我需要加载 seccomp 规则来限制命令的系统调用。
我曾经os/exec
运行该命令,但在命令真正启动之前我无论如何都找不到加载过滤器。
我发现 Docker 使用 fork 调用,它需要在程序中添加代码main
,但如果沙箱是一个模块,我认为这不是一个好方法。
在 C 语言中,我们可以像这样使用 seccomp:
int main() {
int pid = fork();
if (pid > 0) {
children();
} else if (pid == 0) {
struct rusage usage{};
int status;
if (wait4(pid, &status, WSTOPPED, &usage) == -1) {
kill(pid, SIGKILL);
}
}
}
void children() {
/* load seccomp filter */
scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL & SCMP_ACT_LOG);
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 0);
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 0);
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit), 0);
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(sigreturn), 0);
seccomp_load(ctx);
execvp("bash", {"bash"});
}
在 Go 中,我不知道该怎么做。
英语不是我的第一语言。