En utslettretting resulterte i en ufullstendig reparasjon for en Spectre-sårbarhet i Linux-kjernen

Utviklere av Grsecurity-prosjektet delt en advarende historie som viser hvordan uforsiktig eliminering av kompilatoradvarsler kan føre til sårbarheter i koden. I slutten av mai, for Linux-kjernen, ble det foreslått en reparasjon for en ny vektor for utnyttelse av Spectre-sårbarheten gjennom ptrace-systemkallet.

I prosessen med å teste oppdateringen la utviklerne merke til at når kompilatoren bygger, viser kompilatoren en advarsel om å blande kode og definisjoner (strukturen ble definert etter koden med å tilordne en verdi til en eksisterende variabel):

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

Linus takket ja korreksjon til din mestergren, bli kvitt fra advarselen ved å pakke variabeldefinisjonen inn i en if-blokk:

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

I juli ble rettelsen også portert til 4.4, 4.9, 4.14, 4.19 og 5.2 stabile kjernegrener. Stallholderne møtte også advarselen, og i stedet for å sjekke om den allerede var fikset i Linus sin mastergren, lappet de den selv. Problemet er at de, uten mye ettertanke, bare overført strukturdefinisjon opp, slik at kallet til array_index_nospec, som direkte gir beskyttelse mot sårbarheten, ikke lenger brukes i definisjonen av strukturen, og i stedet for "indeks"-variabelen ble alltid "n"-variabelen brukt:

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

Kilde: opennet.ru

Legg til en kommentar