
Agent de surveillance de sécurité et de sandboxing eBPF basé sur Aya
Bombini est un agent de sécurité basé sur eBPF, écrit entièrement en Rust avec la bibliothèque Aya et construit sur les hooks BPF LSM (Linux Security Module). À la base, Bombini utilise des composants modulaires appelés Detectors, chacun responsable de la surveillance et de la remontée de types spécifiques d'événements système. Les Detectors dont le mode sandbox est activé bloquent également les actions interdites directement dans le noyau.
EPERM au lieu d'être signalé
une fois qu'il s'est déjà produit.scope/event
signalent un événement ou, avec sandbox activé, le refusent.Bombini nécessite Linux 6.2+ avec BPF LSM activé. Consultez d'abord les notes de compatibilité. L'image de conteneur est construite pour x86_64.
Démarrez Bombini avec la configuration quickstart depuis la racine du dépôt :
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 configuration se compose de trois fichiers de détecteurs.
procmon.yaml signale le setuid vers root et interdit
l'exécution de quoi que ce soit depuis /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 signale les lectures de /etc/shadow :
# Detect reads of password hashes
file_open:
enabled: true
rules:
- rule: ShadowRead
event: path == "/etc/shadow"
netmon.yaml signale les connexions au service de métadonnées
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
Générez des événements dans un autre terminal :
$ ./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 affiche les événements sur stdout sous forme de lignes JSON. Voici l'exec bloqué :
{
"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"
}
D'autres politiques prêtes à l'emploi, telles que les évasions de shell GTFOBins et l'élévation de privilèges, se trouvent dans examples.
| Detector | Ce qu'il surveille | Sandbox |
|---|---|---|
| ProcMon | Execs et sorties de processus, setuid/setgid, capabilities, prctl, user namespaces, ptrace | ✓ |
| FileMon | Ouverture de fichier, mmap, truncate, unlink, symlink, chmod, chown, mount, ioctl | ✓ |
| NetMon | Connexions TCP entrantes et sortantes, création et connexion de socket | ✓ |
| KernelMon | Création de maps BPF, chargements de programmes BPF, et accès aux maps et programmes BPF | |
| IOUringMon | Entrées de la file de soumission io_uring | |
| SysEnumMon (expérimental) | Énumération système : plusieurs fichiers ou binaires surveillés touchés dans une fenêtre temporelle |
La syntaxe des règles est décrite dans Rules, et le format des événements dans Events.