
تكامل وقت تشغيل نواة لينكس باستخدام eBPF
KRIe هو مشروع بحثي يهدف إلى اكتشاف استغلالات نواة لينكس باستخدام eBPF. KRIe ليست استراتيجية محصنة تمامًا: من القيود المتعلقة بـ eBPF إلى اكتشافات ما بعد الاستغلال التي قد تعتمد على نواة مخترقة لإصدار أحداث أمنية، من الواضح أن المهاجم المتحمس سيكون قادرًا في النهاية على تجاوزها. ومع ذلك، فإن هدف المشروع هو جعل حياة المهاجمين أكثر صعوبة وفي النهاية منع استغلالات جاهزة من العمل على نواة قابلة للاختراق.
تم تطوير KRIe باستخدام CO-RE (تجميع مرة واحدة - تشغيل في كل مكان) ليكون متوافقًا مع مجموعة واسعة من إصدارات النواة. إذا كانت نواتك لا تصدر معلومات تصحيح BTF الخاصة بها، فسيحاول KRIe تنزيلها تلقائيًا من BTFHub. إذا لم تكن نواتك متاحة على BTFHub، ولكنك تمكنت من إنشاء بيانات BTF لنواتك يدويًا، فيمكنك توفيرها في ملف التكوين (انظر أدناه).
تم تطوير هذا المشروع على Ubuntu Focal 20.04 (نواة لينكس 5.15) وتم اختباره على إصدارات أقدم وصولاً إلى Ubuntu Bionic 18.04 (نواة لينكس 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