
Jailer est un système de confinement de processus basé sur eBPF qui fournit un contrôle d'accès obligatoire (MAC) pour Linux. Il suit les processus à l'aide de maps BPF task_storage et applique des politiques basées sur les rôles en matière d'accès aux fichiers, d'opérations réseau et d'exécution de processus.
Avertissement : Ce projet est en cours de développement intensif et n'est PAS prêt pour une utilisation en production. Les API, les formats de politique et le comportement peuvent changer sans préavis. À utiliser uniquement pour les tests et l'expérimentation.
Note : Il s'agit d'une implémentation indépendante et non du même projet que la solution de Meta. Bien que BpfJailer soit fonctionnellement similaire et inspiré de l'idée et de la conception originales de Liam Wisehart, Justin Ngai, Carl El Khoury, Mansee Chadha chez Meta, il s'agit d'une base de code distincte développée indépendamment. Nous exprimons notre gratitude pour la vision et les concepts fondamentaux qui ont inspiré ce travail.
Jailer est un système d'isolation de processus basé sur eBPF qui fournit un contrôle d'accès obligatoire (MAC) pour Linux. Il suit les processus à l'aide de cartes BPF task_storage et applique des politiques basées sur les rôles pour l'accès aux fichiers, les opérations réseau et l'exécution de processus.
| Fonctionnalité | Statut | Description |
|---|---|---|
| Suivi des processus | ✅ Fonctionnel | Suit les processus à l'aide de la carte BPF task_storage |
| Enrôlement par socket | ✅ Fonctionnel | Les processus s'enrôlent via l'API socket Unix |
| Politiques basées sur les rôles | ✅ Fonctionnel | Rôles restreints et permissifs |
| Contrôle d'accès aux fichiers | ✅ Fonctionnel | Bloque/autorise les opérations d'ouverture de fichiers |
| Héritage de l'isolation | ✅ Fonctionnel | Les processus enfants héritent de l'isolation du parent |
| Contrôle réseau | ✅ Fonctionnel | Bloque/autorise bind/connect sur les sockets |
| Filtrage port/protocole | ✅ Fonctionnel | Règles d'autorisation/refus TCP/UDP par port |
| Contrôle d'exécution | ✅ Fonctionnel | Bloque/autorise l'exécution de processus |
| Correspondance de chemins | ✅ Fonctionnel | Parcours de dentry avec invalidation du cache |
| Binaires signés | 🚧 Ébauche | Validation de signature de binaire (non implémentée) |
| Enrôlement alternatif | ✅ Fonctionnel | Enrôlement automatique par exécutable, cgroup ou xattr |
| Mode sans démon | ✅ Fonctionnel | Le binaire d'amorçage épingle les programmes au démarrage précoce |
| Événements d'audit | ✅ Fonctionnel | Tampon perf pour l'intégration avec systemd-journald |

BPF_MAP_TYPE_TASK_STORAGE)# Check current kernel config
zcat /proc/config.gz 2>/dev/null || cat /boot/config-$(uname -r)
Options requises :
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_LSM=y
CONFIG_DEBUG_INFO_BTF=y
BPF LSM doit être activé dans les paramètres de démarrage du noyau :
# 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
Pour les systèmes Ubuntu/Debian, vous pouvez également utiliser :
# 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
Des tarballs précompilés sont publiés pour x86_64 et aarch64, compilés contre
glibc 2.31 afin qu'ils fonctionnent sur des distributions plus anciennes que celle sur laquelle ils ont été compilés.
curl -fsSL https://github.com/gen0sec/jailer/raw/main/install.sh | sudo sh
Le script vérifie le SHA256 avant d'installer quoi que ce soit. Chaque artefact est également signé GPG ; pour vérifier la provenance, importez d'abord la clé de version :
curl -fsSL https://github.com/gen0sec/jailer/releases/download/v0.1.1/bpfjailer-signing-key.asc | gpg --import
Pour installer manuellement à la place, téléchargez l'archive tar pour votre architecture depuis la page des releases et :
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
Activez ensuite l'un des deux modes décrits dans Modes d'installation.
# 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
Expected output:
[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
Exemple de sortie avec un rôle restreint :
============================================================
TEST: Path Traversal / Arbitrary File Read
============================================================
Attempting to read /etc/passwd via path traversal...
BLOCKED - Permission denied (BpfJailer blocked file access)