Una correcció ràpida va provocar una correcció incompleta per a una vulnerabilitat de Spectre al nucli de Linux

Desenvolupadors del projecte Grsecurity compartit una història d'advertència que demostra com l'eliminació irreflexiva d'advertiments del compilador pot provocar vulnerabilitats en el codi. A finals de maig, es va proposar una correcció per al nucli de Linux per a un nou vector d'explotació de la vulnerabilitat Spectre mitjançant la crida al sistema ptrace.

Durant la prova del pedaç, els desenvolupadors es van adonar que en construir, el compilador mostra un avís sobre la barreja de codi i definicions (l'estructura es va definir després del codi, assignant un valor a una variable existent):

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

Linus va acceptar correcció a la teva branca mestra, havent-se desfet de l'avís movent la definició de variable a un bloc if:

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

Al juliol, la correcció també es va portar a les branques estables del nucli 4.4, 4.9, 4.14, 4.19 i 5.2. Els mantenedors de les branques estables també es van trobar amb l'avís i, en comptes de comprovar si ja s'havia arreglat a la branca mestra de Linus, van fer una solució ells mateixos. El problema és que sense pensar-s'ho realment, simplement mogut definint l'estructura cap amunt, de manera que la crida a array_index_nospec, que proporciona directament protecció contra la vulnerabilitat, ja no s'utilitza quan es defineix l'estructura, i en lloc de la variable "índex" sempre s'utilitza la variable "n":

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

Font: opennet.ru

Afegeix comentari