Seccomp — это встроенный в ядро ​​Linux механизм песочницы, позволяющий определять наборы правил для управления системными вызовами, выполняемыми программой. Seccomp имеет два режима. Режим 1 является примитивным, строгим и позволяет вызывать только фиксированный список системных вызовов, тогда как режим 2 позволяет использовать определяемый пользователем механизм фильтрации/действия с использованием байт-кода BPF. Здесь вы можете найти хороший учебник по Seccomp и его истории.



Я хотел извлечь информацию, связанную с Seccomp, из программ, чтобы проверить их пользовательские фильтры, и нашел следующий инструмент, написанный на Ruby:



seccomp-инструменты

Чтобы проверить, какой двоичный код сгенерирован, и разобрать его, мы можем использовать seccomp-tools. Следуйте инструкциям по установке и запустите дизассемблер Seccomp BPF для набора инструментов:

> apt install gcc ruby-dev make firefox
> gem install seccomp-tools
> seccomp-tools dump firefox
# Result
 0000: 0x20 0x00 0x00 0x00000004  A = arch
 0001: 0x15 0x01 0x00 0xc00000b7  if (A == ARCH_AARCH64) goto 0003
 0002: 0x05 0x00 0x00 0x0000013e  goto 0321
 0003: 0x20 0x00 0x00 0x00000000  A = sys_number
 0004: 0x15 0xeb 0x00 0x00000000  if (A == io_setup) goto 0240
 0005: 0x15 0xea 0x00 0x00000001  if (A == io_destroy) goto 0240
 0006: 0x15 0xe9 0x00 0x00000002  if (A == io_submit) goto 0240
 0007: 0x15 0xe8 0x00 0x00000003  if (A == io_cancel) goto 0240
 0008: 0x15 0xe7 0x00 0x00000004  if (A == io_getevents) goto 0240
 0009: 0x15 0xe6 0x00 0x00000005  if (A == setxattr) goto 0240
 0010: 0x15 0xe5 0x00 0x00000006  if (A == lsetxattr) goto 0240
 0011: 0x15 0xe4 0x00 0x00000007  if (A == fsetxattr) goto 0240
 0012: 0x15 0xe3 0x00 0x00000008  if (A == getxattr) goto 0240
 0013: 0x15 0xe2 0x00 0x00000009  if (A == lgetxattr) goto 0240
 0014: 0x15 0xe1 0x00 0x0000000a  if (A == fgetxattr) goto 0240
 0015: 0x15 0xe0 0x00 0x0000000b  if (A == listxattr) goto 0240
 0016: 0x15 0xdf 0x00 0x0000000c  if (A == llistxattr) goto 0240
 0017: 0x15 0xde 0x00 0x0000000d…