Läbimõtlematu plaaster põhjustas Linuxi tuuma Spectre haavatavuse mittetäieliku paranduse

Grsecurity projekti arendajad jagatud hoiatav lugu, mis näitab, kuidas kompilaatori hoiatuste mõtlematu kõrvaldamine võib põhjustada koodi haavatavust. Mai lõpus pakuti Linuxi tuuma jaoks parandusettepanekut Spectre haavatavuse uueks ärakasutamiseks ptrace süsteemikutse kaudu.

Plaastri testimisel märkasid arendajad, et ehitamisel kuvab kompilaator hoiatuse koodi ja definitsioonide segamise kohta (struktuur määratleti pärast koodi, määrates olemasolevale muutujale väärtuse):

int indeks = n;
if (n < HBP_NUM) { indeks = massiivi_indeks_nospec(indeks, HBP_NUM); struct perf_event *bp = lõime->ptrace_bps[indeks];

Linus nõustus korrektsioon oma põhiharule, olles vabanenud hoiatusest, liigutades muutuja definitsiooni if-plokki:

if (n < HBP_NUM) { int indeks = massiivi_indeks_nospec(n, HBP_NUM); struct perf_event *bp = lõime->ptrace_bps[indeks];

Juulis porditi parandus ka stabiilsetele kerneli harudele 4.4, 4.9, 4.14, 4.19 ja 5.2. Hoiatusega puutusid kokku ka talliharude hooldajad, kes selle asemel, et kontrollida, kas see on Linuse põhiharus juba parandatud, tegid ise paranduse. Probleem on selles, et sellele mõtlemata lihtsalt üle kantud defineerides struktuuri üles, nii et struktuuri defineerimisel ei kasutata enam kutset array_index_nospec, mis pakub otsest kaitset haavatavuse eest ning muutuja "index" asemel kasutatakse alati muutujat "n":

int indeks = n;
if (n < HBP_NUM ){ struct perf_event *bp = lõime->ptrace_bps[indeks];
indeks = massiivi_indeks_nospec(indeks, HBP_NUM);

Allikas: opennet.ru

Lisa kommentaar