使用 seccomp 配置文件从 C 运行进程

问题描述

我想运行一个应用了 seccomp 配置文件的进程(可以来自 C、终端等)。特别是,我希望目标命令不允许读写任何文件,它只能打印到控制台。我的临时 C 大纲是这样的:

int main() {
    scmp_filter_ctx filter = load_filter();
    seccomp_load(filter);
    // execl([sample command with arguments],0);
    execl("ls",0)
}

我遇到的问题是 execl 使用了一些在我的配置文件中被阻止的系统调用。如何确保 only 仅应用于 [sample command with arguments]。同样,这不必在 C 中。基本上,我想运行一些可执行文件,并将 seccomp 应用于这些进程。我使用的是 Ubuntu 18.04。

解决方法

exec* 调用是 execve 的前端,它在用户空间中的实现如下所示:

int execve(const char *filename,char * const argv[],char * const envp[]) {
    return syscall(SYS_execve,filename,argv,envp);
}

参考:https://stackoverflow.com/a/7381910/544721

因此,您可能希望在加载后检测所需的二进制文件以执行 seccomp 过滤器代码。例如通过实际二进制的二进制检测(添加额外代码)。