
Агент мониторинга безопасности и песочницы на основе eBPF на базе Aya
Bombini — это агент безопасности на основе eBPF, полностью написанный на Rust с использованием библиотеки Aya и построенный на BPF-хуках LSM (Linux Security Module). В своей основе Bombini использует модульные компоненты, называемые детекторами, каждый из которых отвечает за мониторинг и отчётность по определённым типам системных событий. Детекторы с включённым режимом песочницы также блокируют запрещённые действия прямо в ядре.
EPERM, а не просто
регистрируется после того, как оно уже произошло.scope/event либо сообщают о событии, либо, при включённом sandbox, отклоняют его.Bombini требует Linux 6.2+ с включённым BPF LSM. Сначала ознакомьтесь с заметками о совместимости. Образ контейнера собран для x86_64.
Запустите Bombini с конфигурацией быстрого старта из корня репозитория:
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
Конфигурация состоит из трёх файлов детекторов.
procmon.yaml сообщает о setuid в root и запрещает
выполнение чего-либо из /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 сообщает о чтении /etc/shadow:
# Detect reads of password hashes
file_open:
enabled: true
rules:
- rule: ShadowRead
event: path == "/etc/shadow"
netmon.yaml сообщает о подключениях к сервису
метаданных облака:
# 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
Сгенерируйте события в другом терминале:
$ ./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 выводит события в stdout в виде строк JSON. Вот заблокированный exec:
{
"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"
}
Другие готовые политики, такие как выходы из оболочки через GTFOBins и повышение привилегий, находятся в examples.
| Детектор | За чем следит | Песочница |
|---|---|---|
| ProcMon | Запуск и завершение процессов, setuid/setgid, capabilities, prctl, пользовательские пространства имён, ptrace | ✓ |
| FileMon | Открытие файлов, mmap, truncate, unlink, symlink, chmod, chown, mount, ioctl | ✓ |
| NetMon | Входящие и исходящие TCP-соединения, создание сокетов и подключение | ✓ |
| KernelMon | Создание BPF-карт, загрузка BPF-программ и доступ к BPF-картам и программам | |
| IOUringMon | Записи очереди отправки io_uring | |
| SysEnumMon (экспериментальный) | Перечисление системы: несколько отслеживаемых файлов или бинарников затронуты в течение временного окна |
Синтаксис правил описан в разделе Правила, а формат событий — в разделе События.
Полная документация находится в книге.
Пожалуйста, ознакомьтесь с CONTRIBUTING.md, чтобы узнать правила участия в разработке.