バージョン 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;
}