O remediere rapidă a dus la o remediere incompletă pentru o vulnerabilitate Spectre în kernel-ul Linux

Dezvoltatorii proiectului Grsecurity impartit o poveste de avertizare care demonstrează cum eliminarea neglijentă a avertismentelor compilatorului poate duce la vulnerabilități în cod. La sfârșitul lunii mai, pentru nucleul Linux, a fost propusă o remediere pentru un nou vector de exploatare a vulnerabilității Spectre prin apelul de sistem ptrace.

În procesul de testare a patch-ului, dezvoltatorii au observat că la construcție, compilatorul afișează un avertisment despre amestecarea codului și definițiilor (structura a fost definită după cod cu atribuirea unei valori unei variabile existente):

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

Linus a acceptat corecție la ramura ta stăpână, a scapa de din avertisment prin împachetarea definiției variabilei într-un bloc if:

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

În iulie, remedierea a fost portată și în ramurile stabile ale nucleului 4.4, 4.9, 4.14, 4.19 și 5.2. De asemenea, menținătorii stabili au întâlnit avertismentul și, în loc să verifice dacă era deja remediat în filiala principală a lui Linus, l-au corectat ei înșiși. Problema este că ei, fără să se gândească prea mult, doar mutat definirea structurii sus, astfel încât apelul la array_index_nospec, care oferă direct protecție împotriva vulnerabilității, nu mai este folosit în definirea structurii, iar în locul variabilei „index”, a fost întotdeauna folosită variabila „n”:

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

Sursa: opennet.ru

Adauga un comentariu