r1 - 15 Jul 2005 - 22:16:20 - IuriDinizYou are here: TWiki >  Personal Web  > ModulosEscondidos

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

Edit | WYSIWYG | Attach | Printable | Raw View | Backlinks: Web, All Webs | History: r1 | More topic actions
 
Powered by TWiki
This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback