Ang isang pantal na pag-aayos ay nagresulta sa isang hindi kumpletong pag-aayos para sa isang kahinaan ng Spectre sa Linux kernel

Mga developer ng proyekto ng Grsecurity ibinahagi isang babala na kuwento na nagpapakita kung paano ang walang pag-iisip na pag-aalis ng mga babala ng compiler ay maaaring humantong sa mga kahinaan sa code. Sa katapusan ng Mayo, iminungkahi ang pag-aayos para sa Linux kernel para sa isang bagong vector ng pagsasamantala sa kahinaan ng Spectre sa pamamagitan ng ptrace system call.

Habang sinusubukan ang patch, napansin ng mga developer na kapag nagtatayo, ang compiler ay nagpapakita ng babala tungkol sa paghahalo ng code at mga kahulugan (ang istraktura ay tinukoy pagkatapos ng code, na nagtatalaga ng isang halaga sa isang umiiral na variable):

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

Tinanggap ni Linus pagwawasto sa iyong master branch, nang makaalis mula sa babala sa pamamagitan ng paglipat ng variable na kahulugan sa isang if block:

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

Noong Hulyo, ang pag-aayos ay nai-port din sa mga matatag na sanga ng kernel 4.4, 4.9, 4.14, 4.19 at 5.2. Nakatagpo din ng babala ang mga maintainer ng mga stable branch at, sa halip na tingnan kung naayos na ito sa master branch ni Linus, sila mismo ang nag-ayos. Ang problema ay na walang talagang iniisip tungkol dito, sila lang lumipat pagtukoy sa istraktura, upang ang tawag sa array_index_nospec, na direktang nagpoprotekta laban sa kahinaan, ay hindi na ginagamit kapag tinutukoy ang istraktura, at sa halip na ang variable na "index" ang variable na "n" ay palaging ginagamit:

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

Pinagmulan: opennet.ru

Magdagdag ng komento