
Audit uniquement EDR eBPF pour Linux 5.15+ LTS : 14 hooks noyau, 15 actions (13 techniques MITRE), lignage de processus, export SIEM, prêt pour K8s/Docker.
Détection et audit uniquement. Capteur non répressif. Aucun programme BPF ne renvoie
-EPERM; aucun appel système n'est bloqué. Cet agent est un plan d'observation à l'exécution, pas un plan de prévention. Voirdocs/SECURITY.mdetTHREAT_MODEL.md.
Un agent EDR Linux ultra léger, en audit uniquement, construit avec eBPF (C) et un démon Go à haute efficacité. Il cible Linux kernel 5.15 LTS et au-delà, avec un chemin critique sans allocation, une empreinte mémoire inférieure à 30 Mo et un enrichissement profond du contexte conteneur/K8s.
CRITICAL.cgroup_id au nom du Pod, au namespace et au ServiceAccount sans gonfler le format de transmission noyau de 208 octets.0,40 % de CPU au repos et 0 perte de ringbuf sous un test de charge de 25 000 fork.Statut : Phase 2.7 terminée. 13 techniques MITRE ATT&CK sur 16 actions. Vérifié de bout en bout sur le noyau 6.12.111 (82 PASS / 0 FAIL).
| # | Action | Sévérité | MITRE | Hook |
|---|---|---|---|---|
| 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 |
Les actions 9 et 13 sont attachées mais supprimées côté noyau par défaut via
disabled_actions dans config.toml.
Les hooks noyau (14) alimentent un filtre comm/cgroup, une recherche par hachage O(1) canary_paths, puis une recherche action_enabled. Les événements sont poussés vers un ringbuf de 1 MiB transportant des enregistrements de 208 octets. L'espace utilisateur lit dans un tampon mutualisé fixe, applique un token bucket par action, enrichit avec la lignée de processus et le chemin cgroup, et les métadonnées de Pod K8s à partir de caches LRU bornés, et achemine via un Encoder + Sink vers n'importe quelle destination.
Détails complets : docs/ARCHITECTURE.md.
ebpf edr exporte les alertes vers n'importe quel SIEM via une couche format + transport.
[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
Transports pris en charge : file, stdout, syslog (UDP/TCP/TLS), webhook HTTPS. Formats pris en charge : JSON natif, ECS 8.11, OCSF 1.3.0, CEF, LEEF 2.0.
Recettes pour Splunk, Elastic, Sentinel, QRadar et syslog générique :
docs/SIEM_INTEGRATION.md.
En l'absence de [output], le comportement est identique octet pour octet à la v1.x.
CONFIG_DEBUG_INFO_BTF=y (/sys/kernel/btf/vmlinux)docs/KERNEL_COMPATIBILITY.md pour la matrice complète.CAP_BPF CAP_PERFMON CAP_SYS_ADMINmake kernel # kernel/bpf_program.o
make userspace # userspace/ebpf_controller
make emulation # emulation/adversary
sudo -E make verify
Exécute la sonde d'environnement, la compilation, l'assertion de disposition des structures C/Go, le dry-run du vérificateur BPF, le smoke test d'exécution, l'émulation d'adversaire, les performances, la matrice de configuration, le rechargement SIGHUP, le CPU au repos, l'enrichissement de lignage, les bornes de cache, les nouveaux hooks, la matrice de formats et la livraison par webhook.
sudo ./install.sh --dry-run
sudo ./install.sh
sudo ./install.sh --uninstall
Installe /usr/local/sbin/ebpf-edr,
/usr/local/lib/ebpf-edr/bpf_program.o,
/etc/ebpf-edr/config.toml (existant préservé ; nouveau défaut dans .new),
/etc/systemd/system/ebpf-edr.service,
/etc/logrotate.d/ebpf-edr.
TOML dans /etc/ebpf-edr/config.toml. Priorité : CLI > env (EDR_*) > fichier > valeurs par défaut.
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
Rechargement : sudo systemctl reload ebpf-edr. mode = "enforce" est rejeté ;
cette build est en audit uniquement.