Brzi popravak rezultirao je nepotpunim popravkom za Spectre ranjivost u Linux kernelu

Programeri Grsecurity projekta podijeljeno priča o upozorenju koja pokazuje kako nepromišljeno uklanjanje upozorenja prevoditelja može dovesti do ranjivosti u kodu. Krajem svibnja predložen je popravak za Linux kernel za novi vektor iskorištavanja ranjivosti Spectre putem ptrace sistemskog poziva.

Tijekom testiranja zakrpe, programeri su primijetili da prilikom izgradnje kompajler prikazuje upozorenje o miješanju koda i definicija (struktura je definirana nakon koda, dodjeljivanjem vrijednosti postojećoj varijabli):

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

Linus je prihvatio korekcija svojoj glavnoj grani, riješivši se iz upozorenja premještanjem definicije varijable u if blok:

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

U srpnju je popravak također prenesen na stabilne grane kernela 4.4, 4.9, 4.14, 4.19 i 5.2. Održavači stabilnih grana također su naišli na upozorenje i, umjesto da provjere je li već popravljeno u Linusovoj glavnoj grani, sami su napravili popravak. Problem je u tome što bez stvarnog razmišljanja o tome, oni samo prenijeti definiranje strukture gore, tako da se prilikom definiranja strukture više ne koristi poziv array_index_nospec, koji izravno pruža zaštitu od ranjivosti, a umjesto varijable "index" uvijek se koristi varijabla "n":

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

Izvor: opennet.ru

Dodajte komentar