CVE-2021-47465

Orta

Təsvir

Linux nüvəsində aşağıdakı zəiflik aradan qaldırılıb: KVM: PPC: Book3S HV: idle_kvm_start_guest() funksiyasında steklərin idarə edilməsi düzəldildi 10d91611f426 ("powerpc/64s: Reimplement book3s idle code in C") commit-də kvm_start_guest() funksiyası idle_kvm_start_guest() funksiyasına çevrilib. Köhnə kod təcili stekdə (emergency stack) stek freymi ayırırdı, lakin bu freymdən heç nə saxlamaq üçün istifadə etmir və çağırıcı funksiyanın freymində də heç nə saxlamırdı. Digər tərəfdən, idle_kvm_start_guest() daha çox adi C funksiyası kimi yazılıb; o, giriş zamanı bir freym yaradır və həmçinin (ABI-ya uyğun olaraq) CR/LR-ni çağırıcının freymində saxlayır. Problem ondadır ki, təcili stekdə çağırıcı freymi mövcud deyil. Müəyyən bir CPU üçün təcili stek belə ayrılır: paca_ptrs[i]->emergency_sp = alloc_stack(limit, i) + THREAD_SIZE; Beləliklə, emergency_sp əslində müəyyən bir CPU üçün təcili stek ayırmasından sonrakı ilk ünvana işarə edir; freym yaratmaq üçün onu əvvəlcə azaltmadan yuxarıda məlumat saxlamaq olmaz. Bu, ilkin istifadəyə hazır olan freymə işarə etmək üçün başladılan adi nüvə steki paca->kstack-dən fərqlidir. idle_kvm_start_guest() backchain, CR və LR-ni saxlayır ki, bunların hamısı təcili stek ayırmasının xaricində yazılır. Daha sonra o, stek freymi yaradır və qeyri-uçucu (non-volatile) registrləri qoruyur. Təəssüf ki, yaratdığı freym qeyri-uçucuları yerləşdirmək üçün kifayət qədər böyük deyil və buna görə də qeyri-uçucu registrlərin saxlanılması da təcili stek ayırmasının xaricində yazılmaya səbəb olur. Nəticə etibarilə, biz təcili stek ayırmasından 0-24 bayt və 112-248 bayt yuxarıda olan hər hansı məlumata zərər vururuq. Təcrübədə bu, diqqətdən qaçıb, çünki təcili stekdən dərhal yuxarıdakı yaddaş təsadüfən digər stek ayırmaları — ya başqa bir CPU-nun mc_emergency_sp-si, ya da IRQ steki üçün istifadə olunub. irqstack_early_init() və emergency_stack_init() funksiyalarına çağırışların ardıcıllığına baxın. Başqa bir stekin aşağı ünvanları həmin stekin yuxarı hissəsidir və yalnız həmin stek həddindən artıq yükləndikdə istifadə olunur ki, bu da praktiki olaraq heç vaxt baş vermir — baş versəydi belə, böyük ehtimalla həmin stekin daşması səbəbindən sistem çökməyəcəkdi. Yenə də, biz başqasının stekini korlamaqla məşğul olmamalıyıq və başqa bir şeyi korlamamağımız sırf şansdır. Bunu düzəltmək üçün biz giriş zamanı mövcud r1-dən istifadə edərək CR/LR-ni çağırıcının freymində saxlayırıq, sonra təcili stekdə backchain-i mövcud stekə yönəlmiş SWITCH_FRAME_SIZE ölçülü bir freym (hansı ki, pt_regs üçün yerə malikdir) yaradırıq və sonda təcili stekdəki yeni freymə keçid edirik.

CiddilikOrta
CVSS5.5
İstismar ehtimalı—
MəhsulLinux Kernel
Dərc22 may 2024
İlk görülmə22 may 2024

Necə düzəltmək olar

Yeniləyin
  • linux linux_kernel5.4.156, 5.10.76, 5.14.15 və ya daha yeni versiya

Təsirlənən məhsullar

MəhsulTəsirlənən versiyalarDüzəldildiyi versiya
linux linux_kernel5.2 ≤ v < 5.4.156, 5.5 ≤ v < 5.10.76, 5.11 ≤ v < 5.14.15, 5.155.4.156, 5.10.76, 5.14.15

Versiyanızı yoxlayın

Məhsulu seçin və istifadə etdiyiniz versiyanı yazın; versiyanın təsirlənən aralıqda olub-olmadığını görün.

Intelligence 360 paketində

Attack Surface Management

Domenlərinizə bağlı aktivləri, onlarda işləyən texnologiyaları və məlum zəiflikləri bir siyahıda görün.

CVE-2021-47465 · Linux Kernel · Dark Radar