Por que sys_call_table é previsível?

1

Em (ou depois de?) 2.4 o símbolo sys_call_table não foi mais exportado para dificultar a conexão de chamadas do sistema.

Ignorando que você ainda pode obter essas informações do IDT ou lendo /boot/System.map-<kernel-version> , fiquei me perguntando por que esse endereço parece ser constante entre reinicializações e máquinas (com a mesma versão do kernel)? Não vale a pena tornar isso dinâmico? Existe uma razão para exigir que seja estático?

O que estou mirando é o seguinte:

sys_call_table não é mais exportado para módulos para tornar o hooking syscalls um pouco mais difícil, mas módulos (ie programas de espaço kernel) ainda podem facilmente obter essa informação lendo System.map ou simplesmente adivinhando baseado no release do kernel informações como o endereço parece ser idêntico para todas as máquinas que executam a mesma versão do kernel.

    
por geekonaut 14.02.2018 / 13:34

1 resposta

1

Desde pelo menos a versão 4.8 do kernel, pelo menos no x86, o espaço de endereço do kernel é randomizado, incluindo o endereço da tabela de chamada do sistema. Veja RANDOMIZE_BASE na configuração do kernel para os detalhes básicos.

Isso significa que o endereço fornecido em System.map é inútil e o endereço da tabela de chamadas do sistema é alterado a cada inicialização. Se você precisar depurar algo e desejar usar System.map , será necessário inicializar com o parâmetro de linha de comando nokaslr kernel para desativar o KASLR.

    
por 14.02.2018 / 17:21