Nepromišljena zakrpa rezultirala je nepotpunim popravkom ranjivosti Spectre u Linux kernelu

Programeri projekta Grsecurity podijeljeno priča upozorenja koja pokazuje kako nepromišljeno uklanjanje upozorenja kompajlera može dovesti do ranjivosti u kodu. Krajem maja predložena je popravka za Linux kernel za novi vektor eksploatacije ranjivosti Spectre putem ptrace sistemskog poziva.

Dok su testirali zakrpu, programeri su primijetili da pri izgradnji kompajler prikazuje upozorenje o miješanju koda i definicija (struktura je definirana nakon koda, dodjeljujući vrijednost postojećoj varijabli):

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

Linus je prihvatio korekcija u vašu glavnu granu, otarasio se iz upozorenja premještanjem definicije varijable u if blok:

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

U julu, popravka je takođe portovana na stabilne grane kernela 4.4, 4.9, 4.14, 4.19 i 5.2. Održavači stabilnih grana su također naišli na upozorenje i, umjesto da provjere da li je već popravljeno u Linusovoj glavnoj grani, sami su napravili popravku. Problem je u tome što bez stvarnog razmišljanja o tome samo preselio definiranje strukture gore, tako da se poziv array_index_nospec, koji direktno pruža zaštitu od ranjivosti, više ne koristi prilikom definiranja strukture, a umjesto varijable "index" uvijek se koristi varijabla "n":

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

izvor: opennet.ru

Dodajte komentar