CVE-2024-50275
Təsvir
Linux kernel-də aşağıdakı zəiflik aradan qaldırılıb: arm64/sve: SVE trapları emal edilərkən köhnəlmiş CPU vəziyyətini ləğv etmək SVE traplarının idarə olunması məntiqi yadda saxlanılmış FPSIMD/SVE vəziyyətini yanlış şəkildə dəyişdirir və preemption ilə bağlı yarış şəraiti (race condition), canlı CPU vəziyyəti köhnəlmiş olsa belə (məsələn, SVE trapları aktiv olduqda), tapşırığın TIF_SVE bayrağının təyin edilmiş və TIF_FOREIGN_FPSTATE bayrağının təmizlənmiş olmasına səbəb ola bilər. Bunun, TIF_SVE təyin edildiyi halda SVE traplarının gözlənilmədiyi do_sve_acc() funksiyasından xəbərdarlıqların gəlməsinə səbəb olduğu müşahidə edilmişdir: | if (test_and_set_thread_flag(TIF_SVE)) | WARN_ON(1); /* SVE girişləri trap törətməməli idi */ Bu formada olan xəbərdarlıqlar vaxtaşırı olaraq hesabat edilmişdir, məsələn: https://lore.kernel.org/linux-arm-kernel/CA+G9fYtEGe_DhY2Ms7+L7NKsLYUomGsgqpdBj+QwDLeSg=JhGg@mail.gmail.com/ https://lore.kernel.org/linux-arm-kernel/[email protected]/ Yarış şəraiti, SVE trap idarəçisi yadda saxlanılmış FPSIMD/SVE vəziyyətini dəyişdirməzdən əvvəl və sonra, eyni CPU-da başlayıb bitmək şərtilə preemption-a məruz qaldıqda baş verə bilər, məsələn: | void do_sve_acc(unsigned long esr, struct pt_regs *regs) | { | // CPU 0-da trap; TIF_SVE təmizdir, SVE trapları aktivdir | // task->fpsimd_cpu 0-dır. | // per_cpu_ptr(&fpsimd_last_state, 0) task-dır. | | ... | | // Preempted; CPU 0-dan CPU 1-ə miqrasiya edildi. | // TIF_FOREIGN_FPSTATE təyin edildi. | | get_cpu_fpsimd_context(); | | if (test_and_set_thread_flag(TIF_SVE)) | WARN_ON(1); /* SVE girişləri trap törətməməli idi */ | | sve_init_regs() { | if (!test_thread_flag(TIF_FOREIGN_FPSTATE)) { | ... | } else { | fpsimd_to_sve(current); | current->thread.fp_type = FP_STATE_SVE; | } | } | | put_cpu_fpsimd_context(); | | // Preempted; CPU 1-dən CPU 0-a miqrasiya edildi. | // task->fpsimd_cpu hələ də 0-dır | // Əgər per_cpu_ptr(&fpsimd_last_state, 0) hələ də task-dırsa: | // - Köhnəlmiş HW vəziyyəti yenidən istifadə edilir (SVE trapları aktivdir) | // - TIF_FOREIGN_FPSTATE təmizlənir | // - İstifadəçi sahəsinə (userspace) qayıdış zamanı HW vəziyyətinin bərpası ötürülür | } Vəziyyətin canlı olmadığı və TIF_FOREIGN_FPSTATE-in təyin edildiyi halı, yadda saxlanılmış CPU vəziyyətindən ayrılmaq üçün fpsimd_flush_task_state() funksiyasını çağıraraq düzəldin. Bu, növbəti kontekst dəyişikliyinin köhnəlmiş CPU vəziyyətini yenidən istifadə etməməsini təmin edir və bunun əvəzinə TIF_FOREIGN_FPSTATE bayrağını təyin edərək, istifadəçi sahəsinə qayıtmazdan əvvəl yeni vəziyyətin yaddaşdan yenidən yüklənməsini məcburi edir.
Necə düzəltmək olar
- linux linux_kernel6.6.61, 6.11.8 və ya daha yeni versiya
Təsirlənən məhsullar
| Məhsul | Təsirlənən versiyalar | Düzəldildiyi versiya |
|---|---|---|
| linux linux_kernel | 5.13 ≤ v < 6.6.61, 6.7 ≤ v < 6.11.8, 6.12 | 6.6.61, 6.11.8 |
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.
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.