Nekonsiderata flikaĵo rezultigis nekompletan solvon por la vundebleco Spectre en la Linukso-kerno.

Programistoj de la projekto Grsecurity dividita averta rakonto montranta kiom senpripensa elimino de kompilil-avertoj povas konduki al vundeblecoj en la kodo. Fine de majo, riparo estis proponita por la Linukso-kerno por nova vektoro de ekspluato de la vundebleco Spectre per la ptrace-sistemvoko.

Testante la peceton, la programistoj rimarkis, ke dum konstruado, la kompililo montras averton pri miksado de kodo kaj difinoj (la strukturo estis difinita post la kodo, asignante valoron al ekzistanta variablo):

int indekso = n;
if (n < HBP_NUM) { indekso = array_index_nospec (indekso, HBP_NUM); struct perf_okazaĵo *bp = fadeno->ptrace_bps[indekso];

Linus akceptis korekto al via majstra branĉo, liberiĝinte de de la averto movante la varian difinon al if-bloko:

if (n < HBP_NUM) { int indekso = array_index_nospec (n, HBP_NUM); struct perf_okazaĵo *bp = fadeno->ptrace_bps[indekso];

En julio, la riparo ankaŭ estis portita al la stabilaj kernaj branĉoj 4.4, 4.9, 4.14, 4.19 kaj 5.2. Ankaŭ la prizorgantoj de la stabilaj branĉoj renkontis la averton kaj, anstataŭ kontroli ĉu ĝi jam estis riparita en la majstra branĉo de Linus, ili mem faris riparo. La problemo estas, ke sen vere pensi pri tio, ili simple movita difinante la strukturon supren, tiel ke la voko al array_index_nospec, kiu rekte provizas protekton kontraŭ la vundebleco, ne plu estas uzata dum difinado de la strukturo, kaj anstataŭ la variablo "indekso" la variablo "n" ĉiam estas uzata:

int indekso = n;
if (n < HBP_NUM ){ struct perf_okazaĵo *bp = fadeno->ptrace_bps[indekso];
indekso = array_index_nospec (indekso, HBP_NUM);

fonto: opennet.ru

Aldoni komenton