
Jailer ist ein auf eBPF basierendes Prozess-Jailing-System, das eine verbindliche Zugriffskontrolle (MAC) für Linux bereitstellt. Es verfolgt Prozesse mithilfe von BPF-task_storage-Maps und setzt rollenbasierte Richtlinien für Dateizugriff, Netzwerkoperationen und Prozessausführung durch.
Warnung: Dieses Projekt befindet sich in intensiver Entwicklung und ist NICHT für den Produktiveinsatz geeignet. APIs, Richtlinienformate und Verhalten können sich ohne Vorankündigung ändern. Nur für Tests und Experimente verwenden.
Hinweis: Dies ist eine unabhängige Implementierung und nicht dasselbe Projekt wie Metas Lösung. Obwohl BpfJailer funktional ähnlich ist und von der ursprünglichen Idee und dem Design von Liam Wisehart, Justin Ngai, Carl El Khoury, Mansee Chadha bei Meta inspiriert wurde, handelt es sich um eine separate, unabhängig entwickelte Codebasis. Wir danken für die Vision und die grundlegenden Konzepte, die diese Arbeit inspiriert haben.
Jailer ist ein eBPF-basiertes Prozess-Jailing-System, das Mandatory Access Control (MAC) für Linux bereitstellt. Es verfolgt Prozesse mithilfe von BPF task_storage-Maps und erzwingt rollenbasierte Richtlinien für Dateizugriff, Netzwerkoperationen und Prozessausführung.
| Funktion | Status | Beschreibung |
|---|---|---|
| Prozessverfolgung | ✅ Funktioniert | Verfolgt Prozesse mithilfe der task_storage BPF-Map |
| Socket-Registrierung | ✅ Funktioniert | Prozesse registrieren sich über die Unix-Socket-API |
| Rollenbasierte Richtlinien | ✅ Funktioniert | Eingeschränkte und permissive Rollen |
| Dateizugriffskontrolle | ✅ Funktioniert | Blockieren/Erlauben von Dateiöffnungsoperationen |
| Jail-Vererbung | ✅ Funktioniert | Kindprozesse erben das Jail des Elternprozesses |
| Netzwerkkontrolle | ✅ Funktioniert | Blockieren/Erlauben von Socket-Bind/Connect |
| Port-/Protokollfilterung | ✅ Funktioniert | TCP/UDP-Erlaubnis-/Verbotsregeln pro Port |
| Exec-Kontrolle | ✅ Funktioniert | Blockieren/Erlauben der Prozessausführung |
| Pfadabgleich | ✅ Funktioniert | Dentry-Walking mit Cache-Invalidierung |
| Signierte Binärdateien | 🚧 Stub | Validierung von Binärsignaturen (nicht implementiert) |
| Alternative Registrierung | ✅ Funktioniert | Automatische Registrierung nach Executable, cgroup oder xattr |
| Daemonloser Modus | ✅ Funktioniert | Bootstrap-Binary pinnt Programme beim frühen Bootvorgang |
| Audit-Ereignisse | ✅ Funktioniert | Perf-Buffer für systemd-journald-Integration |

BPF_MAP_TYPE_TASK_STORAGE-Unterstützung)# Check current kernel config
zcat /proc/config.gz 2>/dev/null || cat /boot/config-$(uname -r)
Erforderliche Optionen:
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_LSM=y
CONFIG_DEBUG_INFO_BTF=y
BPF LSM muss in den Kernel-Boot-Parametern aktiviert werden:
# 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
Für Ubuntu/Debian-Systeme können Sie auch Folgendes verwenden:
# 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
Vorgefertigte Tarballs werden für x86_64 und aarch64 veröffentlicht, gebaut gegen
glibc 2.31, damit sie auf älteren Distributionen laufen als der, auf der sie gebaut wurden.
curl -fsSL https://github.com/gen0sec/jailer/raw/main/install.sh | sudo sh
Das Skript überprüft den SHA256, bevor irgendetwas installiert wird. Jedes Artefakt ist außerdem GPG-signiert; um die Herkunft zu überprüfen, importiere zuerst den Release-Schlüssel:
curl -fsSL https://github.com/gen0sec/jailer/releases/download/v0.1.1/bpfjailer-signing-key.asc | gpg --import
Um es stattdessen manuell zu installieren, lade das Tarball für deine Architektur von der Releases-Seite herunter und:
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
Dann aktivieren Sie einen der beiden Modi, die unter Installationsmodi beschrieben sind.
# 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
Erwartete Ausgabe:
[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
Beispielausgabe mit eingeschränkter Rolle:
============================================================
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)