En utslagsfix resulterade i en ofullständig fix för en Spectre-sårbarhet i Linux-kärnan

Utvecklare av Grsecurity-projektet delad en varnande berättelse som visar hur slarvig eliminering av kompilatorvarningar kan leda till sårbarheter i koden. I slutet av maj föreslogs en fix för Linux-kärnan för en ny vektor för exploatering av Spectre-sårbarheten genom systemanropet ptrace.

I processen med att testa patchen märkte utvecklarna att när kompilatorn byggde, visar kompilatorn en varning om att blanda kod och definitioner (strukturen definierades efter koden med att tilldela ett värde till en befintlig variabel):

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

Linus tackade ja korrigering till din herregren, göra sig av med från varningen genom att linda variabeldefinitionen i ett if-block:

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

I juli portades korrigeringen även till de stabila kärngrenarna 4.4, 4.9, 4.14, 4.19 och 5.2. Stallhållarna stötte också på varningen, och istället för att kolla om den redan var fixad i Linus mastergren, lappade de själva. Problemet är att de, utan mycket eftertanke, bara rörd strukturdefinition uppåt, så att anropet till array_index_nospec, som direkt ger skydd mot sårbarheten, inte längre används i definitionen av strukturen, och istället för variabeln "index" användes alltid variabeln "n":

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

Källa: opennet.ru

Lägg en kommentar