
Linux 5.15+ LTS向けのeBPF EDR専用監査ツール:14個のカーネルフック、15個のアクション(13個のMITREテクニック)、プロセス系譜、SIEMエクスポート、K8s/Docker対応。
検出と監査のみ。非強制型センサー。 BPF プログラムが
-EPERMを返すことはなく、システムコールをブロックすることもありません。このエージェントは ランタイム観測プレーンであり、防御プレーンではありません。詳細はdocs/SECURITY.mdおよびTHREAT_MODEL.mdを参照してください。
eBPF (C) と高効率な Go デーモンで構築された、超軽量・監査専用の Linux EDR エージェントです。Linux カーネル 5.15 LTS 以上を対象とし、ゼロアロケーションのホットパス、30MB 未満のメモリフットプリント、そしてコンテナ/K8s コンテキストの高度なエンリッチメントを特徴とします。
CRITICAL アラートが発報されます。cgroup_id を Pod 名、Namespace、ServiceAccount にマッピングします。208 バイトのカーネル側ワイヤフォーマットを肥大化させることはありません。0.40%、ringbuf ドロップ 0 を実現します。ステータス: フェーズ 2.7 完了。16 のアクションにわたる 13 の MITRE ATT&CK テクニック。 カーネル 6.12.111 でエンドツーエンド検証済み (82 PASS / 0 FAIL)。
| # | アクション | 重大度 | MITRE | フック |
|---|---|---|---|---|
| 1 | Container_Namespace_Unshare | HIGH | T1611 | kprobe/__x64_sys_unshare |
| 2 | Container_Pivot_Root_Escape | CRITICAL | T1611 | kprobe/__x64_sys_pivot_root |
| 3 | Sensitive_File_Access | HIGH | T1003.008 | tracepoint/sys_enter_openat + open |
| 4 | Process_Execution | INFO/MEDIUM | T1059.004 | tracepoint/sys_enter_execve |
| 5 | Network_Connection | INFO/HIGH | T1071 | tracepoint/sys_enter_connect |
| 6 | Process_Injection | HIGH | T1055.008 | tracepoint/sys_enter_ptrace |
| 7 | Log_Tampering | HIGH | T1562.001 | tracepoint/sys_enter_unlinkat |
| 8 | Ebpf_Tampering | HIGH | T1562.001 | tracepoint/sys_enter_bpf |
| 9 | Perf_Event_Open | MEDIUM | T1562.001 | tracepoint/sys_enter_perf_event_open |
| 10 | Suspicious_Mount | HIGH | T1611 | tracepoint/sys_enter_mount |
| 11 | Namespace_Switch | HIGH | T1611 | tracepoint/sys_enter_setns |
| 12 | Chroot_Escape | HIGH | T1611 | tracepoint/sys_enter_chroot |
| 13 | Executable_Memory | MEDIUM | T1620 | tracepoint/sys_enter_mprotect |
| 14 | Core_Pattern_Modification | CRITICAL | T1611 | tracepoint/sys_enter_openat + open |
| 15 | Cgroup_Release_Agent | CRITICAL | T1611 | tracepoint/sys_enter_openat + open |
| 16 | Canary_Triggered | CRITICAL | T1552.001 | tracepoint/sys_enter_openat + open |
アクション 9 と 13 はアタッチされていますが、config.toml の
disabled_actions によりカーネル側でデフォルト無効化されています。
カーネルフック (14 個) は comm/cgroup フィルタ、canary_paths の O(1) ハッシュルックアップ、 続いて action_enabled ルックアップへと処理を渡します。イベントは 208 バイトのレコードを運ぶ 1 MiB の ringbuf にプッシュされます。 ユーザー空間は固定のプール済みバッファへ読み込み、アクションごとのトークンバケットを適用し、 プロセス系譜と cgroup パス、および境界付き LRU キャッシュからの K8s Pod メタデータでエンリッチし、 Encoder + Sink を経由して任意の宛先へルーティングします。
詳細: docs/ARCHITECTURE.md。
ebpf edr は、フォーマット + トランスポート層を介してアラートを任意の SIEM へエクスポートします。
[output]
format = "ecs" # json | ecs | ocsf | cef | leef
target = "webhook" # file | stdout | syslog | webhook
[output.webhook]
url = "https://splunk.internal:8088/services/collector/event"
auth_header = "Splunk ${SPLUNK_HEC_TOKEN}"
splunk_hec = true
サポートされるトランスポート: file、stdout、syslog (UDP/TCP/TLS)、HTTPS webhook。 サポートされるフォーマット: ネイティブ JSON、ECS 8.11、OCSF 1.3.0、CEF、LEEF 2.0。
Splunk、Elastic、Sentinel、QRadar、および汎用 syslog 向けのレシピ:
docs/SIEM_INTEGRATION.md。
[output] が存在しない場合、動作は v1.x とバイト単位で同一です。
CONFIG_DEBUG_INFO_BTF=y 付き (/sys/kernel/btf/vmlinux)docs/KERNEL_COMPATIBILITY.md を参照。CAP_BPF CAP_PERFMON CAP_SYS_ADMIN を持つ rootmake kernel # kernel/bpf_program.o
make userspace # userspace/ebpf_controller
make emulation # emulation/adversary
sudo -E make verify
環境プローブ、ビルド、C/Go 構造体レイアウトのアサーション、BPF ベリファイアの ドライラン、ランタイムスモーク、敵対者エミュレーション、パフォーマンス、設定マトリクス、 SIGHUP リロード、アイドル CPU、リネージエンリッチメント、キャッシュ境界、新規フック、 フォーマットマトリクス、および webhook 配信を実行します。
sudo ./install.sh --dry-run
sudo ./install.sh
sudo ./install.sh --uninstall
以下をインストールします:
/usr/local/sbin/ebpf-edr、
/usr/local/lib/ebpf-edr/bpf_program.o、
/etc/ebpf-edr/config.toml (既存のものは保持され、新しいデフォルトは .new に配置)、
/etc/systemd/system/ebpf-edr.service、
/etc/logrotate.d/ebpf-edr。
/etc/ebpf-edr/config.toml の TOML。優先順位: CLI > 環境変数 (EDR_*) > ファイル > デフォルト。
mode = "audit"
disabled_actions = [
"Perf_Event_Open",
"Executable_Memory",
]
[log]
path = "/var/log/ebpf_edr.json"
max_bytes = 52428800
max_backups = 5
level = "info"
[filter]
comm_allowlist = []
cgroup_allowlist = []
canary_paths = ["/var/run/secrets/kubernetes.io/serviceaccount/token"]
[k8s]
enrichment = true
[rates]
events_per_sec = 200
burst = 400
[container]
cache_max_entries = 5000
[context]
lineage_max_depth = 16
lineage_cache_size = 20000
cgroup_cache_size = 5000
リロード: sudo systemctl reload ebpf-edr。mode = "enforce" は拒否されます。
このビルドは監査専用です。
{
"timestamp": "2026-10-15T23:52:41Z",
"pid": 1370, "ppid": 1369, "uid": 0,
"start_time_ns": 180763002635,
"command": "unix_chkpwd",
"action": "Sensitive_File_Access",
"target": "/etc/shadow",
"severity": "HIGH",
"mitre_id": "T1003.008",
"mitre_technique": "OS Credential Dumping: /etc/shadow",
"cgroup_id": 3874,
"cgroup_path": "/user.slice/user-0.slice/session-3.scope",
"runtime": "host",
"lineage_summary": "systemd > sshd > bash > sudo > unix_chkpwd",
"lineage": [
{"pid": 1370, "ppid": 1369, "comm": "unix_chkpwd",
"exe": "/usr/sbin/unix_chkpwd", "start_time_ns": 180763002635},
{"pid": 1369, "ppid": 1368, "comm": "sudo",
"exe": "/usr/bin/sudo", "start_time_ns": 180762998100}
]
}
フィールド aux_u16、aux_u32、aux_u64 はアクション固有のコンテキストを保持します。
60秒ごとのヘルスライン:
[health] recv=N written=N dropped=N rate_limited=N parse_err=N
ver_mismatch=N ringbuf_err=N reloads=N reload_fail=N
chan=N/4096 lineage_cache=N/20000 lineage_hits=N
lineage_misses=N cgroup_cache=N/5000
sink_sent=N sink_failed=N sink_dropped=N sink_retries=N
sink_queue=N sink_circuit=bool
目標値: dropped = 0、ver_mismatch = 0、lineage_cache は容量未満。
| ターゲット | 目的 |
|---|---|
make kernel | BPF オブジェクトをビルド |
make userspace | デーモンをビルド |
make emulation | 敵対者ハーネスをビルド |
make test | Go ユニットテスト |
make test-race | レース検出器付き Go テスト |
make fuzz | ターゲットごとに 60 秒のファジング |
make verify | 15 ステージのコア + 2 ステージの SIEM 検証 |
make verify-siem | 2 ステージの SIEM 検証のみ |
make ci | ローカル CI: gofmt、vet、race、fuzz、verify |
make install / uninstall | システムへのインストール / 削除 |
make test-attacks | エミュレーションカバレッジのアサーション |
make clean | ビルド成果物を削除 |