
وكيل مراقبة أمنية وعزل (Sandboxing) بتقنية eBPF مبني على Aya
Bombini هو وكيل أمني قائم على eBPF مكتوب بالكامل بلغة Rust باستخدام مكتبة Aya ومبني على خطافات LSM (وحدة الأمان في Linux) BPF. في جوهره، يستخدم Bombini مكونات معيارية تُسمى Detectors، كل منها مسؤول عن مراقبة أنواع محددة من أحداث النظام والإبلاغ عنها. كما أن الكاشفات التي تكون وضع العزل الرملي مفعّلاً فيها تحجب الإجراءات المحظورة مباشرة في النواة.
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. هذا هو التنفيذ المحظور:
{
"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"
}
توجد سياسات جاهزة أخرى، مثل هروب shell عبر GTFOBins ورفع الصلاحيات، في examples.
| الكاشف | ما يراقبه | العزل الرملي |
|---|---|---|
| ProcMon | تنفيذ وخروج العمليات، setuid/setgid، القدرات، prctl، مساحات أسماء المستخدمين، ptrace | ✓ |
| FileMon | فتح الملفات، mmap، truncate، unlink، symlink، chmod، chown، mount، ioctl | ✓ |
| NetMon | اتصالات TCP الواردة والصادرة، إنشاء المقابس والاتصال | ✓ |
| KernelMon | إنشاء خرائط BPF، تحميل برامج BPF، والوصول إلى خرائط وبرامج BPF | |
| IOUringMon | إدخالات قائمة إرسال io_uring | |
| SysEnumMon (تجريبي) | تعداد النظام: عدة ملفات أو برامج مراقَبة يتم لمسها خلال نافذة زمنية |
يُوصف تركيب القواعد في القواعد، وتنسيق الأحداث في الأحداث.
التوثيق الكامل موجود في الكتاب.
يرجى الاطلاع على CONTRIBUTING.md للحصول على إرشادات المساهمة.