我加载了一个 seccomp 过滤器以禁止 fork(),但仍然可以毫无问题地使用 fork()

I load a seccomp filter to disallow fork(), but can still use fork() with no problem

我正在尝试创建一个 seccomp 过滤器,它将 fork() 的使用列入黑名单。这是我的代码:

#include <seccomp.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>

int main(void) {
        int rc = -1;
        int pid_t;
        scmp_filter_ctx ctx;
        ctx = seccomp_init(SCMP_ACT_ALLOW);

        // possible issue for torsocks: needs arg count
        rc = seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(fork), 0);
        printf("seccomp rule add return value: %d\n", rc);
        rc = seccomp_load(ctx);
        printf("seccomd_load return value: %d\n", rc);
        pid_t = fork();
        printf("%d\n", pid_t);
        seccomp_release(ctx);
        return 0;
}

我是这样编译的:

hc01@HC01:~/torsocks$ gcc test_seccomp.c -lseccomp

然后运行得到如下输出:

hc01@HC01:~/torsocks$ ./a.out 
seccomp rule add return value: 0
seccomd_load return value: 0
15384
0

暗示我能够成功分叉并且 seccomp_add_rule 和 seccomp_load 是 运行 成功。有人可以帮助我了解我做错了什么吗?谢谢!

来自 glibc 的

fork() 可能实际上使用系统调用 clone 而不是 fork,请参阅 man fork

您可以通过查看 strace ./a.out.

来验证这一点

因此尝试:

rc = seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(clone), 0);

相反。

在任何情况下,您都应该默认阻止而不是默认允许系统调用,否则您将需要考虑所有现有的系统调用以及它们是否会产生不良影响(例如,为了创建子进程,至少会有vfork 除了 forkclone) 之外,还因为新内核版本可能会添加任意系统调用,这可能会再次产生不良影响。