Nepārdomāts ielāps izraisīja nepilnīgu Spectre ievainojamības labojumu Linux kodolā.

Grsecurity projekta izstrādātāji dalīts brīdinājuma stāsts, kas parāda, kā nepārdomāta kompilatoru brīdinājumu likvidēšana var izraisīt koda ievainojamības. Maija beigās tika ierosināts Linux kodola labojums jaunam Spectre ievainojamības izmantošanas vektoram, izmantojot ptrace sistēmas izsaukumu.

Pārbaudot ielāpu, izstrādātāji pamanīja, ka, veidojot, kompilators parāda brīdinājumu par koda un definīciju sajaukšanu (struktūra tika definēta pēc koda, piešķirot vērtību esošam mainīgajam):

int indekss = n;
if (n < HBP_NUM) { indekss = masīva_indekss_nospec(indekss, HBP_NUM); struct perf_event *bp = pavediens->ptrace_bps[indekss];

Linuss pieņēma korekcija uz savu galveno filiāli, atbrīvojoties no no brīdinājuma, pārvietojot mainīgā definīciju uz if bloku:

if (n < HBP_NUM) { int indekss = masīva_indekss_nospec(n, HBP_NUM); struct perf_event *bp = pavediens->ptrace_bps[indekss];

Jūlijā labojums tika pārnests arī uz stabilajiem kodola zariem 4.4, 4.9, 4.14, 4.19 un 5.2. Arī stabilo filiāļu uzturētāji saskārās ar brīdinājumu un tā vietā, lai pārbaudītu, vai Linusa galvenajā filiālē tas jau nav labots, viņi paši veica labojumu. Problēma ir tā, ka, īsti nedomājot par to, viņi vienkārši nodots definējot struktūru uz augšu, lai definējot struktūru vairs netiktu izmantots izsaukums array_index_nospec, kas tieši nodrošina aizsardzību pret ievainojamību, un mainīgā "index" vietā vienmēr tiek izmantots mainīgais "n":

int indekss = n;
if (n < HBP_NUM ){ struct perf_event *bp = pavediens->ptrace_bps[indekss];
indekss = masīvs_indekss_nospec(indekss, HBP_NUM);

Avots: opennet.ru

Pievieno komentāru