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

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

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

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

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

Категории

Все категории
Loading categories
jailer — Jailer — это система изоляции процессов на основе eBPF, обеспечивающая мандатный контроль доступа (MAC) для Linux. Она отслеживает процессы с помощью BPF-карт task_storage и применяет ролевые политики к доступу к файлам, сетевым операциям и выполнению процессов. | Kitploit
Инструменты/GitHubGitHub/gen0sec/jailer
Оборонительные ИнструментыБезопасность контейнеровСетевая безопасностьБезопасность облачных сред
GitHubgen0sec/jailer

jailer

Jailer — это система изоляции процессов на основе eBPF, обеспечивающая мандатный контроль доступа (MAC) для Linux. Она отслеживает процессы с помощью BPF-карт task_storage и применяет ролевые политики к доступу к файлам, сетевым операциям и выполнению процессов.

Репозиторий
58218 дней назадПроверено Kitploit

Популярное

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

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

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

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

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

Jailer - обязательный контроль доступа на основе eBPF

Предупреждение: Этот проект находится в активной разработке и НЕ готов к использованию в production. API, форматы политик и поведение могут меняться без уведомления. Используйте только для тестирования и экспериментов.

Благодарности

Примечание: Это независимая реализация и не является тем же проектом, что и решение Meta. Хотя BpfJailer функционально схож и вдохновлён оригинальной идеей и дизайном Лайама Уайзхарта, Джастина Нга, Карла Эль Хури, Манси Чадха из Meta, это отдельная кодовая база, разработанная независимо. Мы выражаем благодарность за видение и основополагающие концепции, вдохновившие эту работу.

Сообщество

Join us on Discord Substack

Jailer — это система изоляции процессов на основе eBPF, предоставляющая обязательный контроль доступа (MAC) для Linux. Она отслеживает процессы с помощью BPF-карт task_storage и обеспечивает применение политик на основе ролей для доступа к файлам, сетевых операций и выполнения процессов.

Возможности (текущая версия)

Демонстрация Nginx

Nginx demo

Сложная демонстрация

asciicast

Требования к ядру

Минимальная версия ядра

  • Linux 5.11+ (для поддержки BPF_MAP_TYPE_TASK_STORAGE)
  • Рекомендуется: Linux 6.1+ (лучшая поддержка BTF)

Необходимая конфигурация ядра

root@kitploit:~
# Проверка текущей конфигурации ядра
zcat /proc/config.gz 2>/dev/null || cat /boot/config-$(uname -r)

Необходимые параметры:

root@kitploit:~
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_LSM=y
CONFIG_DEBUG_INFO_BTF=y

Включение BPF LSM

BPF LSM должен быть включен в параметрах загрузки ядра:

root@kitploit:~
# Проверка активности BPF LSM
cat /sys/kernel/security/lsm
# В списке должен присутствовать "bpf"

# Если нет, добавьте в параметры загрузки ядра:
# Отредактируйте /etc/default/grub и добавьте в GRUB_CMDLINE_LINUX:
#   lsm=lockdown,capability,landlock,yama,apparmor,bpf

# Затем обновите grub и перезагрузитесь:
sudo update-grub
sudo reboot

Для систем Ubuntu/Debian также можно использовать:

root@kitploit:~
# Создайте скрипт для включения BPF LSM
cat > /tmp/enable_bpf_lsm.sh << 'EOF'
#!/bin/bash
GRUB_FILE="/etc/default/grub"
if grep -q "lsm=" "$GRUB_FILE"; then
    sudo sed -i 's/lsm=[^""]*/lsm=lockdown,capability,landlock,yama,apparmor,bpf/' "$GRUB_FILE"
else
    sudo sed -i 's/GRUB_CMDLINE_LINUX="\(.*\)"/GRUB_CMDLINE_LINUX="\1 lsm=lockdown,capability,landlock,yama,apparmor,bpf"/' "$GRUB_FILE"
fi
sudo update-grub
echo "BPF LSM включён. Пожалуйста, перезагрузитесь."
EOF
chmod +x /tmp/enable_bpf_lsm.sh
sudo /tmp/enable_bpf_lsm.sh

Сборка

Предварительные требования

root@kitploit:~
# Установка Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# Установка зависимостей сборки (Ubuntu/Debian)
sudo apt-get install -y clang llvm libelf-dev linux-headers-$(uname -r)

# Установка цели BPF для Rust
rustup target add bpfel-unknown-none

Сборка всех компонентов

root@kitploit:~
cd bpfjail

# Сборка BPF-программ
cd bpfjailer-bpf && cargo build --release && cd ..

# Сборка демона и клиента
cargo build --release

Быстрый старт

1. Запуск демона

root@kitploit:~
# Запуск от root (загружает config/policy.json, если присутствует)
sudo RUST_LOG=info ./target/release/bpfjailer-daemon

Ожидаемый вывод:

root@kitploit:~
[INFO] BpfJailer daemon starting...
[INFO] Loading BpfJailer eBPF programs with libbpf-rs...
[INFO] ✓ pending_enrollments map available for enrollment
[INFO] ✓ network_rules map available for port/protocol filtering
[INFO] ✓ task_storage map created successfully
[INFO] ✓ Program task_alloc attached
[INFO] ✓ Program file_open attached
[INFO] ✓ Program socket_bind attached
[INFO] ✓ Program socket_connect attached
[INFO] ✓ Program bprm_check_security attached
[INFO] Initialized with default roles: restricted (1), permissive (2)
[INFO] Loaded policy from config/policy.json
[INFO] Loaded 5 roles
[INFO] Enrollment server listening on /run/bpfjailer/enrollment.sock

2. Запуск тестов безопасности

root@kitploit:~
# Запуск тестов уязвимостей БЕЗ изоляции (показывает успешные атаки)
sudo python3 tests/vulnerable_apps/run_tests.py

# Запуск тестов уязвимостей С ограниченной ролью (показывает заблокированные атаки)
sudo python3 tests/vulnerable_apps/run_tests.py --role 1

# Запуск конкретного теста
sudo python3 tests/vulnerable_apps/run_tests.py --role 1 --test path

# Список доступных тестов и ролей
sudo python3 tests/vulnerable_apps/run_tests.py --list

Пример вывода с ограниченной ролью:

root@kitploit:~
============================================================
TEST: Path Traversal / Arbitrary File Read
============================================================
Attempting to read /etc/passwd via path traversal...
BLOCKED - Permission denied (BpfJailer blocked file access)

============================================================
TEST: Command Injection
============================================================
Attempting command injection...
BLOCKED - Permission denied (BpfJailer blocked exec)

============================================================
TEST: Reverse Shell / Data Exfiltration
============================================================
Test 1: Reverse shell connection to 127.0.0.1:4444
BLOCKED - Permission denied (BpfJailer blocked connect)

Доступные тесты безопасности

3. Ручное тестирование регистрации

root@kitploit:~
#!/usr/bin/env python3
import socket
import json
import os

# Connect to daemon
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect("/run/bpfjailer/enrollment.sock")

# Enroll with restricted role (ID 1)
request = {"Enroll": {"pod_id": 1, "role_id": 1}}
sock.send((json.dumps(request) + "\n").encode())
response = sock.recv(4096).decode()
print(f"Enrollment: {response}")
sock.close()

# Try to read a file (should be blocked)
try:
    open("/etc/passwd").read()
    print("File access: ALLOWED")
except PermissionError:
    print("File access: BLOCKED")

Файл политик

BpfJailer загружает роли из JSON-файла политик. Демон ищет файл политик в следующем порядке:

  1. Переменная окружения $BPFJAILER_POLICY
  2. /etc/bpfjailer/policy.json
  3. config/policy.json (относительно рабочего каталога)

Пример файла политик

root@kitploit:~
{
  "roles": {
    "restricted": {
      "id": 1,
      "name": "restricted",
      "flags": {
        "allow_file_access": false,
        "allow_network": false,
        "allow_exec": false
      },
      "network_rules": []
    },
    "webserver": {
      "id": 3,
      "name": "webserver",
      "flags": {
        "allow_file_access": true,
        "allow_network": true,
        "allow_exec": false
      },
      "network_rules": [
        {"protocol": "tcp", "port": 80, "allow": true},
        {"protocol": "tcp", "port": 443, "allow": true}
      ]
    }
  },
  "pods": []
}

Флаги политик

Роли по умолчанию

Фильтрация сетевых портов/протоколов

BpfJailer поддерживает тонкую настройку сетевого контроля с правилами TCP/UDP для каждого порта.

Структура правила

root@kitploit:~
network_rules map:
  Key: { role_id, port, protocol, direction }
  Value: разрешён (1) или запрещён (0)
  • protocol: 6 = TCP, 17 = UDP
  • direction: 0 = bind, 1 = connect
  • port: 0 = wildcard (все порты)

Порядок оценки правил

  1. Проверка конкретного правила порта для роли
  2. Проверка правила wildcard-порта (port=0) для роли
  3. Возврат к role_flags (бит 1 = сеть разрешена)

Пример: Разрешить только HTTP/HTTPS для ограниченной роли

root@kitploit:~
// In daemon code:
use bpfjailer_daemon::process_tracker::{PROTO_TCP, DIR_CONNECT};

// Allow TCP connect to ports 80 and 443 only
process_tracker.add_network_rule(RoleId(1), 80, PROTO_TCP, DIR_CONNECT, true)?;
process_tracker.add_network_rule(RoleId(1), 443, PROTO_TCP, DIR_CONNECT, true)?;

Константы протоколов

Диапазоны портов

Диапазоны портов можно указать в policy.json с помощью port_start и port_end:

root@kitploit:~
{
  "network_rules": [
    {"protocol": "tcp", "port": 443, "allow": true},
    {"protocol": "tcp", "port_start": 8000, "port_end": 8100, "allow": true}
  ]
}
ПолеОписание
portОдин порт (например, 80)
port_start + port_endДиапазон портов (например, 8000-8100)

Примечание: Большие диапазоны (>1000 портов) потребляют много записей BPF-карты. Для диапазонов, превышающих 1000 портов, записывается предупреждение.

Архитектура

root@kitploit:~
┌─────────────────────────────────────────────────────────────┐
│                     User Space                               │
├─────────────────────────────────────────────────────────────┤
│  ┌─────────────┐    ┌──────────────────┐                    │
│  │   Client    │───▶│  bpfjailer-daemon │                    │
│  │  (enroll)   │    │                  │                    │
│  └─────────────┘    │  - PolicyManager │                    │
│                     │  - ProcessTracker│                    │
│                     │  - EnrollmentSvr │                    │
│                     └────────┬─────────┘                    │
│                              │ writes to                    │
│                              ▼                              │
├─────────────────────────────────────────────────────────────┤
│                     BPF Maps                                 │
│  ┌──────────────────┐  ┌─────────────┐  ┌──────────────┐   │
│  │pending_enrollments│  │ role_flags  │  │ task_storage │   │
│  │   (PID → info)   │  │ (role→flags)│  │(task→info)   │   │
│  └──────────────────┘  └─────────────┘  └──────────────┘   │
├─────────────────────────────────────────────────────────────┤
│                     BPF LSM Hooks                            │
│  ┌────────────┐ ┌───────────┐ ┌─────────────┐ ┌──────────┐ │
│  │ task_alloc │ │ file_open │ │socket_bind/ │ │bprm_check│ │
│  │(inheritance│ │(migration │ │  connect    │ │_security │ │
│  │ + init)    │ │ + check)  │ │  (check)    │ │ (check)  │ │
│  └────────────┘ └───────────┘ └─────────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────┘

Процесс регистрации

  1. Процесс подключается к /run/bpfjailer/enrollment.sock
  2. Отправляет JSON: {"Enroll": {"pod_id": N, "role_id": M}}
  3. Демон записывает в pending_enrollments[PID] и role_flags[role_id]
  4. При следующем системном вызове (file_open, exec) BPF переносит регистрацию в task_storage
  5. Все последующие системные вызовы проверяют task_storage + role_flags для принудительного применения
  6. Дочерние процессы наследуют через хук task_alloc

Режимы установки

BpfJailer поддерживает два режима установки:

1. Режим демона (стандартный)

Использует работающий демон для регистрации и управления политиками:

root@kitploit:~
# Установка systemd-сервиса
sudo cp config/bpfjailer-daemon.service /etc/systemd/system/
sudo cp target/release/bpfjailer-daemon /usr/sbin/
sudo mkdir -p /etc/bpfjailer
sudo cp config/policy.json /etc/bpfjailer/

# Включение и запуск
sudo systemctl daemon-reload
sudo systemctl enable bpfjailer-daemon
sudo systemctl start bpfjailer-daemon

Возможности:

  • API регистрации через сокет
  • Горячая перезагрузка политик (остановка/запуск демона)
  • Полное логирование в процессе демона

2. Режим без демона (загрузочный)

Загружает BPF-программы при ранней загрузке и завершает работу. Программы остаются активными до перезагрузки:

root@kitploit:~
# Установка загрузочного сервиса
sudo cp config/bpfjailer-bootstrap.service /etc/systemd/system/
sudo cp target/release/bpfjailer-bootstrap /usr/sbin/
sudo mkdir -p /etc/bpfjailer
sudo cp config/policy.json /etc/bpfjailer/

# Включение (будет запущен при следующей загрузке)
sudo systemctl daemon-reload
sudo systemctl enable bpfjailer-bootstrap

# Или запустить вручную сейчас
sudo bpfjailer-bootstrap

Возможности:

  • Нет работающего демона (уменьшенная поверхность атаки)
  • BPF-программы закреплены в /sys/fs/bpf/bpfjailer/
  • Невозможно остановить без перезагрузки
  • События аудита отправляются в systemd-journald через perf-буфер
  • Работают только альтернативные методы регистрации (exec/cgroup/xattr)

Проверка закрепленных программ:

root@kitploit:~
ls -la /sys/fs/bpf/bpfjailer/
ls -la /sys/fs/bpf/bpfjailer/maps/
ls -la /sys/fs/bpf/bpfjailer/progs/

Просмотр событий аудита:

root@kitploit:~
# События отправляются в perf-буфер, захватываются journald
journalctl -f | grep bpfjailer

Сравнение режимов

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

"task_storage map creation failed"

root@kitploit:~
# Проверка версии ядра (требуется 5.11+)
uname -r

# Проверка активности BPF LSM
cat /sys/kernel/security/lsm | grep bpf

# Проверка доступности BTF
ls -la /sys/kernel/btf/vmlinux

"Failed to attach program"

root@kitploit:~
# Проверка, могут ли BPF-программы быть загружены
sudo bpftool prog list

# Проверка возможностей
sudo capsh --print | grep cap_bpf

Отказано в доступе при регистрации

root@kitploit:~
# Убедитесь, что демон запущен от root
ps aux | grep bpfjailer

# Проверка прав на сокет
ls -la /run/bpfjailer/enrollment.sock

Альтернативные методы регистрации

Помимо регистрации через Unix-сокет, BpfJailer поддерживает автоматическую регистрацию на основе:

Регистрация на основе исполняемого файла

Автоматическая регистрация всех процессов, выполняющих конкретный бинарный файл:

root@kitploit:~
{
  "exec_enrollments": [
    {
      "executable_path": "/usr/bin/nginx",
      "pod_id": 1000,
      "role": "webserver"
    }
  ]
}

Когда любой процесс выполняет /usr/bin/nginx, он автоматически регистрируется с ролью webserver. Сопоставление выполняется по inode исполняемого файла, поэтому символические и жёсткие ссылки обрабатываются корректно.

Регистрация на основе cgroup

Автоматическая регистрация всех процессов в определённой cgroup:

root@kitploit:~
{
  "cgroup_enrollments": [
    {
      "cgroup_path": "/sys/fs/cgroup/bpfjailer/sandbox",
      "pod_id": 2000,
      "role": "sandbox"
    }
  ]
}

Создайте cgroup и переместите в неё процессы:

root@kitploit:~
# Создание cgroup
sudo mkdir -p /sys/fs/cgroup/bpfjailer/sandbox

# Перемещение процесса в cgroup
echo $$ | sudo tee /sys/fs/cgroup/bpfjailer/sandbox/cgroup.procs

# Процесс теперь автоматически зарегистрирован с ролью sandbox

Регистрация на основе расширенных атрибутов (xattr)

Установите расширенные атрибуты на исполняемые файлы для информации о регистрации:

root@kitploit:~
# Установка xattr для регистрации
sudo setfattr -n user.bpfjailer.pod_id -v $(printf '\x01\x00\x00\x00\x00\x00\x00\x00') /path/to/binary
sudo setfattr -n user.bpfjailer.role_id -v $(printf '\x03\x00\x00\x00') /path/to/binary

# Проверка xattr
getfattr -d /path/to/binary

Как работает автоматическая регистрация

  1. Во время выполнения (хук LSM bprm_check_security):

    • Проверяется, присутствует ли inode исполняемого файла в карте exec_enrollment
    • Проверяется, присутствует ли ID cgroup процесса в карте cgroup_enrollment
    • При обнаружении автоматически устанавливается task_storage с pod_id и role_id
  2. Регистрация сохраняется при fork/exec через хук task_alloc

  3. Правила политик (сеть, пути, выполнение) применяются на основе role_id

Лицензия

GPL-2.0 (требуется для BPF-программ)

Скачать инструмент
ФункцияСтатусОписание
Отслеживание процессов✅ РаботаетОтслеживает процессы с помощью BPF-карты task_storage
Регистрация через сокет✅ РаботаетПроцессы регистрируются через API Unix-сокета
Политики на основе ролей✅ РаботаетОграниченные и разрешительные роли
Контроль доступа к файлам✅ РаботаетБлокировка/разрешение операций открытия файлов
Наследование изоляции✅ РаботаетДочерние процессы наследуют изоляцию родителя
Сетевой контроль✅ РаботаетБлокировка/разрешение socket bind/connect
Фильтрация портов/протоколов✅ РаботаетПравила разрешения/запрета TCP/UDP по портам
Контроль выполнения✅ РаботаетБлокировка/разрешение выполнения процессов
Сопоставление путей✅ РаботаетОбход dentry с инвалидацией кэша
Подписанные бинарные файлы🚧 ЗаглушкаПроверка подписи бинарных файлов (не реализовано)
Альтернативная регистрация✅ РаботаетАвторегистрация по исполняемому файлу, cgroup или xattr
Режим без демона✅ РаботаетЗагрузочный бинарный файл закрепляет программы при ранней загрузке
События аудита✅ РаботаетPerf-буфер для интеграции с systemd-journald
ТестУязвимостьСмягчается ролью
path_traversalЧтение произвольных файлов через ../restricted, isolated
command_injectionВыполнение команд оболочкиrestricted, webserver, isolated
reverse_shellИсходящие соединения к атакующемуrestricted, isolated
ssrfДоступ к внутренним сервисам/метаданным облакаrestricted, isolated
arbitrary_writeЗапись в критически важные путиrestricted
crypto_minerСкачивание + выполнение + соединение с пуломrestricted, webserver
privilege_escalationЧтение shadow, запись в sudoersrestricted
ФлагОписание
allow_file_accessРазрешить операции открытия файлов
allow_networkРазрешить socket bind/connect
allow_execРазрешить выполнение процессов
allow_setuidРазрешить операции setuid
allow_ptraceРазрешить операции ptrace
ID ролиИмяДоступ к файламСетьВыполнение
1restrictedЗаблокированЗаблокированаЗаблокировано
2permissiveРазрешёнРазрешенаРазрешено
3webserverРазрешёнПорты 80, 443, 8080Заблокировано
4databaseРазрешёнПорты 5432, 6379Заблокировано
5isolatedРазрешёнЗаблокированаЗаблокировано
6web_with_dbРазрешёнПорты 80, 443, 5432, 3306, 6379Заблокировано
7workerРазрешёнПорты 443, 5432, 6379, 5672Разрешено
КонстантаЗначениеОписание
PROTO_TCP6Протокол TCP
PROTO_UDP17Протокол UDP
DIR_BIND0socket bind()
DIR_CONNECT1socket connect()
АспектРежим демонаРежим без демона
Поверхность атакиРаботающий демонНет работающего процесса
РегистрацияUnix-сокет + альтернативыТолько альтернативы
Обновление политикГорячая перезагрузкаТребуется перезагрузка
Логирование аудитаДемон читает ringbufjournald через perf-буфер
Удаление программОстановка демонаТолько перезагрузка
Порядок загрузкиПосле network.targetДо basic.target