Egy átgondolatlan javítás hiányos javítást eredményezett a Spectre sebezhetőségében a Linux kernelben

A Grsecurity projekt fejlesztői megosztott egy figyelmeztető mese, amely bemutatja, hogy a fordítói figyelmeztetések meggondolatlan megszüntetése hogyan vezethet a kód sebezhetőségéhez. Május végén javítást javasoltak a Linux kernelhez a Spectre sebezhetőségének a ptrace rendszerhíváson keresztül történő kihasználásának új vektorára.

A javítás tesztelése során a fejlesztők észrevették, hogy építéskor a fordító figyelmeztetést jelenít meg a kód és a definíciók keveredésére (a struktúra a kód után lett definiálva, értéket rendelve egy meglévő változóhoz):

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

Linus elfogadta javítás a mesterágadhoz, miután megszabadult a figyelmeztetésből úgy, hogy a változódefiníciót áthelyezi egy if blokkra:

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

Júliusban a javítás a stabil kernel 4.4-es, 4.9-es, 4.14-es, 4.19-es és 5.2-es ágaira is átkerült. A stabil ágak fenntartói is találkoztak a figyelmeztetéssel, és ahelyett, hogy ellenőrizték volna, hogy a Linus master ágában már kijavították-e, inkább maguk végeztek javítást. A probléma az, hogy anélkül, hogy komolyan gondolnák, egyszerűen csak megmozdult felfelé definiálva a struktúrát úgy, hogy a sérülékenység ellen közvetlenül védelmet nyújtó array_index_nospec hívása már ne kerüljön felhasználásra a struktúra meghatározásakor, és az "index" változó helyett mindig az "n" változót használjuk:

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

Forrás: opennet.ru

Hozzászólás