Útbrotsleiðrétting leiddi til ófullkominnar lagfæringar á Spectre varnarleysi í Linux kjarnanum

Hönnuðir Grsecurity verkefnisins deilt varúðarsaga sem sýnir hvernig kærulaus útrýming þýðandaviðvarana getur leitt til veikleika í kóðanum. Í lok maí, fyrir Linux kjarnann, var lögð til lagfæring fyrir nýjan vektor fyrir hagnýtingu á Spectre varnarleysinu í gegnum ptrace kerfiskallið.

Í því ferli að prófa plásturinn tóku verktaki eftir því að við smíði birtir þýðandinn viðvörun um að blanda saman kóða og skilgreiningum (byggingin var skilgreind á eftir kóðanum með því að úthluta gildi til núverandi breytu):

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

Linus samþykkti breyting til meistaragrein þíns, losna við frá viðvöruninni með því að vefja breytuskilgreiningunni inn í if-blokk:

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

Í júlí var lagfæringin einnig flutt í 4.4, 4.9, 4.14, 4.19 og 5.2 stöðugar kjarnagreinar. Hesthúsviðhaldararnir lentu líka í viðvöruninni og í stað þess að athuga hvort hún væri þegar lagfærð í aðalútibúi Linus plástraðu þeir hana sjálfir. Vandamálið er að þeir, án mikillar umhugsunar, bara flutt uppbyggingu skilgreiningu upp, þannig að kallið til array_index_nospec, sem veitir beinlínis vernd gegn varnarleysinu, er ekki lengur notað í skilgreiningu skipulagsins og í stað "index" breytunnar var alltaf "n" breytan notuð:

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

Heimild: opennet.ru

Bæta við athugasemd