Unáhlená oprava vedla k neúplné opravě zranitelnosti Spectre v jádře Linuxu

Vývojáři projektu Grsecurity sdílené varovný příběh, který ukazuje, jak nedbalé odstranění varování kompilátoru může vést ke zranitelnosti v kódu. Na konci května byla pro linuxové jádro navržena oprava pro nový vektor zneužití zranitelnosti Spectre prostřednictvím systémového volání ptrace.

V procesu testování opravy si vývojáři všimli, že při sestavování kompilátor zobrazuje varování o smíchání kódu a definic (struktura byla definována za kódem s přiřazením hodnoty existující proměnné):

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

Linus přijal oprava do své hlavní pobočky, zbavit se z varování zabalením definice proměnné do bloku if:

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

V červenci byla oprava přenesena také na stabilní větve jádra 4.4, 4.9, 4.14, 4.19 a 5.2. Správci stájí se také setkali s varováním a místo toho, aby zkontrolovali, zda je již opraveno v Linusově hlavní větvi, sami si jej opravili. Problém je v tom, že bez dlouhého přemýšlení prostě přestěhovala definice struktury nahoru, takže volání array_index_nospec, které přímo poskytuje ochranu proti zranitelnosti, se již v definici struktury nepoužívá a místo proměnné "index" byla vždy použita proměnná "n":

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

Zdroj: opennet.ru

Přidat komentář