2013-11-07 4 views
3

Я изучаю детали реализации 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; 
} 

ответ

1

Когда процесс пользователь вводит ядро, набор регистров хранится в переменной ядра. Функция sk_run_filter реализует интерпретатор для языка фильтра. Соответствующая инструкция для секторальных фильтров - BPF_S_ANC_SECCOMP_LD_W. Каждая команда имеет константу k, и в этом случае она указывает индекс слова, которое нужно прочитать.

#ifdef CONFIG_SECCOMP_FILTER 
      case BPF_S_ANC_SECCOMP_LD_W: 
        A = seccomp_bpf_load(fentry->k); 
        continue; 
#endif 

seccomp_bpf_load Функция использует текущий набор регистров пользовательского потока, чтобы определить информацию системного вызова.

+0

Спасибо, Юхо. Я понял, как команда BPF_S_ANC_SECCOMP_LD_W используется, чтобы сообщить интерпретатору загрузить информацию syscall из struct seccomp_dara. –

Смежные вопросы