Kötü düşünülmüş bir yama, Linux çekirdeğindeki Spectre güvenlik açığının eksik bir şekilde düzeltilmesine neden oldu

Grsecurity projesinin geliştiricileri paylaşılan derleyici uyarılarının düşüncesizce ortadan kaldırılmasının kodda nasıl güvenlik açıklarına yol açabileceğini gösteren uyarıcı bir hikaye. Mayıs ayının sonunda, ptrace sistem çağrısı aracılığıyla Spectre güvenlik açığının yeni bir istismar vektörü için Linux çekirdeğine yönelik bir düzeltme önerildi.

Geliştiriciler yamayı test ederken derleyicinin kod ve tanımların karıştırılmasıyla ilgili bir uyarı görüntülediğini fark etti (yapı koddan sonra tanımlandı, mevcut bir değişkene bir değer atadı):

int indeksi = n;
if (n < HBP_NUM) { indeks = array_index_nospec(indeks, HBP_NUM); struct perf_event *bp = iş parçacığı->ptrace_bps[index];

Linus kabul edildi düzeltme ana şubenize, kurtulduktan değişken tanımını bir if bloğuna taşıyarak uyarıdan:

if (n < HBP_NUM) { int index = array_index_nospec(n, HBP_NUM); struct perf_event *bp = iş parçacığı->ptrace_bps[index];

Temmuz ayında düzeltme, kararlı çekirdek dalları 4.4, 4.9, 4.14, 4.19 ve 5.2'ye de taşındı. Ahır şubelerinin bakımcıları da bu uyarıyla karşılaştı ve sorunun Linus'un ana şubesinde düzeltilmiş olup olmadığını kontrol etmek yerine kendileri bir düzeltme yaptılar. Sorun şu ki, gerçekten düşünmeden, sadece taşındı böylece yapıyı tanımlarken doğrudan güvenlik açığına karşı koruma sağlayan array_index_nospec çağrısı artık kullanılmaz ve "index" değişkeni yerine her zaman "n" değişkeni kullanılır:

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

Kaynak: opennet.ru

Yorum ekle