【问题标题】:implicit reference to seccomp隐式引用 seccomp
【发布时间】:2019-08-04 14:44:29
【问题描述】:

问题: 我正在尝试使用 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;
}

警告/错误:这是我尝试编译程序时的 gcc 输出。

s.c: In function ‘main’:
    s.c:45:6: warning: implicit declaration of function ‘seccomp’ [-Wimplicit-function-declaration]
      if (seccomp(SECCOMP_SET_MODE_FILTER, 0, &bpf)) {
          ^~~~~~~
    /tmp/ccYo4APk.o: In function `main':
    s.c:(.text+0x65): undefined reference to `seccomp'
    collect2: error: ld returned 1 exit status

问题:我还应该包括什么才能让它发挥作用?

编辑:为什么这有效而第一个无效? syscall(SYS_seccomp, SECCOMP_SET_MODE_FILTER, 0, &amp;bpf)

【问题讨论】:

    标签: c system-calls bpf seccomp


    【解决方案1】:

    它是a known issue没有用于 seccomp 系统调用的 glibc 包装器

    您可能希望改用 prctl(2) 来加载 BPF 程序,原因有两个:

    1. glibc 包装器可用于 prctl(2)
    2. seccomp(2) 系统调用是only available on Linux v3.5+

    方法如下:

    prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &bpf);
    

    【讨论】:

    • 关于第2点,链接中报道“The seccomp()系统调用首次出现在Linux 3.17”。反正我有 4.18.0-25 内核版本。但它仍然不起作用。我还看到在目录 seccomp/samples (github.com/torvalds/linux/blob/master/samples/seccomp/…) 中有一个 syscall 的包装器定义,我应该这样做吗?
    • 我错了 3.17 只是引用系统调用而不是包装器。然而问题是一样的,我正在运行 4.18 > 3.5,我不能调用包装函数。 ://
    • 在 4.18 中,有一个 seccomp(2) 系统调用,但 glibc 中仍然没有 seccomp() 包装器。您应该改用 prctl()。那不工作吗?如果它不起作用,错误信息是什么?
    • 啊,好的,谢谢,所以仍然没有包装。我的意思是,如果我使用 syscall 调用 seccomp 或使用 prctl,它会起作用。但是由于他们在 prctl 之后引入了 seccomp 系统调用,并且由于使用 seccomp 您还可以使用标志作为参数,所以我想使用 seccomp 系统调用。无论如何,我怎样才能列出所有 glibc 函数?我可以检查他们是否在最新版本的 glibc 中添加了新的包装器?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    相关资源
    最近更新 更多