Segurança Linux
Módulos Escondidos
História
Certa vez eu e um amigo meu estavamos analizando o conteúdo deste link:
http://www.thc.org/papers/LKM_HACKING.html. Ele fala sobre uma possível implementação de um backdoor no kernel do linux através de módulos, mas como a interface era antiga (kernel 2.0), os conceitos eram válidos, mas os códigos nem tanto. No link há coisas como interceptar chamadas de sistema e remover o módulo da lista do lsmod.
Hoje (04 Jul 2005) este meu amigo me mostrou um código de como seria possível esconder um módulo no kernel 2.6, o código do módulo é simples mas não é trivial a sua inserção no kernel. Mesmo assim como seria possível descobrir este módulo no sistema, já que o mesmo não aparece em um
lsmod ou
cat /proc/modules?
Como descobrir se há um módulo secreto no kernel
O comando mais simples que eu achei foi este (na abordagem adotada por ele):
#!/bin/sh
N_MOD_REAL=`grep -w 'd __this_module' /proc/kallsyms | wc -l`
N_MOD_SIS=`cat /proc/modules | wc -l`
if [ "$N_MOD_REAL" -ne "$N_MOD_SIS" ]; then
echo "AVISO: parece que ha um modulo escondido no seu sistema"
exit 1 # insucesso, sistema nao seguro
fi
exit 0 # sucesso, aparenta estah seguro
Por que isto funciona?
Bom, eu estou levando em conta que todo módulo carregado no kernel, deixa símbolos no mesmo.
root@vision:/tmp/hide_module # grep -w '\[hide_module\]' /proc/kallsyms
00000000 a hide_module.c [hide_module]
f8b5a100 ? __mod_license5 [hide_module]
f8b5e7c0 b addr [hide_module]
f8b5e5d0 d __param_str_addr [hide_module]
f8b5e0b8 r __param_addr [hide_module]
f8b5e000 t hide_module_seq_show [hide_module]
f8b5e7c8 b modules_op_orig [hide_module]
f8b5e050 t hide_module_init [hide_module]
f8b5e7c4 b modules_op_p [hide_module]
f8b5e090 t hide_module_exit [hide_module]
00000000 a hide_module.mod.c [hide_module]
f8b5a120 ? __mod_vermagic5 [hide_module]
f8b5e0e0 r ____versions [hide_module]
f8b5a152 ? __module_depends [hide_module]
f8b5a160 ? __mod_srcversion33 [hide_module]
f8b5e5e0 d __this_module [hide_module]
f8b5e090 t cleanup_module [hide_module]
c012d0d5 U param_set_uint [hide_module]
c01b8838 U memcpy [hide_module]
f8b5e050 t init_module [hide_module]
c012d123 U param_get_uint [hide_module]
c01b88d4 U strstr [hide_module]
root@vision:/tmp/hide_module #
A quantidade de linhas do comando acima (22) eh justamente a quantidade de símbolos adicionados ao kernel após a carga do módulo
hide_module. Estou usando uma entrada comum a todos os módulos (usei no meu caso:
f8b5e5e0 d __this_module [hide_module]).
Agora é só contar a quantidade de 'd __this_module', com a qtd de módulos reais.
Esperem pelo terceiro Round, o meu amigo não desiste fácil.
--
IuriDiniz - 04 Jul 2005