Um patch mal considerado resultou em uma correção incompleta para a vulnerabilidade Spectre no kernel Linux

Desenvolvedores do projeto Grsecurity compartilhado um conto de advertência que demonstra como a eliminação impensada de avisos do compilador pode levar a vulnerabilidades no código. No final de maio, foi proposta uma correção para o kernel Linux para um novo vetor de exploração da vulnerabilidade Spectre por meio da chamada de sistema ptrace.

Ao testar o patch, os desenvolvedores notaram que durante a construção, o compilador exibe um aviso sobre a mistura de código e definições (a estrutura foi definida após o código, atribuindo um valor a uma variável existente):

índice interno = n;
if (n <HBP_NUM) { índice = array_index_nospec(índice, HBP_NUM); struct perf_event *bp = thread->ptrace_bps[índice];

Linus aceitou emenda para o seu branch master, tendo-se livrado de do aviso movendo a definição da variável para um bloco if:

if (n <HBP_NUM) {int índice = array_index_nospec(n, HBP_NUM); struct perf_event *bp = thread->ptrace_bps[índice];

Em julho, a correção também foi portada para as ramificações estáveis ​​do kernel 4.4, 4.9, 4.14, 4.19 e 5.2. Os mantenedores dos ramos estáveis ​​​​também encontraram o aviso e, em vez de verificar se já havia sido corrigido no ramo mestre do Linus, eles próprios fizeram uma correção. O problema é que, sem realmente pensar nisso, eles simplesmente mudou-se definindo a estrutura para cima, para que a chamada para array_index_nospec, que fornece proteção direta contra a vulnerabilidade, não seja mais usada na definição da estrutura, e em vez da variável "index" a variável "n" seja sempre usada:

índice interno = n;
if (n <HBP_NUM){ struct perf_event *bp = thread->ptrace_bps[index];
índice = array_index_nospec(índice, HBP_NUM);

Fonte: opennet.ru

Adicionar um comentário