Perbaikan yang terburu-buru menghasilkan perbaikan yang tidak lengkap untuk kerentanan Spectre di kernel Linux

Pengembang proyek Grsecurity bersama sebuah kisah peringatan yang menunjukkan bagaimana penghapusan peringatan compiler yang tidak bijaksana dapat menyebabkan kerentanan dalam kode. Pada akhir Mei, perbaikan diusulkan untuk kernel Linux untuk vektor baru eksploitasi kerentanan Spectre melalui panggilan sistem ptrace.

Saat menguji patch, pengembang memperhatikan bahwa saat membuat, kompiler menampilkan peringatan tentang pencampuran kode dan definisi (struktur ditentukan setelah kode, memberikan nilai ke variabel yang ada):

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

Linus menerimanya koreksi ke cabang utama Anda, setelah menyingkirkan dari peringatan dengan memindahkan definisi variabel ke blok if:

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

Pada bulan Juli, perbaikan juga di-porting ke cabang kernel stabil 4.4, 4.9, 4.14, 4.19 dan 5.2. Pengelola cabang stabil juga menemukan peringatan tersebut dan, alih-alih memeriksa apakah peringatan tersebut sudah diperbaiki di cabang master Linus, mereka malah memperbaikinya sendiri. Masalahnya adalah tanpa benar-benar memikirkannya, mereka hanya melakukannya terharu mendefinisikan struktur, sehingga panggilan ke array_index_nospec, yang secara langsung memberikan perlindungan terhadap kerentanan, tidak lagi digunakan saat mendefinisikan struktur, dan sebagai ganti variabel "indeks", variabel "n" selalu digunakan:

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

Sumber: opennet.ru

Tambah komentar