Vývojáři projektu Grsecurity o poučný příběh, který ilustruje, jak nepromyšlené odstranění varování kompilátoru může vést k vzniku zranitelností v kódu. Na konci května bylo pro jádro Linux navrženo opravení nového exploitačního vektoru zranitelnosti Spectre prostřednictvím systémového volání ptrace.
Během testování opravy se vývojáři zaměřili na to, že při sestavení kompilátor vypisuje varování o míchání kódu a definic (struktura byla definována po kódu, který přiřazuje hodnotu existující proměnné):
int index = n;
if (n ptrace_bps[index];
Linus přijal do své master-větve, varování přemístěním definice proměnné do bloku if:
if (n ptrace_bps[index];
V červenci bylo opravení také portováno do stabilních větví jádra 4.4, 4.9, 4.14, 4.19 a 5.2. Správci stabilních větví se také setkali s varováním a místo toho, aby zkontrolovali, zda již bylo odstraněno v Linusově master-větvi, sami provedli opravu. Problém je v tom, že se bez hlubokého zamyšlení jednoduše definici struktury nahoru, takže volání array_index_nospec, které přímo zajišťuje ochranu proti zranitelnosti, již nebylo použito při definici struktury a místo proměnné „index“ se vždy používala proměnná „n“:
int index = n;
if (n ptrace_bps[index];
index = array_index_nospec(index, HBP_NUM);
Zdroj: opennet.ru
