Unha corrección eruptiva deu lugar a unha corrección incompleta dunha vulnerabilidade de Spectre no núcleo de Linux

Desenvolvedores do proxecto Grsecurity compartido un conto de advertencia que demostra como a eliminación descoidada das advertencias do compilador pode levar a vulnerabilidades no código. A finais de maio, para o núcleo de Linux, propúxose unha corrección para un novo vector de explotación da vulnerabilidade Spectre mediante a chamada ao sistema ptrace.

No proceso de probar o parche, os desenvolvedores notaron que ao construír, o compilador mostra unha advertencia sobre a mestura de código e definicións (a estrutura definiuse despois do código asignando un valor a unha variable existente):

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

Linus aceptou corrección á túa rama mestra, desfacerse a partir do aviso envolvendo a definición da variable nun bloque if:

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

En xullo, a corrección tamén foi portada ás ramas estables do núcleo 4.4, 4.9, 4.14, 4.19 e 5.2. Os mantedores estables tamén atoparon o aviso e, en lugar de comprobar se xa estaba solucionado na rama mestra de Linus, parchearon eles mesmos. O problema é que eles, sen pensar moito, só movido definición da estrutura, de xeito que a chamada a array_index_nospec, que proporciona directamente protección contra a vulnerabilidade, xa non se utiliza na definición da estrutura e, en lugar da variable "índice", sempre se utilizou a variable "n":

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

Fonte: opennet.ru

Engadir un comentario