
Jailer è un sistema di confinamento dei processi basato su eBPF che fornisce controllo degli accessi obbligatorio (MAC) per Linux. Tiene traccia dei processi utilizzando mappe BPF task_storage e applica politiche basate sui ruoli per l'accesso ai file, le operazioni di rete e l'esecuzione dei processi.
Attenzione: Questo progetto è in fase di sviluppo intenso e NON è pronto per l'uso in produzione. API, formati delle policy e comportamento possono cambiare senza preavviso. Usare solo per test e sperimentazione.
Nota: Questa è un'implementazione indipendente e non è lo stesso progetto della soluzione di Meta. Sebbene BpfJailer sia funzionalmente simile e ispirato all'idea originale e al design di Liam Wisehart, Justin Nga, Carl El Khoury, Mansee Chadha presso Meta, questo è un codice base separato sviluppato in modo indipendente. Esprimiamo la nostra gratitudine per la visione e i concetti fondamentali che hanno ispirato questo lavoro.
Jailer è un sistema di confinamento dei processi basato su eBPF che fornisce un controllo di accesso obbligatorio (MAC) per Linux. Tiene traccia dei processi utilizzando le mappe BPF task_storage e applica policy basate sui ruoli per l'accesso ai file, le operazioni di rete e l'esecuzione dei processi.
| Caratteristica | Stato | Descrizione |
|---|---|---|
| Tracciamento dei processi | ✅ Funzionante | Tiene traccia dei processi usando la mappa BPF task_storage |
| Arruolamento tramite socket | ✅ Funzionante | I processi si arruolano tramite API socket Unix |
| Policy basate sui ruoli | ✅ Funzionante | Ruoli ristretto e permissivo |
| Controllo accesso ai file | ✅ Funzionante | Blocca/consente operazioni di apertura file |
| Ereditarietà del jail | ✅ Funzionante | I processi figli ereditano il jail del genitore |
| Controllo di rete | ✅ Funzionante | Blocca/consente bind/connect dei socket |
| Filtraggio porta/protocollo | ✅ Funzionante | Regole di permesso/negazione per porta TCP/UDP |
| Controllo esecuzione | ✅ Funzionante | Blocca/consente esecuzione dei processi |
| Corrispondenza percorsi | ✅ Funzionante | Attraversamento dentry con invalidamento cache |
| Binari firmati | 🚧 Scheletro | Validazione firma binari (non implementata) |
| Arruolamento alternativo | ✅ Funzionante | Auto-arruolamento per eseguibile, cgroup o xattr |
| Modalità senza demone | ✅ Funzionante | Binario bootstrap fissa i programmi all'avvio iniziale |
| Eventi di audit | ✅ Funzionante | Buffer perf per integrazione con systemd-journald |

BPF_MAP_TYPE_TASK_STORAGE)# Controlla la configurazione attuale del kernel
zcat /proc/config.gz 2>/dev/null || cat /boot/config-$(uname -r)
Opzioni richieste:
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_LSM=y
CONFIG_DEBUG_INFO_BTF=y
BPF LSM deve essere abilitato nei parametri di avvio del kernel:
# Controlla se BPF LSM è attivo
cat /sys/kernel/security/lsm
# Dovrebbe includere "bpf" nell'elenco
# Se non presente, aggiungi ai parametri di avvio del kernel:
# Modifica /etc/default/grub e aggiungi a GRUB_CMDLINE_LINUX:
# lsm=lockdown,capability,landlock,yama,apparmor,bpf
# Quindi aggiorna grub e riavvia:
sudo update-grub
sudo reboot
Per sistemi Ubuntu/Debian, puoi anche usare:
# Crea uno script per abilitare 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 abilitato. Riavvia il sistema."
EOF
chmod +x /tmp/enable_bpf_lsm.sh
sudo /tmp/enable_bpf_lsm.sh
# Installa Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Installa le dipendenze di compilazione (Ubuntu/Debian)
sudo apt-get install -y clang llvm libelf-dev linux-headers-$(uname -r)
# Installa il target BPF per Rust
rustup target add bpfel-unknown-none
cd bpfjail
# Compila i programmi BPF
cd bpfjailer-bpf && cargo build --release && cd ..
# Compila demone e client
cargo build --release
# Esegui come root (carica config/policy.json se presente)
sudo RUST_LOG=info ./target/release/bpfjailer-daemon
Output previsto:
[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
# Esegui test di vulnerabilità SENZA confinamento (mostra attacchi riusciti)
sudo python3 tests/vulnerable_apps/run_tests.py
# Esegui test di vulnerabilità CON ruolo ristretto (mostra attacchi bloccati)
sudo python3 tests/vulnerable_apps/run_tests.py --role 1
# Esegui un test specifico
sudo python3 tests/vulnerable_apps/run_tests.py --role 1 --test path
# Elenca i test e i ruoli disponibili
sudo python3 tests/vulnerable_apps/run_tests.py --list
Esempio di output con ruolo ristretto:
============================================================
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 | Vulnerabilità | Mitigato Da |
|---|---|---|
path_traversal | Lettura arbitraria di file tramite ../ | ristretto, isolato |
command_injection | Esecuzione di comandi shell | ristretto, webserver, isolato |
reverse_shell | Connessioni in uscita verso l'attaccante | ristretto, isolato |
ssrf | Accesso a servizi interni/metadati cloud | ristretto, isolato |
arbitrary_write | Scrittura su percorsi sensibili | ristretto |
crypto_miner | Download + esecuzione + connessione al pool | ristretto, webserver |
privilege_escalation | Lettura di shadow, scrittura su sudoers | ristretto |
#!/usr/bin/env python3
import socket
import json
import os
# Connettiti al demone
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect("/run/bpfjailer/enrollment.sock")