
Agente de Monitoreo de Seguridad y Sandboxing eBPF Basado en Aya
Bombini es un agente de seguridad basado en eBPF escrito completamente en Rust usando la biblioteca Aya y construido sobre hooks BPF de LSM (Linux Security Module). En su núcleo, Bombini emplea componentes modulares llamados Detectors, cada uno responsable de monitorear y reportar tipos específicos de eventos del sistema. Los Detectors con el modo sandbox habilitado también bloquean acciones prohibidas directamente en el kernel.
EPERM en lugar de ser reportados
una vez que ya ocurrieron.scope/event
ya sea reportan un evento o, con sandbox habilitado, lo deniegan.Bombini necesita Linux 6.2+ con BPF LSM habilitado. Consulta primero las notas de compatibilidad. La imagen de contenedor está construida para x86_64.
Inicia Bombini con la configuración de inicio rápido desde la raíz del repositorio:
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 configuración consta de tres archivos de detector.
procmon.yaml reporta setuid a root y prohíbe
ejecutar cualquier cosa desde /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 reporta lecturas de /etc/shadow:
# Detect reads of password hashes
file_open:
enabled: true
rules:
- rule: ShadowRead
event: path == "/etc/shadow"
netmon.yaml reporta conexiones al servicio de metadatos
de la nube:
# 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 eventos en otra 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 imprime eventos en stdout como líneas JSON. Este es el exec bloqueado:
{
"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"
}
Más políticas ya preparadas, como escapes de shell de GTFOBins y escalada de privilegios, están en examples.
| Detector | Qué vigila | Sandbox |
|---|---|---|
| ProcMon | Execs y salidas de procesos, setuid/setgid, capabilities, prctl, user namespaces, ptrace | ✓ |
| FileMon | Apertura de archivos, mmap, truncate, unlink, symlink, chmod, chown, mount, ioctl | ✓ |
| NetMon | Conexiones TCP entrantes y salientes, creación y conexión de sockets | ✓ |
| KernelMon | Creación de mapas BPF, cargas de programas BPF y acceso a mapas y programas BPF | |
| IOUringMon | Entradas de la cola de envío de io_uring | |
| SysEnumMon (experimental) | Enumeración del sistema: varios archivos o binarios vigilados tocados dentro de una ventana de tiempo |
La sintaxis de las reglas se describe en Rules, y el formato de los eventos en Events.
La documentación completa está en el libro.