Una correzione avventata ha portato a una correzione incompleta per una vulnerabilità di Spectre nel kernel Linux

Sviluppatori del progetto Grsecurity condivisa un avvertimento che dimostra come l'eliminazione sconsiderata degli avvisi del compilatore possa portare a vulnerabilità nel codice. Alla fine di maggio è stato proposto un fix per il kernel Linux per un nuovo vettore di sfruttamento della vulnerabilità Spectre attraverso la chiamata di sistema ptrace.

Durante il test della patch, gli sviluppatori hanno notato che durante la compilazione, il compilatore visualizza un avviso relativo alla combinazione di codice e definizioni (la struttura è stata definita dopo il codice, assegnando un valore a una variabile esistente):

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

Linus accettò correzione al tuo ramo principale, essendosi sbarazzato di dall'avviso spostando la definizione della variabile in un blocco if:

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

A luglio la correzione è stata portata anche sui rami stabili del kernel 4.4, 4.9, 4.14, 4.19 e 5.2. Anche i manutentori dei rami stable si sono imbattuti nell'avviso e, invece di controllare se era già stato corretto nel ramo master di Linus, hanno apportato una correzione da soli. Il problema è che senza pensarci davvero, semplicemente mosso definendo la struttura, in modo che la chiamata ad array_index_nospec, che fornisce direttamente la protezione contro la vulnerabilità, non venga più utilizzata durante la definizione della struttura e al posto della variabile "index" venga sempre utilizzata la variabile "n":

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

Fonte: opennet.ru

Aggiungi un commento