En udslæt rettelse resulterede i en ufuldstændig rettelse af en Spectre-sårbarhed i Linux-kernen

Udviklere af Grsecurity-projektet delt en advarselsfortælling, der demonstrerer, hvordan den skødesløse eliminering af compileradvarsler kan føre til sårbarheder i koden. I slutningen af ​​maj blev der for Linux-kernen foreslået en rettelse til en ny vektor for udnyttelse af Spectre-sårbarheden gennem ptrace-systemkaldet.

I processen med at teste patchen lagde udviklerne mærke til, at compileren, når den byggede, viser en advarsel om blanding af kode og definitioner (strukturen blev defineret efter koden med tildeling af en værdi til en eksisterende variabel):

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

Linus accepterede korrektion til din mestergren, komme af med fra advarslen ved at pakke variabeldefinitionen ind i en if-blok:

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

I juli blev rettelsen også overført til 4.4, 4.9, 4.14, 4.19 og 5.2 stabile kernegrene. Staldvedligeholderne stødte også på advarslen, og i stedet for at tjekke, om den allerede var rettet i Linus' mestergren, lappede de den selv. Problemet er, at de uden megen eftertanke bare flyttet strukturdefinition op, således at kaldet til array_index_nospec, som direkte giver beskyttelse mod sårbarheden, ikke længere bruges i definitionen af ​​strukturen, og i stedet for "index"-variablen blev "n"-variablen altid brugt:

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

Kilde: opennet.ru

Tilføj en kommentar