'n Uitslagoplossing het gelei tot 'n onvolledige oplossing vir 'n Spectre-kwesbaarheid in die Linux-kern

Ontwikkelaars van die Grsecurity-projek gedeel 'n waarskuwingsverhaal wat demonstreer hoe onnadenkende uitskakeling van samestellerwaarskuwings tot kwesbaarhede in die kode kan lei. Aan die einde van Mei is 'n oplossing vir die Linux-kern voorgestel vir 'n nuwe vektor van uitbuiting van die Spectre-kwesbaarheid deur die ptrace-stelseloproep.

Terwyl hulle die pleister getoets het, het die ontwikkelaars opgemerk dat die samesteller 'n waarskuwing toon oor die vermenging van kode en definisies (die struktuur is na die kode gedefinieer, wat 'n waarde aan 'n bestaande veranderlike toeken):

int indeks = n;
if (n < HBP_NUM) { indeks = skikking_indeks_nospec(indeks, HBP_NUM); struct perf_event *bp = thread->ptrace_bps[indeks];

Linus het aanvaar regstelling na jou meestertak, ontslae geraak het van die waarskuwing deur die veranderlike definisie na 'n if-blok te skuif:

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

In Julie is die regstelling ook na die stabiele kerntakke 4.4, 4.9, 4.14, 4.19 en 5.2 oorgedra. Die instandhouers van die staltakke het ook die waarskuwing teΓ«gekom en in plaas daarvan om te kyk of dit reeds in Linus se meestertak reggemaak is, het hulle self 'n regstelling gemaak. Die probleem is dat sonder om regtig daaroor te dink, hulle net verskuif om die struktuur op te definieer, sodat die oproep na array_index_nospec, wat direk beskerming bied teen die kwesbaarheid, nie meer gebruik word wanneer die struktuur gedefinieer word nie, en in plaas van die veranderlike "indeks" word die veranderlike "n" altyd gebruik:

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

Bron: opennet.ru

Voeg 'n opmerking