
Jailer — это система изоляции процессов на основе eBPF, обеспечивающая мандатный контроль доступа (MAC) для Linux. Она отслеживает процессы с помощью BPF-карт task_storage и применяет ролевые политики к доступу к файлам, сетевым операциям и выполнению процессов.
Внимание: Этот проект находится в стадии активной разработки и НЕ готов к использованию в production. API, форматы политик и поведение могут изменяться без предупреждения. Используйте только для тестирования и экспериментов.
Примечание: Это независимая реализация, и это не тот же проект, что решение от Meta. Хотя BpfJailer функционально схож и вдохновлён оригинальной идеей и дизайном Liam Wisehart, Justin Ngai, Carl El Khoury, Mansee Chadha из Meta, это отдельная кодовая база, разработанная независимо. Мы выражаем благодарность за видение и основополагающие концепции, вдохновившие эту работу.
Jailer — это система изоляции процессов на основе eBPF, обеспечивающая мандатный контроль доступа (MAC) для Linux. Она отслеживает процессы с помощью BPF-карт task_storage и применяет ролевые политики к доступу к файлам, сетевым операциям и запуску процессов.
| Возможность | Статус | Описание |
|---|---|---|
| Отслеживание процессов | ✅ Работает | Отслеживает процессы с помощью BPF-карты task_storage |
| Регистрация сокетов | ✅ Работает | Процессы регистрируются через Unix socket API |
| Ролевые политики | ✅ Работает | Ограниченные и разрешающие роли |
| Контроль доступа к файлам | ✅ Работает | Блокировка/разрешение операций открытия файлов |
| Наследование изоляции | ✅ Работает | Дочерние процессы наследуют изоляцию родителя |
| Сетевой контроль | ✅ Работает | Блокировка/разрешение socket bind/connect |
| Фильтрация портов/протоколов | ✅ Работает | Правила разрешения/запрета TCP/UDP по портам |
| Контроль exec | ✅ Работает | Блокировка/разрешение запуска процессов |
| Сопоставление путей | ✅ Работает | Обход dentry с инвалидацией кэша |
| Подписанные бинарники | 🚧 Заглушка | Проверка подписи бинарников (не реализована) |
| Альтернативная регистрация | ✅ Работает | Авторегистрация по исполняемому файлу, cgroup или xattr |
| Режим без демона | ✅ Работает | Bootstrap-бинарник закрепляет программы на раннем этапе загрузки |
| События аудита | ✅ Работает | Perf-буфер для интеграции с systemd-journald |

BPF_MAP_TYPE_TASK_STORAGE)# Check current kernel config
zcat /proc/config.gz 2>/dev/null || cat /boot/config-$(uname -r)
Обязательные параметры:
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_LSM=y
CONFIG_DEBUG_INFO_BTF=y
BPF LSM должен быть включён в параметрах загрузки ядра:
# Check if BPF LSM is active
cat /sys/kernel/security/lsm
# Should include "bpf" in the list
# If not, add to kernel boot parameters:
# Edit /etc/default/grub and add to GRUB_CMDLINE_LINUX:
# lsm=lockdown,capability,landlock,yama,apparmor,bpf
# Then update grub and reboot:
sudo update-grub
sudo reboot
Для систем Ubuntu/Debian также можно использовать:
# Create a script to enable 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 enabled. Please reboot."
EOF
chmod +x /tmp/enable_bpf_lsm.sh
sudo /tmp/enable_bpf_lsm.sh
Готовые tarball-архивы публикуются для x86_64 и aarch64, собранные с
glibc 2.31, чтобы они работали на более старых дистрибутивах, чем тот, на котором были собраны.
curl -fsSL https://github.com/gen0sec/jailer/raw/main/install.sh | sudo sh
Скрипт проверяет SHA256 перед установкой чего-либо. Каждый артефакт также подписан GPG; чтобы проверить происхождение, сначала импортируйте ключ релиза:
curl -fsSL https://github.com/gen0sec/jailer/releases/download/v0.1.1/bpfjailer-signing-key.asc | gpg --import
Чтобы установить вручную, скачайте tarball для вашей архитектуры со страницы релизов и:
tar xzf bpfjailer-*-linux-gnu.tar.gz && cd bpfjailer-*-linux-gnu
sudo install -Dm0755 bpfjailer-bootstrap /usr/sbin/bpfjailer-bootstrap
sudo install -Dm0755 bpfjailer-daemon /usr/sbin/bpfjailer-daemon
sudo install -Dm0644 bpfjailer.bpf.o /usr/lib/bpfjailer/bpfjailer.bpf.o
sudo install -Dm0644 policy.json /etc/bpfjailer/policy.json
sudo install -Dm0644 bpfjailer-*.service /etc/systemd/system/
sudo systemctl daemon-reload
Затем включите один из двух режимов, описанных в разделе Режимы установки.
# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Install build dependencies (Ubuntu/Debian)
sudo apt-get install -y clang llvm libelf-dev linux-headers-$(uname -r)
# Install BPF target for Rust
rustup target add bpfel-unknown-none
cd jailer
# Build BPF programs
cd bpfjailer-bpf && cargo build --release && cd ..
# Build daemon and client
cargo build --release
# Run as root (loads config/policy.json if present)
sudo RUST_LOG=info ./target/release/bpfjailer-daemon
Ожидаемый вывод:
[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
# Run vulnerability tests WITHOUT jailing (shows attacks succeed)
sudo python3 tests/vulnerable_apps/run_tests.py
# Run vulnerability tests WITH restricted role (shows attacks blocked)
sudo python3 tests/vulnerable_apps/run_tests.py --role 1
# Run specific test
sudo python3 tests/vulnerable_apps/run_tests.py --role 1 --test path
# List available tests and roles
sudo python3 tests/vulnerable_apps/run_tests.py --list
Пример вывода с ограниченной ролью:
============================================================
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)