CVE-2021-47465
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: KVM: PPC: Book3S HV: idle_kvm_start_guest() fonksiyonundaki yığın yönetimi düzeltildi 10d91611f426 ("powerpc/64s: Reimplement book3s idle code in C") commit'inde kvm_start_guest(), idle_kvm_start_guest() haline getirilmiştir. Eski kod, acil durum yığını (emergency stack) üzerinde bir yığın çerçevesi (stack frame) ayırıyor ancak bu çerçeveyi herhangi bir şeyi depolamak için kullanmıyordu ve çağıran fonksiyonun çerçevesine de herhangi bir veri kaydetmiyordu. Öte yandan idle_kvm_start_guest(), daha çok normal bir C fonksiyonu gibi yazılmıştır; giriş sırasında bir çerçeve oluşturur ve ayrıca (ABI uyarınca) CR/LR değerlerini çağıranın çerçevesine kaydeder. Sorun, acil durum yığını üzerinde bir çağrıcı çerçevesinin bulunmamasıdır. Belirli bir CPU için acil durum yığını şu şekilde tahsis edilir: paca_ptrs[i]->emergency_sp = alloc_stack(limit, i) + THREAD_SIZE; Dolayısıyla emergency_sp aslında belirli bir CPU için yapılan acil durum yığını tahsisinin üzerindeki ilk adresi göstermektedir; bir çerçeve oluşturmak için önce değeri azaltmadan üzerine veri kaydedilmemelidir. Bu durum, hazırda kullanılabilir bir başlangıç çerçevesini gösterecek şekilde başlatılan düzenli çekirdek yığını olan paca->kstack'ten farklıdır. idle_kvm_start_guest(); backchain, CR ve LR değerlerini kaydeder ve bunların tamamı acil durum yığını tahsisinin dışına yazar. Ardından bir yığın çerçevesi oluşturur ve kalıcı olmayan (non-volatile) kayıtçıları kaydeder. Ne yazık ki oluşturulan çerçeve, kalıcı olmayan kayıtçılara yetecek kadar büyük değildir ve bu nedenle kalıcı olmayan kayıtçıların kaydedilmesi de acil durum yığını tahsisinin dışına yazar. Sonuç olarak, acil durum yığını tahsisinin 0-24 bayt ve 112-248 bayt yukarısında bulunan her ne varsa bozulmaktadır. Pratikte bu durum fark edilmeden kalmıştır çünkü acil durum yığınının hemen üzerindeki bellek alanı tesadüfen diğer yığın tahsisleri (başka bir CPU'nun mc_emergency_sp'si veya bir IRQ yığını) için kullanılmaktadır. irqstack_early_init() ve emergency_stack_init() fonksiyonlarına yapılan çağrı sırasına bakınız. Başka bir yığının düşük adresleri o yığının üst kısmıdır ve dolayısıyla yalnızca o yığın aşırı baskı altındaysa kullanılırlar; bu durum pratikte neredeyse hiç gerçekleşmez ve gerçekleşseydi bile yüksek ihtimalle söz konusu yığının taşması nedeniyle sistem çökerdi. Yine de başka birinin yığınını bozmamalıyız ve başka bir şeyi bozmamış olmamız tamamen şanstır. Bu sorunu gidermek için, girişte mevcut olan r1'i kullanarak CR/LR değerlerini çağıranın çerçevesine kaydediyoruz, ardından acil durum yığını üzerinde backchain mevcut yığını gösterecek şekilde bir SWITCH_FRAME_SIZE çerçevesi (pt_regs için alanı olan) oluşturuyoruz ve son olarak acil durum yığınındaki yeni çerçeveye geçiş yapıyoruz.
Nasıl düzeltilir
- linux linux_kernel5.4.156, 5.10.76, 5.14.15 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| linux linux_kernel | 5.2 ≤ v < 5.4.156, 5.5 ≤ v < 5.10.76, 5.11 ≤ v < 5.14.15, 5.15 | 5.4.156, 5.10.76, 5.14.15 |
Sürümünüzü kontrol edin
Ürünü seçin ve kullandığınız sürümü yazın; sürümün etkilenen aralıkta olup olmadığını görün.
Attack Surface Management
Alan adlarınıza bağlı varlıkları, bu varlıklarda çalışan teknolojileri ve bilinen zafiyetleri tek listede görün.