
eBPFを活用した、コンテナ化されたランタイム向けのサイレントオブザーバー。マルウェア解析サンドボックスおよびエージェント型AI監視のために構築されました。

軽量な eBPF ベースのランタイムセキュリティトレーサーで、マルウェア解析サンドボックスに特化して設計されています。隔離されたコンテナにサンプルを投入すると、Azazel はすべてのシステムコール、ファイル操作、ネットワーク接続、不審な動作をキャプチャし、発生したすべてのイベントをクリーンな JSON ストリームで提供します。
自動マルウェア解析サンドボックスを構築する場合でも、自律型 AI エージェントのための 24/7 ランタイムモニタリングが必要な場合でも、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

合計19のフックポイント — システムコールエントリのトレースポイント + DNS 検出のための kprobe。
vmlinux.h により一度コンパイルすればどこでも実行可能。カーネルバージョンが変わっても再コンパイル不要jq、Elasticsearch、Splunk などにそのまま対応/tmp からの実行、機密ファイルへのアクセス(/etc/shadow、/proc/self/mem)、ptrace、W+X mmap、カーネルモジュールロードを自動で警告CONFIG_DEBUG_INFO_BTF=yカーネルを確認:
# BTF サポート(必須)
ls /sys/kernel/btf/vmlinux
# カーネルバージョン
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 # バイナリをビルド
# すべてをトレースし、標準出力に出力
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
これによりバイナリがビルドされ、トレーサーが起動し、マルウェア動作シミュレーターが実行され、予期されるすべてのイベントタイプがキャプチャされたかどうかが検証されます。
各イベントは1行の 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)、標準エラー出力にサマリーが表示されます:
========================================
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
azazel/
├── main.go # Entry point
├── cmd/root.go # CLI (cobra)
├── bpf/tracer.bpf.c # All eBPF programs (single file)
├── internal/
│ ├── tracer/
│ │ ├── tracer.go # Core: load, attach, read ring buffer
│ │ └── events.go # Event types, structs, parsing
│ ├── container/
│ │ └── resolver.go # cgroup → container ID resolution
│ └── output/
│ └── writer.go # JSON output + heuristic alerts
├── test/
│ ├── simulate_malware.sh # Malware behavior simulator
│ └── run_tests.sh # Automated test suite
├── Dockerfile # Production multi-stage build
├── Dockerfile.dev # Dev container with build deps
├── docker-compose.yml # Full sandbox environment
├── analyze.sh # Automated analysis script
└── Makefile # Build system
Azazel は不審な動作を自動でフラグ付けします:
すべてのビルドと実行は、Go、clang、libbpf、bpftool を含む単一の Docker コンテナ内で行われます:
make docker-dev # 開発イメージをビルド
make docker-dev-run # コンテナに入る(特権 + ホストネームスペース)
# 開発コンテナ内で:
make vmlinux # ホストカーネルの BTF から vmlinux.h を生成
make generate # bpf2go: BPF C → Go バインディングをコンパイル
make build # Go バイナリをビルド
make test # 完全なテストサイクル
make check-kernel
コントリビューションは歓迎します。まずは Issue を開いて変更内容について議論してください。
# フォークしてクローン、その後:
make docker-dev
make docker-dev-run
# ハックハックハック
make test
GPL-2.0 — 詳細は LICENSE を参照してください。
BPF プログラムは GPL-2.0 でライセンスされています(eBPF ヘルパーアクセスに必要)。ユーザースペースの Go コードも GPL-2.0 です。
| カテゴリ | イベント | 詳細 |
|---|
| プロセス | process_exec, process_exit, process_clone | 完全なプロセスツリー: filename, argv, 終了コード, clone フラグ, 親 PID |
| ファイル | file_open, file_write, file_read, file_unlink, file_rename | パス名, フラグ, バイト数 |
| ネットワーク | net_connect, net_bind, net_listen, net_accept, net_sendto, net_dns | IPv4/IPv6 アドレス, ポート, udp_sendmsg への kprobe による DNS 検出 |
| セキュリティ | 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 システムコール |
| W+X mmap | 致命的 | メモリが WRITE+EXEC として同時にマッピングされた(コードインジェクション、アンパック) |
| 問題 | 解決策 |
|---|
BPF ロード時に operation not permitted | コンテナは --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(1行に1つの JSON オブジェクト) |
| コンテナ | Docker、docker-compose でサンドボックスを構成 |