
Linux-Kernel-Laufzeitintegrität mit eBPF
KRIe ist ein Forschungsprojekt, das darauf abzielt, Linux-Kernel-Exploits mit eBPF zu erkennen. KRIe ist weit davon entfernt, eine wasserdichte Strategie zu sein: Von eBPF-bedingten Einschränkungen bis hin zu Post-Exploitation-Erkennungen, die möglicherweise auf einen kompromittierten Kernel angewiesen sind, um Sicherheitsereignisse zu melden, ist klar, dass ein motivierter Angreifer es letztendlich umgehen kann. Das Ziel des Projekts ist es jedoch, Angreifern das Leben schwerer zu machen und letztendlich zu verhindern, dass Standard-Exploits auf einem verwundbaren Kernel funktionieren.
KRIe wurde mit CO-RE (Compile Once - Run Everywhere) entwickelt, sodass es mit einer großen Bandbreite an Kernel-Versionen kompatibel ist. Wenn Ihr Kernel keine BTF-Debug-Informationen exportiert, versucht KRIe, diese automatisch von BTFHub herunterzuladen. Wenn Ihr Kernel nicht auf BTFHub verfügbar ist, Sie aber manuell BTF-Daten für Ihren Kernel generieren konnten, können Sie diese in der Konfigurationsdatei angeben (siehe unten).
Dieses Projekt wurde auf Ubuntu Focal 20.04 (Linux Kernel 5.15) entwickelt und auf älteren Versionen bis hin zu Ubuntu Bionic 18.04 (Linux Kernel 4.15) getestet.
lib/modules/$(uname -r) installiert sein; aktualisieren Sie andernfalls das Makefile mit deren Speicherort.Optionale Felder werden benötigt, um die eBPF-Programme neu zu kompilieren.
# ~ make build-ebpf
# ~ make build
# ~ make install
KRIe muss als Root ausgeführt werden. Führen Sie sudo krie -h aus, um Hilfe zu erhalten.
# ~ krie -h
Usage:
krie [flags]
Flags:
--config string KRIe-Konfigurationsdatei (Standard: "./cmd/krie/run/config/default_config.yaml")
-h, --help Hilfe für krie
## Log-Level, Optionen: panic, fatal, error, warn, info, debug oder trace
log_level: debug
## JSON-Ausgabedatei, leer lassen, um JSON-Ausgabe zu deaktivieren.
output: "/tmp/krie.json"
## BTF-Informationen für den aktuellen Kernel im .tar.xz-Format (nur erforderlich, wenn KRIE sie nicht selbst finden kann)
vmlinux: ""
## Ereigniskonfiguration
events:
## Aktion, wenn ein init_module-Ereignis erkannt wird
init_module: log
## Aktion, wenn ein delete_module-Ereignis erkannt wird
delete_module: log
## Aktion, wenn ein bpf-Ereignis erkannt wird
bpf: log
## Aktion, wenn ein bpf_filter-Ereignis erkannt wird
bpf_filter: log
## Aktion, wenn ein ptrace-Ereignis erkannt wird
ptrace: log
## Aktion, wenn ein kprobe-Ereignis erkannt wird
kprobe: log
## Aktion, wenn ein sysctl-Ereignis erkannt wird
sysctl:
action: log
## Standardeinstellungen für sysctl-Programme (nur Kernel 5.2+)
sysctl_default:
block_read_access: false
block_write_access: false
## Benutzerdefinierte Einstellungen für sysctl-Programme (nur Kernel 5.2+)
sysctl_parameters:
kernel/yama/ptrace_scope:
block_write_access: true
kernel/ftrace_enabled:
override_input_value_with: "1\n"
## Aktion, wenn ein hooked_syscall_table-Ereignis erkannt wird
hooked_syscall_table: log
## Aktion, wenn ein hooked_syscall-Ereignis erkannt wird
hooked_syscall: log
## kernel_parameter-Ereigniskonfiguration
kernel_parameter:
action: log
periodic_action: log
ticker: 1 # sendet höchstens ein Ereignis alle [ticker] Sekunde(n)
list:
- symbol: system/kprobes_all_disarmed
expected_value: 0
size: 4
# - symbol: system/selinux_state
# expected_value: 256
# size: 2
# sysctl
- symbol: system/ftrace_dump_on_oops
expected_value: 0
size: 4
- symbol: system/kptr_restrict
expected_value: 0
size: 4
- symbol: system/randomize_va_space
expected_value: 2
size: 4
- symbol: system/stack_tracer_enabled
expected_value: 0
size: 4
- symbol: system/unprivileged_userns_clone
expected_value: 0
size: 4
- symbol: system/unprivileged_userns_apparmor_policy
expected_value: 1
size: 4
- symbol: system/sysctl_unprivileged_bpf_disabled
expected_value: 1
size: 4
- symbol: system/ptrace_scope
expected_value: 2
size: 4
- symbol: system/sysctl_perf_event_paranoid
expected_value: 2
size: 4
- symbol: system/kexec_load_disabled
expected_value: 1
size: 4
- symbol: system/dmesg_restrict
expected_value: 1
size: 4
- symbol: system/modules_disabled
expected_value: 0
size: 4
- symbol: system/ftrace_enabled
expected_value: 1
size: 4
- symbol: system/ftrace_disabled
expected_value: 0
size: 4
- symbol: system/sysctl_protected_fifos
expected_value: 1
size: 4
- symbol: system/sysctl_protected_hardlinks
expected_value: 1
size: 4
- symbol: system/sysctl_protected_regular
expected_value: 2
size: 4
- symbol: system/sysctl_protected_symlinks
expected_value: 1
size: 4
- symbol: system/sysctl_unprivileged_userfaultfd
expected_value: 0
size: 4
## Aktion, wenn eine register_check an einer sensiblen Kernel-Space-Hook-Punkt fehlschlägt
register_check: log