Desarrolladores del proyecto Grsecurity Una historia instructiva que demuestra cómo la eliminación irreflexiva de las advertencias del compilador puede provocar vulnerabilidades en el código. A finales de mayo, el kernel Linux Se propuso una solución para un nuevo vector de explotación de la vulnerabilidad Spectre mediante 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;
si (n < HBP_NUM) { índice = array_index_nospec(índice, HBP_NUM); estructura perf_event *bp = thread->ptrace_bps[índice];
Linus aceptó a tu sucursal principal, de la advertencia moviendo la definición de la variable a un bloque if:
si (n < HBP_NUM) { int índice = array_index_nospec(n, HBP_NUM); estructura perf_event *bp = thread->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 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;
si (n < HBP_NUM ){ estructura perf_event *bp = thread->ptrace_bps[índice];
índice = array_index_nospec(índice, HBP_NUM);
Fuente: opennet.ru
