
Agente de Monitoramento de Segurança e Sandboxing eBPF Baseado em Aya
Bombini é um agente de segurança baseado em eBPF escrito inteiramente em Rust usando a biblioteca Aya e construído sobre hooks BPF do LSM (Linux Security Module). Em seu núcleo, o Bombini emprega componentes modulares chamados Detectors, cada um responsável por monitorar e reportar tipos específicos de eventos do sistema. Detectors com modo sandbox habilitado também bloqueiam ações proibidas diretamente no kernel.
EPERM em vez de serem reportados
depois de já terem acontecido.scope/event
ou reportam um evento ou, com sandbox habilitado, o negam.O Bombini precisa de Linux 6.2+ com BPF LSM habilitado. Verifique as notas de compatibilidade primeiro. A imagem de container é construída para x86_64.
Inicie o Bombini com a configuração de início rápido a partir da raiz do repositório:
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
A configuração consiste em três arquivos de detector.
procmon.yaml reporta setuid para root e proíbe
executar qualquer coisa de /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 leituras de /etc/shadow:
# Detect reads of password hashes
file_open:
enabled: true
rules:
- rule: ShadowRead
event: path == "/etc/shadow"
netmon.yaml reporta conexões ao serviço de metadados
da nuvem:
# 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
Gere eventos em outro 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
O Bombini imprime eventos no stdout como linhas JSON. Este é o 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"
}
Mais políticas prontas, como escapes de shell do GTFOBins e escalação de privilégios, estão em examples.
| Detector | O que monitora | Sandbox |
|---|---|---|
| ProcMon | Execuções e saídas de processos, setuid/setgid, capabilities, prctl, namespaces de usuário, ptrace | ✓ |
| FileMon | Abertura de arquivo, mmap, truncate, unlink, symlink, chmod, chown, mount, ioctl | ✓ |
| NetMon | Conexões TCP de entrada e saída, criação e conexão de socket | ✓ |
| KernelMon | Criação de mapas BPF, carregamento de programas BPF e acesso a mapas e programas BPF | |
| IOUringMon | Entradas da fila de submissão do io_uring | |
| SysEnumMon (experimental) | Enumeração do sistema: vários arquivos ou binários monitorados acessados dentro de uma janela de tempo |
A sintaxe das regras é descrita em Rules, e o formato dos eventos em Events.
A documentação completa está no book.
Por favor, consulte o CONTRIBUTING.md para as diretrizes de contribuição.