Un parche mal pensado resultó en una solución incompleta para la vulnerabilidad Spectre en el kernel de Linux

Desarrolladores del proyecto Grsecurity compartido una advertencia que demuestra cómo la eliminación irreflexiva de las advertencias del compilador puede provocar vulnerabilidades en el código. A finales de mayo, se propuso una solución para el kernel de Linux para un nuevo vector de explotación de la vulnerabilidad Spectre a través de la llamada al sistema ptrace.

Mientras probaban el parche, los desarrolladores notaron que durante la compilación, el compilador muestra una advertencia sobre la mezcla de código y definiciones (la estructura se definió después del código, asignando un valor a una variable existente):

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

Linus aceptó enmienda a tu sucursal principal, habiéndose deshecho de de la advertencia moviendo la definición de la variable a un bloque if:

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

En julio, la solución también se transfirió a las ramas estables del kernel 4.4, 4.9, 4.14, 4.19 y 5.2. Los mantenedores de las ramas estables también encontraron la advertencia y, en lugar de verificar si ya se había solucionado en la rama maestra de Linus, lo arreglaron ellos mismos. El problema es que sin pensarlo realmente, simplemente movido definiendo la estructura, de modo que la llamada a array_index_nospec, que proporciona directamente protección contra la vulnerabilidad, ya no se usa al definir la estructura, y en lugar de la variable "index" siempre se usa la variable "n":

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

Fuente: opennet.ru

Añadir un comentario