Pochopna poprawka zaowocowała niekompletną poprawką luki Spectre w jądrze Linuksa

Twórcy projektu Grsecurity wspólny przestroga pokazująca, jak bezmyślna eliminacja ostrzeżeń kompilatora może prowadzić do luk w kodzie. Pod koniec maja zaproponowano poprawkę dla jądra Linuksa dotyczącą nowego wektora wykorzystania luki Spectre poprzez wywołanie systemowe ptrace.

Podczas testowania łatki twórcy zauważyli, że podczas budowania kompilator wyświetla ostrzeżenie o mieszaniu kodu i definicji (struktura została zdefiniowana po kodzie, przypisując wartość istniejącej zmiennej):

int indeks = n;
if (n < HBP_NUM) { indeks = array_index_nospec(indeks, HBP_NUM); struktura perf_event *bp = wątek->ptrace_bps[indeks];

Linus zgodził się korekta do swojej głównej gałęzi, pozbyłem się z ostrzeżenia, przenosząc definicję zmiennej do bloku if:

if (n < HBP_NUM) { int indeks = array_index_nospec(n, HBP_NUM); struktura perf_event *bp = wątek->ptrace_bps[indeks];

W lipcu poprawka została również przeniesiona do stabilnych gałęzi jądra 4.4, 4.9, 4.14, 4.19 i 5.2. Opiekunowie gałęzi stabilnych również spotkali się z ostrzeżeniem i zamiast sprawdzić, czy zostało to już naprawione w gałęzi głównej Linusa, sami ją naprawili. Problem w tym, że nawet o tym nie myśląc, po prostu przeniósł zdefiniowanie struktury w górę, dzięki czemu wywołanie array_index_nospec, które bezpośrednio zapewnia ochronę przed podatnością, nie jest już używane przy definiowaniu struktury, a zamiast zmiennej „index” używana jest zawsze zmienna „n”:

int indeks = n;
if (n < HBP_NUM ){ struct perf_event *bp = wątek->ptrace_bps[indeks];
indeks = tablica_indeks_nospec(indeks, HBP_NUM);

Źródło: opennet.ru

Dodaj komentarz