Dėl neapgalvoto pataisos „Linux“ branduolyje buvo neišsamus „Spectre“ pažeidžiamumo pataisymas

Grsecurity projekto kūrėjai bendrino įspėjamasis pasakojimas, parodantis, kaip neapgalvotas kompiliatoriaus įspėjimų pašalinimas gali sukelti kodo pažeidžiamumą. Gegužės pabaigoje buvo pasiūlytas Linux branduolio pataisymas dėl naujo Spectre pažeidžiamumo išnaudojimo per ptrace sistemos iškvietimą.

Bandydami pataisą kūrėjai pastebėjo, kad kuriant kompiliatorius rodo įspėjimą apie kodo ir apibrėžimų maišymą (struktūra buvo apibrėžta po kodu, priskiriant reikšmę esamam kintamajam):

int indeksas = n;
if (n < HBP_NUM) { indeksas = masyvo_indekso_nospec(indeksas, HBP_NUM); struct perf_event *bp = gijos->ptrace_bps[indeksas];

Linus priėmė pataisymas į savo pagrindinę šaką, atsikratę iš įspėjimo perkeldami kintamojo apibrėžimą į if bloką:

if (n < HBP_NUM) { int indeksas = masyvo_indekso_nospec(n, HBP_NUM); struct perf_event *bp = gijos->ptrace_bps[indeksas];

Liepos mėnesį pataisa taip pat buvo perkelta į stabilias branduolio šakas 4.4, 4.9, 4.14, 4.19 ir 5.2. Stabilių filialų prižiūrėtojai taip pat susidūrė su įspėjimu ir, užuot patikrinę, ar jis jau sutvarkytas Linaus pagrindiniame filiale, patys pasitaisė. Problema ta, kad tikrai apie tai negalvodami, jie tiesiog perkeltas apibrėžiant struktūrą aukštyn, kad apibrėžiant struktūrą nebebūtų naudojamas iškvietimas į array_index_nospec, kuris tiesiogiai suteikia apsaugą nuo pažeidžiamumo, o vietoj kintamojo "index" visada naudojamas kintamasis "n":

int indeksas = n;
if (n < HBP_NUM ){ struct perf_event *bp = gijos->ptrace_bps[indeksas];
indeksas = masyvas_indeksas_nospec(indeksas, HBP_NUM);

Šaltinis: opennet.ru

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