Бөртпелерді түзету Linux ядросындағы Spectre осалдығын толық емес түзетуге әкелді

Grsecurity жобасын әзірлеушілер бөлісті компилятордың ескертулерін ойланбастан жою кодтың осалдықтарына әкелуі мүмкін екенін көрсететін ескерту ертегісі. Мамыр айының соңында Linux ядросы үшін ptrace жүйесінің шақыруы арқылы Spectre осалдығын пайдаланудың жаңа векторы үшін түзету ұсынылды.

Патчты сынау кезінде әзірлеушілер құрастыру кезінде компилятор код пен анықтамаларды араластыру туралы ескертуді көрсететінін байқады (құрылым кодтан кейін анықталған, бар айнымалыға мән тағайындалған):

int индексі = n;
егер (n < HBP_NUM) { index = array_index_nospec (индекс, HBP_NUM); struct perf_event *bp = thread->ptrace_bps[индекс];

Линус қабылдады түзету басты филиалыңызға, құтылып айнымалы анықтамасын if блогына жылжыту арқылы ескертуден:

егер (n < HBP_NUM) { int index = array_index_nospec(n, HBP_NUM); struct perf_event *bp = thread->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[индекс];
индекс = array_index_nospec(индекс, HBP_NUM);

Ақпарат көзі: opennet.ru

пікір қалдыру