Nenaden popravek je povzročil nepopoln popravek za ranljivost Spectre v jedru Linuxa

Razvijalci projekta Grsecurity v skupni rabi opozorilna zgodba, ki prikazuje, kako lahko neprevidno odstranjevanje opozoril prevajalnika vodi do ranljivosti v kodi. Konec maja je bil za jedro Linux predlagan popravek za nov vektor izkoriščanja ranljivosti Spectre prek sistemskega klica ptrace.

V procesu testiranja popravka so razvijalci opazili, da pri gradnji prevajalnik prikaže opozorilo o mešanju kode in definicij (struktura je bila definirana po kodi z dodelitvijo vrednosti obstoječi spremenljivki):

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

Linus je sprejel popravek vaši glavni veji, znebiti se iz opozorila tako, da definicijo spremenljivke zavijete v blok if:

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

Julija je bil popravek prenesen tudi v stabilne veje jedra 4.4, 4.9, 4.14, 4.19 in 5.2. Stabilni vzdrževalci so prav tako naleteli na opozorilo in namesto da bi preverili, ali je že popravljeno v Linusovi glavni veji, so ga zakrpali sami. Težava je v tem, da oni, brez večjega razmišljanja, pač preselil definicija strukture navzgor, tako da se v definiciji strukture ne uporablja več klic array_index_nospec, ki neposredno zagotavlja zaščito pred ranljivostjo, namesto spremenljivke "index" pa je vedno uporabljena spremenljivka "n":

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

Vir: opennet.ru

Dodaj komentar