
Integridade em Tempo de Execução do Kernel Linux com eBPF
KRIe é um projeto de pesquisa que visa detectar exploits do Kernel Linux com eBPF. KRIe está longe de ser uma estratégia à prova de balas: desde limitações relacionadas ao eBPF até detecções pós-exploração que podem depender de um kernel comprometido para emitir eventos de segurança, é claro que um atacante motivado eventualmente conseguirá contorná-lo. Dito isso, o objetivo do projeto é dificultar a vida dos atacantes e, em última análise, impedir que exploits prontos funcionem em um kernel vulnerável.
KRIe foi desenvolvido usando CO-RE (Compile Once - Run Everywhere) para ser compatível com uma ampla gama de versões de kernel. Se o seu kernel não exporta suas informações de depuração BTF, o KRIe tentará baixá-las automaticamente do BTFHub. Se o seu kernel não estiver disponível no BTFHub, mas você conseguiu gerar manualmente os dados BTF do seu kernel, pode fornecê-los no arquivo de configuração (veja abaixo).
Este projeto foi desenvolvido no Ubuntu Focal 20.04 (Kernel Linux 5.15) e foi testado em versões mais antigas até o Ubuntu Bionic 18.04 (Kernel Linux 4.15).
lib/modules/$(uname -r), caso contrário, atualize o Makefile com a localização deles.Campos opcionais são necessários para recompilar os programas eBPF.
# ~ make build-ebpf
# ~ make build
# ~ make install
KRIe precisa ser executado como root. Execute sudo krie -h para obter ajuda.
# ~ krie -h
Usage:
krie [flags]
Flags:
--config string KRIe config file (default "./cmd/krie/run/config/default_config.yaml")
-h, --help help for krie
## Nível de log, opções: panic, fatal, error, warn, info, debug ou trace
log_level: debug
## Arquivo de saída JSON, deixe vazio para desabilitar a saída JSON.
output: "/tmp/krie.json"
## Informações BTF para o kernel atual em formato .tar.xz (necessário apenas se o KRIE não conseguir localizá-las sozinho)
vmlinux: ""
## configuração de eventos
events:
## ação tomada quando um evento init_module é detectado
init_module: log
## ação tomada quando um evento delete_module é detectado
delete_module: log
## ação tomada quando um evento bpf é detectado
bpf: log
## ação tomada quando um evento bpf_filter é detectado
bpf_filter: log
## ação tomada quando um evento ptrace é detectado
ptrace: log
## ação tomada quando um evento kprobe é detectado
kprobe: log
## ação tomada quando um evento sysctl é detectado
sysctl:
action: log
## Configurações padrão para programas sysctl (apenas kernel 5.2+)
sysctl_default:
block_read_access: false
block_write_access: false
## Configurações personalizadas para programas sysctl (apenas kernel 5.2+)
sysctl_parameters:
kernel/yama/ptrace_scope:
block_write_access: true
kernel/ftrace_enabled:
override_input_value_with: "1\n"
## ação tomada quando um evento hooked_syscall_table é detectado
hooked_syscall_table: log
## ação tomada quando um evento hooked_syscall é detectado
hooked_syscall: log
## configuração de evento kernel_parameter
kernel_parameter:
action: log
periodic_action: log
ticker: 1 # envia no máximo um evento a cada [ticker] segundo(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
## ação a ser verificada quando register_check falha em um ponto de hook sensível no espaço do kernel
register_check: log