Внутри зондов ядра (kprobes) виртуальная машина eBPF имеет доступ только для чтения к параметрам системного вызова и возвращаемому значению.
Однако программа eBPF будет иметь собственный код возврата. Можно применить профиль seccomp, который перехватывает коды возврата BPF (НЕ eBPF; спасибо @qeole) и прерывает системный вызов во время выполнения.
Допустимые модификации во время выполнения:
SECCOMP_RET_KILL
: Немедленное убийство с помощью SIGSYS
SECCOMP_RET_TRAP
: отправить перехватываемый SIGSYS
, дающий возможность эмулировать системный вызов
SECCOMP_RET_ERRNO
: Принудительное значение errno
SECCOMP_RET_TRACE
: отдайте решение ptracer или установите errno
на -ENOSYS
SECCOMP_RET_ALLOW
: Разрешить
https://www.kernel.org/doc/Documentation/prctl/seccomp_filter.txt
Метод SECCOMP_RET_TRACE
позволяет изменять выполняемый системный вызов, аргументы или возвращаемое значение. Это зависит от архитектуры, и изменение обязательных внешних ссылок может вызвать ошибку ENOSYS.
Он делает это, передавая выполнение ожидающей пользовательской ptrace, которая имеет возможность изменять отслеживаемую память процесса, регистры и файловые дескрипторы.
Трассировщик должен вызвать ptrace, а затем waitpid. Пример:
ptrace(PTRACE_SETOPTIONS, tracee_pid, 0, PTRACE_O_TRACESECCOMP);
waitpid(tracee_pid, &status, 0);
http://man7.org/linux/man-pages/man2/ptrace.2.html
Когда waitpid
возвращается, в зависимости от содержимого status
можно получить возвращаемое значение seccomp с помощью операции PTRACE_GETEVENTMSG
ptrace. Это позволит получить значение seccomp SECCOMP_RET_DATA
, которое представляет собой 16-битное поле, установленное программой BPF. Пример:
ptrace(PTRACE_GETEVENTMSG, tracee_pid, 0, &data);
Аргументы системного вызова можно изменить в памяти перед продолжением работы. Вы можете выполнить один вход системного вызова или выйти с помощью шага PTRACE_SYSCALL
. Возвращаемые системным вызовом значения могут быть изменены в пользовательском пространстве перед возобновлением выполнения; базовая программа не сможет увидеть, что значения, возвращаемые системным вызовом, были изменены.
Пример реализации: Фильтрация и изменение системных вызовов с помощью seccomp и ptrace
person
Ben Walther
schedule
07.04.2017