Arweiniodd atgyweiriad brech at atgyweiriad anghyflawn ar gyfer bregusrwydd Specter yn y cnewyllyn Linux

Datblygwyr y prosiect Grsecurity wedi'i rannu stori rybuddiol sy'n dangos sut y gall dileu rhybuddion casglwr yn ddiofal arwain at wendidau yn y cod. Ar ddiwedd mis Mai, ar gyfer y cnewyllyn Linux, cynigiwyd atgyweiriad ar gyfer fector newydd o ymelwa ar fregusrwydd Specter trwy alwad system ptrace.

Yn y broses o brofi'r clwt, sylwodd y datblygwyr, wrth adeiladu, bod y casglwr yn dangos rhybudd ynghylch cymysgu cod a diffiniadau (diffiniwyd y strwythur ar Γ΄l y cod trwy aseinio gwerth i newidyn presennol):

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

Derbyniodd Linus cywiriad i'ch prif gangen, cael gwared o'r rhybudd trwy lapio'r diffiniad amrywiol mewn bloc os:

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

Ym mis Gorffennaf, cafodd yr atgyweiriad ei gludo hefyd i ganghennau cnewyllyn sefydlog 4.4, 4.9, 4.14, 4.19, a 5.2 sefydlog. Daeth y cynhalwyr sefydlog ar draws y rhybudd hefyd, ac yn lle gwirio i weld a oedd eisoes wedi'i osod ym mhrif gangen Linus, fe wnaethant ei glytio eu hunain. Y broblem yw eu bod, heb lawer o feddwl, yn unig symud diffiniad strwythur i fyny, fel nad yw'r alwad i array_index_nospec, sy'n darparu amddiffyniad uniongyrchol yn erbyn y bregusrwydd, bellach yn cael ei ddefnyddio yn y diffiniad o'r strwythur, ac yn lle'r newidyn "mynegai", defnyddiwyd y newidyn "n" bob amser:

int mynegai = n;
os ( n < HBP_NUM ){ strwythur perf_event *bp = thread->ptrace_bps[mynegai];
mynegai = array_index_nospec(mynegai, HBP_NUM);

Ffynhonnell: opennet.ru

Ychwanegu sylw