Ihottuma korjaus johti Linux-ytimen Spectre-haavoittuvuuden epätäydelliseen korjaukseen

Grsecurity-projektin kehittäjät jaettu varoittava tarina, joka osoittaa kuinka kääntäjien varoitusten huolimaton poistaminen voi johtaa koodin haavoittuvuuksiin. Toukokuun lopussa Linux-ytimelle ehdotettiin korjausta uudelle Spectre-haavoittuvuuden hyödyntämisvektorille ptrace-järjestelmäkutsulla.

Korjausta testattaessa kehittäjät huomasivat, että kääntäjä näyttää rakennusvaiheessa varoituksen koodin ja määritelmien sekoittamisesta (rakenne määriteltiin koodin jälkeen antamalla arvo olemassa olevalle muuttujalle):

int indeksi = n;
if (n < HBP_NUM) { indeksi = array_index_nospec(indeksi, HBP_NUM); struct perf_event *bp = säie->ptrace_bps[indeksi];

Linus hyväksyi korjaus päähaaraasi, päästä eroon varoituksesta käärimällä muuttujan määritelmä if-lohkoon:

if (n < HBP_NUM) { int indeksi = array_index_nospec(n, HBP_NUM); struct perf_event *bp = säie->ptrace_bps[indeksi];

Heinäkuussa korjaus siirrettiin myös vakaaseen ytimen 4.4-, 4.9-, 4.14-, 4.19- ja 5.2-ydinhaaroihin. Myös vakaan ylläpitäjät kohtasivat varoituksen, ja sen sijaan, että olisivat tarkistaneet, onko se jo korjattu Linuksen päähaarassa, he korjasivat sen itse. Ongelmana on, että he, sen enempää ajattelematta, vain muutti rakenteen määrittely ylös, jolloin rakenteen määrittelyssä ei enää käytetä kutsua array_index_nospec, joka suojaa suoraan haavoittuvuutta vastaan, vaan "index"-muuttujan sijaan käytettiin aina muuttujaa "n":

int indeksi = n;
if (n < HBP_NUM ){ struct perf_event *bp = säie->ptrace_bps[indeksi];
indeksi = array_index_nospec(indeksi, HBP_NUM);

Lähde: opennet.ru

Lisää kommentti