Pembetulan ruam mengakibatkan pembetulan yang tidak lengkap untuk kelemahan Spectre dalam kernel Linux

Pemaju projek Grsecurity dikongsi bersama kisah amaran yang menunjukkan bagaimana penghapusan amaran pengkompil yang tidak bertimbang rasa boleh membawa kepada kelemahan dalam kod. Pada penghujung Mei, pembetulan telah dicadangkan untuk kernel Linux untuk vektor baharu eksploitasi kelemahan Spectre melalui panggilan sistem ptrace.

Semasa menguji tampung, pembangun menyedari bahawa apabila membina, pengkompil memaparkan amaran tentang pencampuran kod dan definisi (struktur ditakrifkan selepas kod, memberikan nilai kepada pembolehubah sedia ada):

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

Linus menerima pembetulan ke cawangan tuan anda, setelah menyingkirkan daripada amaran dengan mengalihkan definisi pembolehubah ke blok if:

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

Pada bulan Julai, pembetulan itu juga dialihkan ke cawangan kernel yang stabil 4.4, 4.9, 4.14, 4.19 dan 5.2. Penyelenggara cawangan stabil juga menghadapi amaran dan, bukannya menyemak untuk melihat sama ada ia telah ditetapkan di cawangan induk Linus, mereka membuat pembaikan sendiri. Masalahnya ialah tanpa benar-benar memikirkannya, mereka hanya tergerak mentakrifkan struktur, supaya panggilan ke array_index_nospec, yang secara langsung memberikan perlindungan terhadap kelemahan, tidak lagi digunakan semasa mentakrifkan struktur, dan bukannya pembolehubah "indeks" pembolehubah "n" sentiasa digunakan:

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

Sumber: opennet.ru

Tambah komen