对seccomp的隐式引用

对seccomp的隐式引用,c,system-calls,bpf,seccomp,C,System Calls,Bpf,Seccomp,问题: 我试图使用seccomp,但我不明白为什么gcc告诉我seccomp函数调用有一个隐式声明 #define _GNU_SOURCE #include <stddef.h> // offsetof #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <linux/audit.h> // arch #include <linux/filter.

问题: 我试图使用seccomp,但我不明白为什么gcc告诉我seccomp函数调用有一个隐式声明

#define _GNU_SOURCE
#include <stddef.h> // offsetof
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/audit.h> // arch
#include <linux/filter.h>
#include <linux/seccomp.h>
#include <sys/prctl.h>
#include <sys/syscall.h> // syscall numbers

struct sock_filter  bpfcode[] = {

    /* validate the architecture */
    BPF_STMT(BPF_LD+BPF_W+BPF_ABS, (offsetof(struct seccomp_data, arch))),
    BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, AUDIT_ARCH_X86_64, 0, 7),
    /* load syscall number in the accumulator */
    BPF_STMT(BPF_LD+BPF_W+BPF_ABS, (offsetof (struct seccomp_data, nr))),
    /* check if the syscall number is allowed */
    BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_nanosleep, 5, 0), // for sleep
    BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_exit, 4, 0),
    BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_exit_group, 3, 0),
    BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_write, 2, 0),
    BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_read, 1, 0),
    BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, SYS_rt_sigreturn, 0, 1),
    /* allow the sys call */
    BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW),
    BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_TRAP)
};

struct sock_fprog  bpf = {
    .len = (unsigned short)( sizeof bpfcode / sizeof bpfcode[0] ),
    .filter = bpfcode 
};

int main(int argc, char **argv)
{
    if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1) {
        printf("prctl no_new_privs\n");
        _exit(EXIT_FAILURE);
    }
    if (seccomp(SECCOMP_SET_MODE_FILTER, 0, &bpf)) {
        printf("seccomp");
        exit(EXIT_FAILURE);
    } 
    sleep(2);    
    return 0;
}
问题:我还应该包括什么才能让它工作

编辑:为什么这样做有效而第一次没有? syscallSYS\u seccomp、seccomp\u SET\u MODE\u FILTER、0和bpf

它是:seccomp系统调用没有glibc包装

您可能希望使用prctl2来加载BPF程序,原因有两个:

prctl2有一个glibc包装器 seccomp2系统调用为。 以下是如何:

prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &bpf);

关于第2点。在链接中,有报道称seccomp系统调用首次出现在Linux3.17中。无论如何,我有4.18.0-25内核版本。但它仍然不起作用。我还看到在目录seccomp/samples中有一个系统调用的包装器定义,我应该这样做吗?我错了,3.17只是引用了系统调用而不是包装器。但是问题是一样的,我正在运行4.18>3.5,无法调用包装器函数:/对于4.18,有一个seccomp2系统调用,但glibc中仍然没有seccomp包装器。您应该改用prctl。这样不行吗?如果它不工作,错误消息是什么?啊,好的,谢谢,所以仍然没有包装器。我的意思是,如果我用syscall调用seccomp,或者使用prctl,它就可以工作。但由于他们在prctl之后引入了seccomp syscall,并且由于使用seccomp,您还可以使用标志作为参数,所以我想使用seccomp syscall。无论如何,我如何列出所有glibc函数?我可以检查一下glibc的最新版本中是否添加了新的包装器吗?
prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &bpf);