Неабдуманае выпраўленне прывяло да няпоўнага ўхілення ўразлівасці Spectre у ядры Linux

Распрацоўнікі праекту Grsecurity падзяліліся павучальнай гісторыяй, якая дэманструе як неабдуманае ўхіленне папярэджанняў кампілятара можа прывесці да з'яўлення ўразлівасцяў у кодзе. У канцы траўня для ядра Linux было прапанавана выпраўленне новага вектара эксплуатацыі ўразлівасці Spectre праз сістэмны выклік ptrace.

У працэсе тэсціравання патча распрацоўшчыкі звярнулі ўвагу, што пры зборцы кампілятар выводзіць папярэджанне аб змешванні кода і азначэнняў (структура была вызначана пасля кода з прысваеннем значэння існуючай зменнай):

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

Лінус прыняў выпраўленне у сваю master-галінку, пазбавіўшыся ад папярэджання шляхам пераносу вызначэння зменнай у блок if:

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

У ліпені выпраўленне таксама было партавана ў стабільныя галінкі ядра 4.4, 4.9, 4.14, 4.19 і 5.2. Суправаджаючыя стабільныя галіны таксама сутыкнуліся з папярэджаннем і замест таго, каб праверыць, ці не ліквідавана яно ўжо ў master-галінцы Лінуса, уласнаручна ўнеслі выпраўленне. Праблема ў тым, што яны, асабліва не задумваючыся, проста перанеслі азначэнне структуры ўверх, так, што выклік array_index_nospec, непасрэдна які забяспечвае абарону ад уразлівасці, перастаў выкарыстоўвацца пры азначэнні структуры, і замест зменнай «index» заўсёды выкарыстоўвалася зменная «n»:

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

Крыніца: opennet.ru

Дадаць каментар