linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • Симулятор
  • База знаний
  • Собеседование
Index
Categories
All entries
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
home/linux/kb/Процессы и ресурсы/seccomp

kb/processes ── Процессы и ресурсы ── advanced

seccomp - фильтр системных вызовов

seccomp - kernel-level фильтр syscall'ов. Процесс декларирует «можно только эти», и kernel отсекает остальные. Основа sandbox'а Docker и Chrome.

view as markdownaka: seccomp-bpf, syscall-filter, secure-computing

Зачем

capabilities делят root-привилегии. Но даже простой пользовательский процесс может вызвать ~350 разных syscall'ов, и в любом потенциально есть бага → уязвимость. Лучшая защита - отнять у процесса возможность делать syscall'ы, которые ему не нужны.

Например, web-сервер не должен звать mount(), reboot(), kexec_load(), ptrace(). Если их можно ОТКЛЮЧИТЬ - целая поверхность атак отрезана.

Два режима

  • SECCOMP_MODE_STRICT (старый, 2005) - оставляет только read, write, _exit, sigreturn. Слишком жёстко, никем не используется.
  • SECCOMP_MODE_FILTER (BPF, 2012) - программа на BPF фильтрует syscall'ы по номеру и аргументам. Это и есть «seccomp» сегодня.

Программа BPF получает на вход номер syscall'а и аргументы, возвращает одно из:

ActionЧто делает
SECCOMP_RET_ALLOWпропустить
SECCOMP_RET_ERRNO(n)заблокировать с возвратом ошибки n (типично EPERM)
SECCOMP_RET_KILL_PROCESSубить процесс целиком
SECCOMP_RET_KILL_THREADубить только этот thread
SECCOMP_RET_TRAPSIGSYS → можно обработать
SECCOMP_RET_LOGпропустить + записать в audit
SECCOMP_RET_USER_NOTIFпередать в userspace для решения (новое; для контейнеров)

Как программа включает seccomp

Через системный вызов prctl() или seccomp(). Обычно используют библиотеку libseccomp чтобы не писать BPF руками:

c
scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_ERRNO(EPERM));   // default = блок
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read),  0);
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 0);
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit),  0);
seccomp_load(ctx);
// теперь любой syscall кроме разрешённых = EPERM

Filter - необратимый: можно только сужать, нельзя расширять.

Docker default profile

Docker применяет seccomp profile по умолчанию. Заблокирован ~50 syscall'ов: clone3 (CVE-mitigation, раньше), kexec_load, keyctl, reboot, mount (требует CAP_SYS_ADMIN отдельно), часть ptrace-вариантов и т.д.

bash
docker run --security-opt seccomp=unconfined ubuntu     # ВЫКЛЮЧИТЬ - для дебага
docker run --security-opt seccomp=/path/profile.json     # свой профиль

В Kubernetes:

yaml
securityContext:
  seccompProfile:
    type: RuntimeDefault                         # docker-style профиль
    # или
    type: Localhost
    localhostProfile: profiles/audit.json

Связь с другими механизмами

  • AppArmor / SELinux - фильтр на уровне MAC (file/path/network)
  • capabilities - что разрешено root-привилегий
  • seccomp - что разрешено по syscall'ам

Это разные слои; на проде стоит включать все три + namespace-изоляцию. Это и есть подход «defense in depth».

Дебаг seccomp-нарушений

Когда процесс падает с EPERM «непонятно от чего», подозрение на seccomp:

bash
# 1. Посмотреть фильтры процесса
cat /proc/<pid>/status | grep ^Seccomp
# Seccomp:    2     ← 0=disabled, 1=strict, 2=filter
# 2. strace - увидим запрещённый syscall
strace -p <pid>          # error: Operation not permitted на конкретном syscall
# 3. dmesg - если профиль настроен на LOG
sudo dmesg | grep audit

Для разработки своего профиля Docker запускают приложение с режимом RET_LOG (всё пропускать но логировать), собирают список реально использованных syscall'ов, потом строят минимальный whitelist.

Системные тулзы

  • scmp_sys_resolver <number> - расшифровать номер syscall'а в имя
  • seccomp-tools (третья сторона) - дамп BPF из работающего процесса
  • falco - observability + audit с seccomp

§ команды

bash
cat /proc/<pid>/status | grep ^Seccomp

Состояние seccomp у процесса (0/1/2)

bash
docker run --security-opt seccomp=unconfined ubuntu

Выключить seccomp для дебага - только локально, не на проде

bash
docker run --security-opt seccomp=profile.json myimg

Применить кастомный профиль из JSON

bash
scmp_sys_resolver_x86_64 41

Расшифровать номер syscall'а в имя (41 = socket)

bash
strace -e seccomp ./app

Увидеть в strace когда программа сама применяет seccomp-фильтр

§ см. также

  • process-and-pidПроцесс и PIDПроцесс - это запущенная программа со своим PID, памятью, открытыми дескрипторами и UID. Все процессы образуют дерево, корень - init (PID 1).
  • capabilitiesLinux capabilities - биты привилегийCapabilities дробят привилегии root'а на 40+ независимых битов: NET_ADMIN, SYS_PTRACE, и т.д. Можно дать процессу часть, не делая его полным root'ом.
  • namespacesLinux namespacesNamespaces - механизм ядра, который даёт процессу собственный изолированный view на ресурс (сеть, mount-points, PID, UID, IPC, hostname, time). На них построены все контейнеры.
  • ebpf-basicseBPF - программируемый kerneleBPF - запуск sandboxed-программ в kernel без kernel-modules. Прицепляются к hooks (kprobe, uprobe, tracepoint, perf, socket, XDP). Verifier гарантирует завершение и safety. JIT компилирует в native. bpftool/libbpf/BCC - userspace tooling.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки