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

时间:2018-12-21 00:05:15

标签: c linux seccomp

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

from dbfread import DBF
from struct import *

table = DBF('docum.dbf', load=True)
for item in table:
    print (item)

我这样编译:

Traceback (most recent call last):
  File "C:\Users\user\rdbfs.py", line 4, in <module>
    table = DBF('docum.dbf', load=True)
  File "C:\Python3\lib\site-packages\dbfread\dbf.py", line 121, in __init__
    self._read_header(infile)
  File "C:\Python3\lib\site-packages\dbfread\dbf.py", line 206, in _read_header
    self.header = DBFHeader.read(infile)
  File "C:\Python3\lib\site-packages\dbfread\struct_parser.py", line 41, in read
    return self.unpack(file.read(self.struct.size))
  File "C:\Python3\lib\site-packages\dbfread\struct_parser.py", line 36, in unpack
    items = zip(self.names, self.struct.unpack(data))
struct.error: unpack requires a buffer of 32 bytes
[Finished in 0.2s with exit code 1]

然后运行以获取以下输出:

#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;
}

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

1 个答案:

答案 0 :(得分:3)

来自glibc的

fork()实际上可能使用系统调用clone而非fork,请参见man fork

您可以通过查看strace ./a.out来验证这一点。

因此请尝试:

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

相反。

无论如何,您都应该使用default-block而不是default-allow的系统调用,因为否则,您将需要考虑所有现有的系统调用以及它们是否会产生不良影响(例如,创建子进程至少要{{ 1}}和vforkfork之外),还因为新的内核版本可能添加了任意的系统调用,这可能再次产生不希望的效果。