Չմտածված ուղղումը հանգեցրեց Linux-ի միջուկում Spectre-ի խոցելիության թերի շտկմանը

Grsecurity նախագծի մշակողները համօգտագործված նախազգուշական հեքիաթ, որը ցույց է տալիս, թե ինչպես կարող է կոմպիլյատորի զգուշացումների անզգույշ վերացումը հանգեցնել կոդի խոցելիության: Մայիսի վերջին, Linux միջուկի համար, առաջարկվեց շտկել Spectre-ի խոցելիության շահագործման նոր վեկտորի համար ptrace համակարգի կանչի միջոցով:

Կարկատման փորձարկման գործընթացում մշակողները նկատել են, որ կառուցման ժամանակ կոմպիլյատորը ցուցադրում է նախազգուշացում կոդի և սահմանումների խառնման մասին (կառուցվածքը սահմանվել է կոդից հետո՝ գոյություն ունեցող փոփոխականին արժեք հատկացնելով).

int ինդեքս = n;
if (n < HBP_NUM) { index = array_index_nospec (index, HBP_NUM); struct perf_event *bp = thread->ptrace_bps[index];

Լինուսն ընդունեց ուղղում քո վարպետ մասնաճյուղին, ազատվելով նախազգուշացումից՝ փոփոխականի սահմանումը փաթաթելով 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 կայուն միջուկի ճյուղերում: Կայուն սպասարկողները նույնպես հանդիպեցին նախազգուշացմանը, և փոխանակ ստուգելու, թե արդյոք այն արդեն ֆիքսված է Լինուսի գլխավոր ճյուղում, նրանք իրենք այն կարկատեցին։ Խնդիրն այն է, որ նրանք, առանց շատ մտածելու, պարզապես տեղափոխվեց կառուցվածքի սահմանումը վերև, այնպես որ զանգը դեպի array_index_nospec, որն ուղղակիորեն պաշտպանում է խոցելիությունից, այլևս չի օգտագործվում կառուցվածքի սահմանման մեջ, և «index» փոփոխականի փոխարեն միշտ օգտագործվել է «n» փոփոխականը.

int ինդեքս = n;
if (n < HBP_NUM ){ struct perf_event *bp = thread->ptrace_bps[index];
ինդեքս = array_index_nospec (ինդեքս, HBP_NUM);

Source: opennet.ru

Добавить комментарий