Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
kafel — Язык и библиотека для задания политик фильтрации системных вызовов. | Kitploit
Инструменты/GitHubGitHub/google/kafel
Статический анализАнализ КодаУтилиты и фреймворки
GitHubgoogle/kafel

kafel

Язык и библиотека для задания политик фильтрации системных вызовов.

РепозиторийСайт
363594 месяцев назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

ЧТО ЭТО?

Kafel — это язык и библиотека для задания политик фильтрации системных вызовов. Политики компилируются в BPF-код, который может использоваться с seccomp-filter.

Это НЕ официальный продукт Google.

Использование

С подробным сообщением об ошибках

root@kitploit:~
struct sock_fprog prog;
kafel_ctxt_t ctxt = kafel_ctxt_create();
kafel_set_input_string(ctxt, seccomp_policy);
if (kafel_compile(ctxt, &prog)) {
  fprintf(stderr, "policy compilation failed: %s", kafel_error_msg(ctxt));
  kafel_ctxt_destroy(&ctxt);
  exit(-1);
}
kafel_ctxt_destroy(&ctxt);
prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
free(prog.filter);

Без подробного сообщения об ошибках

root@kitploit:~
struct sock_fprog prog;
if (kafel_compile_string(seccomp_policy, &prog)) {
  fputs("policy compilation failed", stderr);
  exit(-1);
}
prctl(PR_SET_SECCOMP, SECCOMP_MODE_FILTER, &prog, 0, 0);
free(prog.filter);

Язык политик

Для определения политик используется простой язык.

Файл политики состоит из утверждений.

Утверждением может быть:

  • определение константы
  • определение политики
  • утверждение определения политики
  • утверждение действия по умолчанию

Утверждения определения политики, размещенные на уровне файла, будут добавлены в неявную политику верхнего уровня. Эта политика верхнего уровня будет скомпилирована.

Утверждение действия по умолчанию

root@kitploit:~
DEFAULT the_action

Указывает, что действие the_action должно быть выполнено, если ни одно правило не совпало.

Действие по умолчанию должно быть указано только один раз.

Если файл политики не указывает действий по умолчанию, действием по умолчанию будет KILL

Числа

Kafel поддерживает следующие форматы чисел:

  • Десятичный 42
  • Шестнадцатеричный 0xfa1
  • Восьмеричный 0777
  • Двоичный 0b10101

Определения констант

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

root@kitploit:~
#define MYCONST 123

Определения политик

Определение политики — это список блоков действий и утверждений USE, разделенных запятыми.

samples/ содержит несколько примеров политик, демонстрирующих поддерживаемые функции.

Утверждения USE

USE someOtherPolicy ведет себя так, как если бы тело someOtherPolicy было вставлено на его место. Можно использовать только политики, определенные до утверждения USE.

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

Блоки действий

Блок действий состоит из цели и списка правил сопоставления системных вызовов, разделенных запятыми.

Цель первого совпавшего правила является решением политики.

В следующей таблице перечислены цели Kafel и соответствующие им возвращаемые значения seccomp-filter.

Правила сопоставления системных вызовов

Правило состоит из имени системного вызова и необязательного списка логических выражений.

Список логических выражений разделяется запятыми. Запятая семантически эквивалентна ||, но имеет самый низкий приоритет, поэтому ее может быть проще читать.

Именование системных вызовов

Обычно системные вызовы задаются по их именам, как определено в ядре Linux. Однако вы также можете фильтровать пользовательские системные вызовы, которых нет в стандартном списке системных вызовов. Вы можете либо определить константу и использовать ее вместо имени системного вызова, либо воспользоваться ключевым словом SYSCALL.

root@kitploit:~
#define mysyscall -1

POLICY my_const {
  ALLOW {
    mysyscall
  }
}

POLICY my_literal {
  ALLOW {
    SYSCALL[-1]
  }
}

Фильтры для конкретных архитектур

Вы можете ограничить правило системного вызова подмножеством архитектур с помощью защиты ON. Защита принимает либо одно имя архитектуры, либо список, разделенный запятыми, заключенный в фигурные скобки. Имена соответствуют целям, распознаваемым kafel_set_target_archs (например, x86_64, x86, arm, aarch64, mips64, riscv64, m68k).

root@kitploit:~
ALLOW {
  io_uring_setup ON x86_64,
  arm_fadvise64_64 ON arm
}

При компиляции для архитектуры, не входящей в защиту, правило системного вызова игнорируется, поэтому межархитектурным политикам больше не нужно дублировать целые политики только для учета различий в доступности системных вызовов.

Фильтрация аргументов

Логические выражения используются для фильтрации системных вызовов на основе их аргументов. Выражение напоминает синтаксис языка C, за исключением того, что в нем нет арифметических операторов.

root@kitploit:~
some_syscall(first_arg, my_arg_name) { first_arg == 42 && my_arg_name != 42 }

Побитовое И (&) и ИЛИ ('|') могут использоваться для проверки флагов.

root@kitploit:~
mmap { (prot & PROT_EXEC) == 0 },
open { flags == O_RDONLY|O_CLOEXEC }

Вам не нужно объявлять аргументы для хорошо известных системных вызовов, можно просто использовать их обычные имена, как указано в ядре Linux и страницах man.

root@kitploit:~
write { fd == 1 }

Директива include

Для упрощения повторного использования и компоновки политик kafel предоставляет поддержку include.

root@kitploit:~
#include "some_other_file.policy"

Kafel ищет включаемые файлы только в каталогах, явно добавленных в пути поиска.

root@kitploit:~
kafel_add_include_search_path(ctxt, "includes/path");

Добавляет includes/path в пути поиска — тогда приведенный выше пример директивы include будет ссылаться на includes/path/some_other_file.policy.

Директива include завершается символом новой строки или точкой с запятой. В одной директиве можно указать несколько файлов, разделенных пробелами.

root@kitploit:~
#include "first.policy" "second.policy"; #include "third.policy"

Пример

При использовании с nsjail следующая команда позволяет создать довольно ограниченное окружение для вашей оболочки

root@kitploit:~
$ ./nsjail --chroot / --seccomp_string 'POLICY a { ALLOW { write, execve, brk, access, mmap, open, newfstat, close, read, mprotect, arch_prctl, munmap, getuid, getgid, getpid, rt_sigaction, geteuid, getppid, getcwd, getegid, ioctl, fcntl, newstat, clone, wait4, rt_sigreturn, exit_group } } USE a DEFAULT KILL' -- /bin/sh -i
root@kitploit:~
[2017-01-15T21:53:08+0100] Mode: STANDALONE_ONCE
[2017-01-15T21:53:08+0100] Jail parameters: hostname:'NSJAIL', chroot:'/', process:'/bin/sh', bind:[::]:0, max_conns_per_ip:0, uid:(ns:1000, global:1000), gid:(ns:1000, global:1000), time_limit:0, personality:0, daemonize:false, clone_newnet:true, clone_newuser:true, clone_newns:true, clone_newpid:true, clone_newipc:true, clonew_newuts:true, clone_newcgroup:false, keep_caps:false, tmpfs_size:4194304, disable_no_new_privs:false, pivot_root_only:false
[2017-01-15T21:53:08+0100] Mount point: src:'/' dst:'/' type:'' flags:0x5001 options:''
[2017-01-15T21:53:08+0100] Mount point: src:'(null)' dst:'/proc' type:'proc' flags:0x0 options:''
[2017-01-15T21:53:08+0100] PID: 18873 about to execute '/bin/sh' for [STANDALONE_MODE]
/bin/sh: 0: can't access tty; job control turned off
$ set
IFS='
'
OPTIND='1'
PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
PPID='0'
PS1='$ '
PS2='> '
PS4='+ '
PWD='/'
$ id
Bad system call
$ exit
[2017-01-15T21:53:17+0100] PID: 18873 exited with status: 159, (PIDs left: 0)
Скачать инструмент
Kafelseccomp-filter
ALLOWSECCOMP_RET_ALLOW
LOGSECCOMP_RET_LOG
KILL, KILL_THREAD, DENYSECCOMP_RET_KILL
KILL_PROCESSSECCOMP_RET_KILL_PROCESS
USER_NOTIFSECCOMP_RET_USER_NOTIF
ERRNO(number)SECCOMP_RET_ERRNO+number
TRAP(number)SECCOMP_RET_TRAP+number
TRACE(number)SECCOMP_RET_TRACE+number