
KRIe는 eBPF를 사용하여 Linux 커널 익스플로잇을 탐지하는 것을 목표로 하는 연구 프로젝트입니다. KRIe는 완벽한 방어 전략과는 거리가 멉니다. eBPF 관련 제한 사항부터, 보안 이벤트를 방출하기 위해 손상된 커널에 의존할 수 있는 사후 탐지까지, 동기 부여된 공격자는 결국 이를 우회할 수 있을 것이 분명합니다. 그럼에도 불구하고 이 프로젝트의 목표는 공격자들의 삶을 더 어렵게 만들고, 궁극적으로 취약한 커널에서 즉시 사용 가능한 익스플로잇이 작동하는 것을 방지하는 것입니다.
KRIe는 다양한 커널 버전과 호환되도록 CO-RE (Compile Once - Run Everywhere)를 사용하여 개발되었습니다. 커널이 BTF 디버그 정보를 내보내지 않는 경우 KRIe는 BTFHub에서 자동으로 다운로드를 시도합니다. 커널이 BTFHub에 없지만 수동으로 BTF 데이터를 생성했다면 설정 파일에 제공할 수 있습니다(아래 참조).
이 프로젝트는 Ubuntu Focal 20.04 (Linux Kernel 5.15)에서 개발되었으며 Ubuntu Bionic 18.04 (Linux Kernel 4.15)까지의 이전 릴리스에서 테스트되었습니다.
lib/modules/$(uname -r)에 설치되어 있어야 합니다. 그렇지 않은 경우 Makefile에서 위치를 업데이트하십시오.선택적 필드는 eBPF 프로그램을 다시 컴파일하는 데 필요합니다.
# ~ make build-ebpf
# ~ make build
# ~ make install
KRIe는 루트 권한으로 실행해야 합니다. 도움말을 보려면 sudo krie -h를 실행하십시오.
# ~ krie -h
Usage:
krie [flags]
Flags:
--config string KRIe config file (default "./cmd/krie/run/config/default_config.yaml")
-h, --help help for krie
## Log level, options are: panic, fatal, error, warn, info, debug or trace
log_level: debug
## JSON output file, leave empty to disable JSON output.
output: "/tmp/krie.json"
## BTF information for the current kernel in .tar.xz format (required only if KRIE isn't able to locate it by itself)
vmlinux: ""
## events configuration
events:
## action taken when an init_module event is detected
init_module: log
## action taken when an delete_module event is detected
delete_module: log
## action taken when a bpf event is detected
bpf: log
## action taken when a bpf_filter event is detected
bpf_filter: log
## action taken when a ptrace event is detected
ptrace: log
## action taken when a kprobe event is detected
kprobe: log
## action taken when a sysctl event is detected
sysctl:
action: log
## Default settings for sysctl programs (kernel 5.2+ only)
sysctl_default:
block_read_access: false
block_write_access: false
## Custom settings for sysctl programs (kernel 5.2+ only)
sysctl_parameters:
kernel/yama/ptrace_scope:
block_write_access: true
kernel/ftrace_enabled:
override_input_value_with: "1\n"
## action taken when a hooked_syscall_table event is detected
hooked_syscall_table: log
## action taken when a hooked_syscall event is detected
hooked_syscall: log
## kernel_parameter event configuration
kernel_parameter:
action: log
periodic_action: log
ticker: 1 # sends at most one event every [ticker] second(s)
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
## action to check when a register_check fails on a sensitive kernel space hook point
register_check: log