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…