Я загружаю фильтр seccomp, чтобы запретить fork (), но все еще могу использовать fork () без проблем - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь создать фильтр 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 работают успешно.Может кто-нибудь помочь мне понять, что я делаю не так?Спасибо!

1 Ответ

0 голосов
/ 21 декабря 2018

fork() из glibc, вероятно, фактически использует системный вызов clone вместо fork, см. man fork.

Вы можете убедиться в этом, взглянув на strace ./a.out.

Поэтому попробуйте:

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

.

Вы должны в любом случаеdefault-block и not-default-allow syscalls, потому что в противном случае вам нужно будет рассмотреть все существующие системные вызовы и определить, могут ли они иметь нежелательный эффект (например, для создания дочернего процесса должно быть не менее vfork в дополнение к fork иclone), а также потому, что в новых версиях ядра могут добавляться произвольные системные вызовы, которые могут снова привести к нежелательному эффекту.

...