
eBPF-powered silent observer for containerized runtimes, built for malware analysis sandboxes and Agentic AI monitoring.

Лёгкий трассировщик безопасности на основе eBPF, специально созданный для песочниц анализа вредоносного ПО. Поместите образец в изолированный контейнер, и Azazel захватывает каждый системный вызов, каждое обращение к файлу, сетевое соединение и подозрительное поведение, предоставляя чистый поток JSON всего, что произошло.
Независимо от того, строите ли вы автоматизированную Песочницу для анализа вредоносного ПО или нуждаетесь в круглосуточном мониторинге для автономных AI-агентов, Azazel предоставляет точную, незаметную и готовую для AI телеметрию в формате JSON.
Usage:
azazel [flags]
azazel [command]
Commands:
run-sandbox Run a malware sample in an isolated Docker sandbox and trace it
list-containers List running containers
version Print version
Global Flags:
-c, --container strings Container ID(s) to filter (can specify multiple)
-o, --output string Output file path (default: stdout)
--pretty Pretty-print JSON output
--stdout Also print to stdout when --output is set
-v, --verbose Verbose logging
--no-summary Disable summary on exit
-h, --help Help

| Категория | События | Подробности |
|---|---|---|
| Процессы | process_exec, process_exit, process_clone | Полное дерево процессов: имя файла, argv, коды завершения, флаги клонирования, PPID |
| Файлы | 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 отображения памяти, попытки внедрения в процессы, загрузка модулей ядра |
19 точек перехвата всего — tracepoints на входе системных вызовов + kprobe для обнаружения DNS.
vmlinux.h, работает на разных версиях ядра без перекомпиляцииjq, Elasticsearch, Splunk или вашего собственного конвейера/tmp, доступе к конфиденциальным файлам (/etc/shadow, /proc/self/mem), ptrace, W+X mmap и загрузке модулей ядраCONFIG_DEBUG_INFO_BTF=yПроверьте ваше ядро:
# BTF support (required)
ls /sys/kernel/btf/vmlinux
# Kernel version
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
# Трассировка всего, сохранение в файл с pretty 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 .
# Анализ образца от начала до конца: хэш → трассировка → отчёт
sudo ./analyze.sh ./samples/malware.elf 30
Это создаёт:
output/events_<timestamp>.json — необработанный поток событийoutput/report_<timestamp>.md — отчёт в Markdown с хэшами, сводкой событий, сетевыми соединениями и оповещениями безопасностиUsage:
azazel [flags]
azazel [command]
Commands:
list-containers List running containers
version Print version
Flags:
-c, --container strings Container ID(s) to filter (can specify multiple)
-o, --output string Output file path (default: stdout)
--pretty Pretty-print JSON output
--stdout Also print to stdout when --output is set
-v, --verbose Verbose logging
--no-summary Disable summary on exit
-h, --help Help