Bezczynne poprawki doprowadziły do niepełnego usunięcia luki Spectre w jądrze Linuxa

Programiści projektu Grsecurity podzielili się 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ął poprawkę do swojej gałęzi master, pozbywając się 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 przenieśli 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

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster