Os endereços dos símbolos do kernel podem ser influenciados? consequências?

4

tl; dr: no meu kernel do distros linux 3.08 usando cat /proc/kallsyms Eu posso descobrir que por exemplo a função / símbolo _commit_creds está localizada no endereço 0xc1073fe0. Quando qualquer um:

  • construindo meu kernel (opção 1)
  • via aprimorando o binário do kernel (opção 2)

é possível influenciar esses endereços? (isto é, randomizar para mitigar explorações para o kernel?)

Estou assumindo mais corretamente que as chamadas de sistema fornecidas pelo kernel precisam permanecer em endereços previsíveis / conhecidos para não quebrar a ABI fornecida pelo kernel?

versão longa

Em parte do cve-2016-0728 Vulnerabilidade de certos kernels linux o PoC fornecido usa essas duas linhas de código fonte:

#define COMMIT_CREDS_ADDR (0xffffffff81094250)
#define PREPARE_KERNEL_CREDS_ADDR (0xffffffff81094550)

que, embora desempenhem seu papel somente depois que um tipo de problema de estouro com uso após livre tenha ocorrido , são essenciais para concluir o escalonamento de privilégios. É claro que os endereços não são os mesmos para todos os kernels e basicamente mudam para cada distribuição. De qualquer forma, parece que eles são constantes dentro da linha de kernels (ou seja, o Ubuntu 12.04 x86 sempre terá o endereço em 0xc1073fe0).

Minha pergunta é entender se alguém pode influenciar esses endereços para embaralhá-los / randomizá-los a ponto de tornar a exploração do kernel mais difícil (por exemplo, cegar o invasor depois de ter o ponteiro de instrução no anel 0)? Eu diria que, para ter uma ABI para chamadas do sistema, não posso alterar a posição dos símbolos sys_xxxxxxxxxxx, mas pelo menos para os internos dos símbolos do kernel eu não necessariamente entendo a necessidade de tê-los previsíveis?

Portanto, estou perguntando aqui como alguém poderia aleatorizar esses símbolos de kernel, seja por

  • (1) compile o kernel personalizado ou,
  • (2) ainda melhor ajustar um kernel e mover os símbolos (o que eu acho que pode ser muito mais difícil e mais frágil de se fazer).

Qual é a consequência ao alterar os endereços dos símbolos do kernel? (excluindo as chamadas ABI do sistema).

    
por humanityANDpeace 20.01.2016 / 10:43

1 resposta

3

Se todo o Ubuntu 12.04 x86 tiver os mesmos endereços, é muito provável que todos eles tenham a mesma versão do Linux. Se você usa uma versão moderna do GCC com otimizações habilitadas para compilar seu próprio kernel, ele irá randomizar seus endereços para cada compilação.

E, na verdade, isso nem é necessário para os kernels recentes. Desde este commit (Janeiro de 2014), o espaço de endereço do kernel em arquiteturas x86 até muda a cada inicialização através de um mecanismo chamado Kernel Address Space Layout Randomization: link .

Portanto, atualize sua distribuição ou recompile seu kernel e você deve ter endereços aleatórios.

Quanto às conseqüências, se você deixar o compilador ou o processo de carregamento do kernel fazer o trabalho, não haverá nenhum. Se você tentar ajustar a compilação após a compilação, o resultado mais provável é que você não poderá inicializá-la ou, pior, que ela caia aleatoriamente. Outra consequência prática do pós-processamento da saída do compilador é que você não poderá ter seu kernel assinado durante o processo de compilação (o que é necessário para boot confiável, por exemplo).

    
por 20.01.2016 / 11:09