
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 이름, 네임스페이스, ServiceAccount에 매핑합니다.0.40%, ringbuf 드롭 0을 기록했습니다.상태: Phase 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. 지원되는 형식: native 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 verifier 드라이런, 런타임 스모크, 적대자 에뮬레이션, 성능, 구성 매트릭스, 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 > env (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"는 거부됩니다;
이 빌드는 audit 전용입니다.
{
"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 | 빌드 산출물 제거 |