Поправка на осип резултираше со нецелосно поправање на ранливоста на Spectre во кернелот на Linux

Програмери на проектот Grsecurity споделено предупредувачка приказна која покажува како непромисленото елиминирање на предупредувањата од компајлерот може да доведе до пропусти во кодот. На крајот на мај, беше предложено поправка за кернелот Линукс за нов вектор на искористување на ранливоста на Spectre преку системскиот повик ptrace.

При тестирањето на закрпата, програмерите забележаа дека при градењето, компајлерот прикажува предупредување за мешање на код и дефиниции (структурата беше дефинирана по кодот, доделувајќи вредност на постоечка променлива):

int индекс = n;
ако (n < HBP_NUM) { индекс = низа_индекс_nospec(индекс, HBP_NUM); struct perf_event *bp = нишка->ptrace_bps[индекс];

Линус прифати корекција до вашата господарска гранка, откако се ослободив од од предупредувањето со поместување на дефиницијата на променливата во блок if:

if (n < HBP_NUM) { int index = array_index_nospec(n, HBP_NUM); struct perf_event *bp = нишка->ptrace_bps[индекс];

Во јули, поправката беше пренесена и во гранките на стабилното јадро 4.4, 4.9, 4.14, 4.19 и 5.2. Одржувачите на стабилните гранки исто така наишле на предупредувањето и наместо да проверат дали е веќе поправено во главната гранка на Линус, тие сами направиле поправка. Проблемот е што без навистина да размислуваат за тоа, тие едноставно пренесен дефинирање на структурата нагоре, така што повикот до array_index_nospec, кој директно обезбедува заштита од ранливоста, повеќе не се користи при дефинирање на структурата, и наместо променливата „index“ секогаш се користи променливата „n“:

int индекс = n;
if (n < HBP_NUM ){ struct perf_event *bp = thread->ptrace_bps[index];
индекс = низа_индекс_nospec(индекс, HBP_NUM);

Извор: opennet.ru

Додадете коментар