
Agente di monitoraggio della sicurezza e sandboxing eBPF basato su Aya
Bombini è un agente di sicurezza basato su eBPF scritto interamente in Rust utilizzando la libreria Aya e costruito sugli hook BPF LSM (Linux Security Module). Al suo interno, Bombini impiega componenti modulari chiamati Detector, ognuno responsabile del monitoraggio e della segnalazione di specifici tipi di eventi di sistema. I Detector con la modalità sandbox abilitata bloccano anche le azioni vietate direttamente nel kernel.
EPERM invece di essere segnalati
dopo che si sono già verificati.scope/event
segnalano un evento oppure, con sandbox abilitato, lo negano.Bombini richiede Linux 6.2+ con BPF LSM abilitato. Consulta prima le note sulla compatibilità. L'immagine container è compilata per x86_64.
Avvia Bombini con la configurazione quickstart dalla radice del repository:
docker run --pid=host --rm -it --privileged \
-v $PWD/examples/quickstart:/usr/local/lib/bombini/config:ro \
-v /sys/fs/bpf:/sys/fs/bpf \
ghcr.io/bombinisecurity/bombini:v1.1.0
La configurazione è composta da tre file dei detector.
procmon.yaml segnala il setuid verso root e vieta
l'esecuzione di qualsiasi cosa da /tmp:
# Detect privilege escalation to root
setuid:
enabled: true
rules:
- rule: SetUidToRoot
event: euid == 0
# Block binaries executed from /tmp right in the kernel
bprm_check:
enabled: true
sandbox:
enabled: true
deny_list: true
rules:
- rule: DenyExecFromTmp
event: path_prefix == "/tmp"
filemon.yaml segnala le letture di /etc/shadow:
# Detect reads of password hashes
file_open:
enabled: true
rules:
- rule: ShadowRead
event: path == "/etc/shadow"
netmon.yaml segnala le connessioni al servizio di
metadata del cloud:
# Detect access to the cloud metadata service: a common way to steal credentials
egress:
enabled: true
rules:
- rule: CloudMetadataAccess
event: ipv4_dst == "169.254.169.254" AND port_dst == 80
Genera eventi in un altro terminale:
$ ./examples/quickstart/trigger.sh
[1] sudo reads /etc/shadow: Setuid and FileOpen events
[2] exec a binary from /tmp: blocked by the sandbox
./examples/quickstart/trigger.sh: 10: /tmp/bombini-quickstart: Operation not permitted
blocked: exit code 126
[3] connect to the cloud metadata service: Egress event
Bombini stampa gli eventi su stdout come righe JSON. Questo è l'exec bloccato:
{
"type": "ProcessEvent",
"process": {
"start_time": "2026-10-03T14:36:10.256Z",
"cloned": true,
"pid": 39988,
"tid": 39988,
"ppid": 39984,
"uid": 503,
"euid": 503,
"gid": 1000,
"egid": 1000,
"auid": 0,
"cap_inheritable": "",
"cap_permitted": "",
"cap_effective": "",
"secureexec": "",
"filename": "dash",
"binary_path": "/usr/bin/dash",
"args": "./examples/quickstart/trigger.sh",
"exec_id": "Mzk5ODg6MjEyNzU3NDAzMjI2MzI2",
"parent_exec_id": "Mzk5ODQ6MjEyNzU3MzgzNTY5NTc3"
},
"parent": { "...": "same fields for the parent process" },
"blocked": true,
"process_event": {
"type": "BprmCheck",
"binary": "/tmp/bombini-quickstart"
},
"timestamp": "2026-10-03T14:36:10.256Z",
"rule": "DenyExecFromTmp"
}
Altre policy già pronte, come le shell escape di GTFOBins e l'escalation di privilegi, sono in examples.
| Detector | Cosa monitora | Sandbox |
|---|---|---|
| ProcMon | Exec e uscite dei processi, setuid/setgid, capabilities, prctl, user namespace, ptrace | ✓ |
| FileMon | Apertura file, mmap, truncate, unlink, symlink, chmod, chown, mount, ioctl | ✓ |
| NetMon | Connessioni TCP in ingresso e in uscita, creazione e connessione di socket | ✓ |
| KernelMon | Creazione di mappe BPF, caricamento di programmi BPF e accesso a mappe e programmi BPF | |
| IOUringMon | Voci della coda di sottomissione io_uring | |
| SysEnumMon (sperimentale) | Enumerazione del sistema: diversi file o binari monitorati toccati entro una finestra temporale |
La sintassi delle regole è descritta in Rules, e il formato degli eventi in Events.
La documentazione completa è nel book.