Programiści projektu Grsecurity z pouczającą historią, pokazującą, jak pochopne usuwanie ostrzeżeń kompilatora może prowadzić do pojawienia się luk w kodzie. Pod koniec maja zaproponowano poprawkę do jądra Linux w celu rozwiązania nowego wektora eksploatacji podatności Spectre przez wywołanie systemowe ptrace.
W trakcie testowania łatki programiści zwrócili uwagę, że kompilator wyświetla ostrzeżenie o mieszaniu kodu i definicji (struktura została zdefiniowana po kodzie przypisującym wartość istniejącej zmiennej):
int index = n;
if (n ptrace_bps[index];
Linus przyjął do swojej gałęzi master, ostrzeżenia poprzez przeniesienie definicji zmiennej do bloku if:
if (n ptrace_bps[index];
W lipcu poprawka została także przeniesiona do stabilnych gałęzi jądra 4.4, 4.9, 4.14, 4.19 i 5.2. Utrzymujący stabilne gałęzie również natknęli się na ostrzeżenie i zamiast sprawdzić, czy zostało ono już usunięte w gałęzi master Linusa, wprowadzili poprawkę na własną rękę. Problem polega na tym, że nie zastanawiając się specjalnie, po prostu definicję struktury wyżej, tak, że wywołanie array_index_nospec, które bezpośrednio zapewniało ochronę przed podatnością, przestało być używane przy definiowaniu struktury, a zamiast zmiennej „index” zawsze używana była zmienna „n”:
int index = n;
if (n ptrace_bps[index];
index = array_index_nospec(index, HBP_NUM);
Źródło: opennet.ru
