
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. Utilisez-le uniquement pour des tests et des expérimentations.
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 originale et de la conception de Liam Wisehart, Justin Nga, 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 |
| Inscription par socket | ✅ Fonctionnel | Les processus s'inscrivent 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 | Bloquer/autoriser les opérations d'ouverture de fichiers |
| Héritage de la prison | ✅ Fonctionnel | Les processus enfants héritent de la prison du parent |
| Contrôle réseau | ✅ Fonctionnel | Bloquer/autoriser les opérations socket bind/connect |
| Filtrage par port/protocole | ✅ Fonctionnel | Règles d'autorisation/refus par port TCP/UDP |
| Contrôle d'exécution | ✅ Fonctionnel | Bloquer/autoriser l'exécution de processus |
| Correspondance de chemin | ✅ Fonctionnel | Parcours de dentry avec invalidation de cache |
| Binaires signés | 🚧 Ébauche | Validation de signature binaire (non implémentée) |
| Inscription alternative | ✅ Fonctionnel | Auto-inscription par exécutable, cgroup ou xattr |
| Mode sans démon | ✅ Fonctionnel | Binaire bootstrap épinglant des programmes au démarrage précoce |
| Événements d'audit | ✅ Fonctionnel | Tampon perf pour l'intégration systemd-journald |

BPF_MAP_TYPE_TASK_STORAGE)# Vérifier la configuration actuelle du noyau
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 :
# Vérifier si BPF LSM est actif
cat /sys/kernel/security/lsm
# Doit inclure "bpf" dans la liste
# Si ce n'est pas le cas, ajouter aux paramètres de démarrage :
# Éditer /etc/default/grub et ajouter à GRUB_CMDLINE_LINUX :
# lsm=lockdown,capability,landlock,yama,apparmor,bpf
# Puis mettre à jour grub et redémarrer :
sudo update-grub
sudo reboot
Pour les systèmes Ubuntu/Debian, vous pouvez également utiliser :
# Créer un script pour activer 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 activé. Veuillez redémarrer."
EOF
chmod +x /tmp/enable_bpf_lsm.sh
sudo /tmp/enable_bpf_lsm.sh
# Installer Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Installer les dépendances de construction (Ubuntu/Debian)
sudo apt-get install -y clang llvm libelf-dev linux-headers-$(uname -r)
# Installer la cible BPF pour Rust
rustup target add bpfel-unknown-none
cd bpfjail
# Construire les programmes BPF
cd bpfjailer-bpf && cargo build --release && cd ..
# Construire le démon et le client
cargo build --release
# Exécuter en tant que root (charge config/policy.json si présent)
sudo RUST_LOG=info ./target/release/bpfjailer-daemon
Sortie attendue :
[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
# Exécuter les tests de vulnérabilité SANS emprisonnement (montre les attaques réussies)
sudo python3 tests/vulnerable_apps/run_tests.py
# Exécuter les tests de vulnérabilité AVEC le rôle restreint (montre les attaques bloquées)
sudo python3 tests/vulnerable_apps/run_tests.py --role 1
# Exécuter un test spécifique
sudo python3 tests/vulnerable_apps/run_tests.py --role 1 --test path
# Lister les tests et rôles disponibles
sudo python3 tests/vulnerable_apps/run_tests.py --list
Exemple de sortie avec le rôle restreint :
============================================================
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)
| Test | Vulnérabilité | Atténué par |
|---|---|---|
path_traversal | Lecture arbitraire de fichiers via ../ | restricted, isolated |
command_injection | Exécution de commandes shell | restricted, webserver, isolated |
reverse_shell | Connexions sortantes vers l'attaquant | restricted, isolated |
ssrf | Accès aux services internes/métadonnées cloud | restricted, isolated |
arbitrary_write | Écriture dans des chemins sensibles | restricted |
crypto_miner | Téléchargement + exécution + connexion au pool | restricted, webserver |
privilege_escalation | Lecture shadow, écriture sudoers | restricted |