7

バージョン 3.5 以降に Linux に導入されたシステムコール フィルタリング メカニズムである seccomp-bpf の実装の詳細を調査しています。Linux 3.10 の kernel/seccomp.c のソース コードを調べて、それについていくつか質問したいと思います。

seccomp.c から、現在のプロセスによって呼び出された syscall をテストするために、__secure_computing() から seccomp_run_filters() が呼び出されているようです。しかし、seccomp_run_filters() を調べてみると、引数として渡された syscall 番号はどこにも使用されていません。

sk_run_filter() は BPF フィルター マシンの実装のようですが、seccomp_run_filters() から最初の引数 (フィルターを実行するバッファー) を NULL にして sk_run_filter() を呼び出します。

私の質問は次のとおりです: seccomp_run_filters() は、引数を使用せずにシステムコールをフィルタリングするにはどうすればよいですか?

以下は、seccomp_run_filters() のソース コードです。

/**
 * seccomp_run_filters - evaluates all seccomp filters against @syscall
 * @syscall: number of the current system call
 *
 * Returns valid seccomp BPF response codes.
 */
static u32 seccomp_run_filters(int syscall)
{
        struct seccomp_filter *f;
        u32 ret = SECCOMP_RET_ALLOW;

        /* Ensure unexpected behavior doesn't result in failing open. */
        if (WARN_ON(current->seccomp.filter == NULL))
                return SECCOMP_RET_KILL;

        /*
         * All filters in the list are evaluated and the lowest BPF return
         * value always takes priority (ignoring the DATA).
         */
        for (f = current->seccomp.filter; f; f = f->prev) {
                u32 cur_ret = sk_run_filter(NULL, f->insns);
                if ((cur_ret & SECCOMP_RET_ACTION) < (ret & SECCOMP_RET_ACTION))
                        ret = cur_ret;
        }
        return ret;
}
4

1 に答える 1