
مراقب صامت يعمل بتقنية eBPF لبيئات التشغيل المحتواة، مصمم لصناديق تحليل البرامج الضارة ومراقبة الذكاء الاصطناعي الوكيل.

متعقِّب أمني خفيف الوزن مبني على eBPF ومصمَّم خصيصًا لـ مختبرات تحليل البرامج الضارة. قم بإسقاط عينة في حاوية معزولة، ويلتقط Azazel كل استدعاء نظام، وملف يتم لمسه، واتصال شبكة، وسلوك مشبوه، ثم يمنحك تدفق JSON نظيفًا لكل ما حدث.
سواء كنت تبني مختبر تحليل برامج ضارة آليًا أو تحتاج إلى مراقبة زمنية فورية 24/7 للوكلاء الذكيين المستقلين (AI Agents)، يوفر Azazel قياسًا عن بعد دقيقًا وغير مرئي وجاهزًا للذكاء الاصطناعي بتنسيق JSON.
Usage:
azazel [flags]
azazel [command]
Commands:
run-sandbox تشغيل عينة برنامج ضار في حاوية Docker معزولة وتتبعها
list-containers عرض الحاويات قيد التشغيل
version طباعة الإصدار
Global Flags:
-c, --container strings معرفات الحاوية للتصفية (يمكن تحديد عدة)
-o, --output string مسار ملف الإخراج (الافتراضي: stdout)
--pretty تنسيق JSON للإخراج بشكل جميل
--stdout الطباعة أيضًا على stdout عند تعيين --output
-v, --verbose تسجيل مفصَّل
--no-summary تعطيل الملخص عند الخروج
-h, --help المساعدة

19 نقطة ربط إجمالاً — نقاط التتبع عند دخول استدعاء النظام + kprobe لكشف DNS.
vmlinux.h، يعمل عبر إصدارات النواة دون إعادة ترجمةjq، Elasticsearch، Splunk، أو خط أنابيبك الخاص/tmp، الوصول إلى ملفات حساسة (/etc/shadow، /proc/self/mem)، ptrace، mmap مع W+X، وتحميل وحدات النواةCONFIG_DEBUG_INFO_BTF=yتحقق من نواتك:
# دعم BTF (مطلوب)
ls /sys/kernel/btf/vmlinux
# إصدار kernel
uname -r
# استنساخ
git clone https://github.com/beelzebub-labs/azazel.git
cd azazel
# بناء حاوية التطوير
make docker-dev
# الدخول إليها (بصلاحيات مميزة، مع مساحة اسم PID/cgroup للمضيف)
make docker-dev-run
# داخل الحاوية:
make vmlinux # توليد تعريفات أنواع النواة
make generate # ترجمة BPF C → روابط Go
make build # بناء الثنائي
# تتبع كل شيء، الإخراج إلى stdout
sudo ./bin/azazel
# تتبع كل شيء، حفظ إلى ملف مع JSON جميل
sudo ./bin/azazel --output events.json --pretty
# تتبع حاوية معينة فقط
sudo ./bin/azazel --container <container_id> --output events.json
# عرض الحاويات قيد التشغيل
sudo ./bin/azazel list-containers
# داخل حاوية التطوير
make test
يقوم هذا ببناء الثنائي، بدء المتعقب، تشغيل محاكي سلوك البرامج الضارة، ثم التحقق من التقاط جميع أنواع الأحداث المتوقعة.
كل حدث هو سطر JSON واحد (NDJSON):
{
"timestamp": "2025-01-15T14:30:22.123456789Z",
"event_type": "process_exec",
"pid": 12345,
"tgid": 12345,
"ppid": 12300,
"uid": 0,
"gid": 0,
"comm": "bash",
"cgroup_id": 6789,
"container_id": "a1b2c3d4e5f6",
"filename": "/tmp/suspicious_binary",
"args": "/tmp/suspicious_binary"
}
{
"timestamp": "2025-01-15T14:30:22.234567890Z",
"event_type": "net_connect",
"pid": 12345,
"tgid": 12345,
"ppid": 12300,
"uid": 0,
"gid": 0,
"comm": "curl",
"cgroup_id": 6789,
"container_id": "a1b2c3d4e5f6",
"sa_family": "AF_INET",
"dst_addr": "93.184.216.34",
"dst_port": 443
}
عند إيقاف المتعقب (Ctrl+C أو SIGTERM)، يطبع ملخصًا إلى stderr:
========================================
Azazel Summary
========================================
Total events: 1847
Event counts:
file_open 892
file_write 312
process_exec 47
net_connect 23
...
Security Alerts (3):
[MEDIUM] execution from suspicious path: /tmp/suspicious_binary (pid=12345 comm=bash)
[MEDIUM] sensitive file access: /etc/shadow (pid=12346 comm=cat)
[CRITICAL] memory mapped as WRITE+EXEC (possible code injection/unpacking) (pid=12347 comm=malware)
========================================
ملف docker-compose.yml المرفق يُنشئ بيئة تحليل كاملة:

# تشغيل المختبر
docker compose up -d
# نسخ عينة إلى المختبر
docker cp ./samples/malware.elf sandbox:/tmp/sample
# تنفيذها
docker exec sandbox /tmp/sample
# تتم كتابة الأحداث إلى ./output/events.json
cat output/events.json | jq .
# تحليل عينة من البداية إلى النهاية: hash → trace → report
sudo ./analyze.sh ./samples/malware.elf 30
ينتج هذا:
output/events_<timestamp>.json — تدفق الأحداث الخامoutput/report_<timestamp>.md — تقرير بصيغة Markdown مع التجزئة (hashes)، ملخص الأحداث، اتصالات الشبكة، والتنبيهات الأمنيةUsage:
azazel [flags]
azazel [command]
Commands:
list-containers عرض الحاويات قيد التشغيل
version طباعة الإصدار
Flags:
-c, --container strings معرفات الحاوية للتصفية (يمكن تحديد عدة)
-o, --output string مسار ملف الإخراج (الافتراضي: stdout)
--pretty تنسيق JSON للإخراج بشكل جميل
--stdout الطباعة أيضًا على stdout عند تعيين --output
-v, --verbose تسجيل مفصَّل
--no-summary تعطيل الملخص عند الخروج
-h, --help المساعدة
azazel/
├── main.go # نقطة الدخول
├── cmd/root.go # CLI (cobra)
├── bpf/tracer.bpf.c # جميع برامج eBPF (ملف واحد)
├── internal/
│ ├── tracer/
│ │ ├── tracer.go # النواة: تحميل، ربط، قراءة الحلقة العازلة (ring buffer)
│ │ └── events.go # أنواع الأحداث، الهياكل، التحليل
│ ├── container/
│ │ └── resolver.go # تحويل cgroup → معرف الحاوية
│ └── output/
│ └── writer.go # إخراج JSON + التنبيهات الإرشادية
├── test/
│ ├── simulate_malware.sh # محاكي سلوك البرامج الضارة
│ └── run_tests.sh # مجموعة الاختبارات الآلية
├── Dockerfile # بناء متعدد المراحل للإنتاج
├── Dockerfile.dev # حاوية تطوير مع تبعيات البناء
├── docker-compose.yml # بيئة المختبر الكاملة
├── analyze.sh # سكريبت التحليل الآلي
└── Makefile # نظام البناء
يقوم Azazel بوضع علامات على السلوك المشبوه تلقائيًا:
كل شيء يُبنى ويُشغَّل داخل حاوية Docker واحدة تحتوي على Go و clang و libbpf و bpftool:
make docker-dev # بناء صورة التطوير
make docker-dev-run # الدخول إليها (مميزة + مساحات أسماء المضيف)
# داخل حاوية التطوير:
make vmlinux # توليد vmlinux.h من BTF لنواة المضيف
make generate # bpf2go: ترجمة BPF C → روابط Go
make build # بناء ثنائي Go
make test # دورة اختبار كاملة
make check-kernel
المساهمات مرحب بها. يُرجى فتح issue أولاً لمناقشة ما ترغب في تغييره.
# Fork، استنساخ، ثم:
make docker-dev
make docker-dev-run
# hack hack hack
make test
رخصة GPL-2.0 — انظر LICENSE للتفاصيل.
برامج BPF مرخصة بموجب GPL-2.0 (مطلوب للوصول إلى مساعدات eBPF). كود Go للمستخدم هو أيضًا بموجب GPL-2.0.
| الفئة | الأحداث | التفاصيل |
|---|
| عملية | process_exec, process_exit, process_clone | شجرة العمليات الكاملة: اسم الملف، وسيطات argv، رموز الخروج، أعلام clone، معرف العملية الأم |
| ملف | file_open, file_write, file_read, file_unlink, file_rename | أسماء المسارات، الأعلام، عدد البايتات |
| شبكة | net_connect, net_bind, net_listen, net_accept, net_sendto, net_dns | عناوين IPv4/IPv6، المنافذ، كشف DNS عبر kprobe على udp_sendmsg |
| أمن | mmap_exec, ptrace, module_load | تعيينات الذاكرة W+X، محاولات حقن العمليات، تحميل وحدات النواة |
| التنبيه | الخطورة | المشغِّل |
|---|
| مسار تنفيذ مشبوه | متوسط | التنفيذ من /tmp/, /dev/shm/, /var/tmp/ |
| أداة مشبوهة | متوسط | wget, curl, nc, python, base64, memfd: |
| الوصول إلى ملف حساس | متوسط | /etc/passwd, /etc/shadow, /etc/sudoers, /etc/ssh/, /proc/self/maps, /proc/self/mem, /etc/ld.so.preload |
| Ptrace | عالي | أي استدعاء نظام ptrace (حقن عمليات / تصحيح) |
| تحميل وحدة نواة | عالي | أي استدعاء نظام finit_module |
| mmap مع W+X | حرج | تعيين الذاكرة كـ WRITE+EXEC في نفس الوقت (حقن كود، فك ضغط) |
| المشكلة | الحل |
|---|
operation not permitted عند تحميل BPF | يجب تشغيل الحاوية مع --privileged --pid=host --cgroupns=host |
vmlinux.h: No such file | قم بتشغيل make vmlinux (يتطلب /sys/kernel/btf/vmlinux) |
kernel doesn't support BTF | تحتاج نواة المضيف إلى CONFIG_DEBUG_INFO_BTF=y — تحقق بـ ls /sys/kernel/btf/vmlinux |
| فشل إنشاء خريطة الحلقة العازلة | يجب أن تكون النواة 5.8+، تحقق بـ uname -r |
failed to attach tracepoint | بعض نقاط التتبع غير موجودة في جميع النوى — يسجل المتعقب تحذيرًا ويستمر |
| لم يتم التقاط أي أحداث | تحقق من تشغيل المتعقب (`ps aux |
| المكون | التقنية |
|---|
| لغة البرمجة | Go 1.24+ |
| مكتبة eBPF | cilium/ebpf v0.17+ |
| توليد كود BPF | bpf2go (CO-RE، قائم على BTF) |
| برامج BPF | C، مُجمَّعة مع clang، باستخدام vmlinux.h |
| CLI | cobra |
| الإخراج | NDJSON (كائن JSON واحد لكل سطر) |
| الحاوية | Docker، مع docker-compose لتنسيق المختبر |