Rýchla oprava viedla k neúplnej oprave zraniteľnosti Spectre v jadre Linuxu

Vývojári projektu Grsecurity zdieľané varovný príbeh, ktorý ukazuje, ako môže neopatrné odstránenie upozornení kompilátora viesť k zraniteľnostiam v kóde. Koncom mája bola pre jadro Linuxu prostredníctvom systémového volania ptrace navrhnutá oprava nového exploitu pre zraniteľnosť Spectre.

V procese testovania opravy si vývojári všimli, že pri zostavovaní kompilátor zobrazuje varovanie o zmiešaní kódu a definícií (štruktúra bola definovaná za kódom s priradením hodnoty k existujúcej premennej):

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

Linus prijal oprava do svojej hlavnej pobočky, zbavovať sa z varovania zabalením definície premennej do bloku if:

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

V júli bola oprava prenesená aj na stabilné vetvy jadra 4.4, 4.9, 4.14, 4.19 a 5.2. S varovaním sa stretli aj správcovia stajní a namiesto toho, aby skontrolovali, či je už opravené v Linusovej hlavnej vetve, sami si ho opravili. Problém je v tom, že oni bez veľkého rozmýšľania len tak dojatý definícia štruktúry hore, takže volanie array_index_nospec, ktoré priamo poskytuje ochranu pred zraniteľnosťou, sa už v definícii štruktúry nepoužíva a namiesto premennej „index“ sa vždy použila premenná „n“:

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

Zdroj: opennet.ru

Pridať komentár