2

我正在使用 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 中,我不知道该怎么做。

英语不是我的第一语言。

4

0 回答 0