Я изучаю детали реализации seccomp-bpf, механизм фильтрации syscall, который был введен в Linux с версии 3.5. Я изучил исходный код ядра/seccomp.c из Linux 3.10 и хочу задать некоторые вопросы об этом.Как отключается фильтр seccomp-bpf?
Из seccomp.c, кажется, что seccomp_run_filters() вызывается из __secure_computing() для проверки syscall, вызванного текущим процессом. Но, глядя в seccomp_run_filters(), номер syscall, который передается как аргумент, нигде не используется.
Похоже, что sk_run_filter() является реализацией машины фильтров BPF, но sk_run_filter() вызывается из seccomp_run_filters() с первым аргументом (буфер для запуска фильтра) NULL.
Мой вопрос: как может 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;
}
Спасибо, Юхо. Я понял, как команда BPF_S_ANC_SECCOMP_LD_W используется, чтобы сообщить интерпретатору загрузить информацию syscall из struct seccomp_dara. –