Desenvolvedores do proxecto Grsecurity 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;
se (n < HBP_NUM) { índice = array_index_nospec(índice, HBP_NUM); struct perf_event *bp = fío->ptrace_bps[índice];
Linus aceptou á túa rama mestra, a partir do aviso envolvendo a definición da variable nun bloque if:
se (n < HBP_NUM) { int index = array_index_nospec(n, HBP_NUM); struct perf_event *bp = fío->ptrace_bps[index];
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ó 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;
se (n < HBP_NUM ){ struct perf_event *bp = fío->ptrace_bps[índice];
índice = array_index_nospec (índice, HBP_NUM);
Fonte: opennet.ru
