CVE-2021-47069

Yüksək

Təsvir

Linux kernelində aşağıdakı zəiflik aradan qaldırılmışdır: ipc/mqueue, msg, sem: stack istinadının etibarlılıq müddəti bitdikdən sonra ona istinad etməkdən çəkinin do_mq_timedreceive wq_sleep funksiyasını stack-də lokal ünvanla çağırır. Göndərən (do_mq_timedsend) bu ünvandan sonradan pipelined_send funksiyasını çağırmaq üçün istifadə edir. Bu, çox çətin tetiklənən yarış vəziyyətinə (race) gətirib çıxarır ki, burada do_mq_timedreceive çağırışı qayıda bilər və do_mq_timedsend etibarsız ünvana istinad etməklə qalır, nəticədə aşağıdakı crash baş verir: RIP: 0010:wake_q_add_safe+0x13/0x60 Call Trace: __x64_sys_mq_timedsend+0x2a9/0x490 do_syscall_64+0x80/0x680 entry_SYSCALL_64_after_hwframe+0x44/0xa9 RIP: 0033:0x7f5928e40343 Yarış vəziyyəti belə baş verir: 1. do_mq_timedreceive wq_sleep funksiyasını funksiya stack-ində yerləşən `struct ext_wait_queue` ünvanı ilə çağırır (burada `ewq_addr` kimi adlandırılır) - stack üzərinə yazılmayana qədər etibarlı `struct ext_wait_queue *` saxlayır. 2. `ewq_addr` wq_add funksiyasında info->e_wait_q[RECV].list siyahısına əlavə olunur və do_mq_timedsend onu wq_get_first_waiter(info, RECV) vasitəsilə alaraq __pipelined_op funksiyasını çağırır. 3. Göndərən __pipelined_op::smp_store_release(&this->state, STATE_READY) çağırır. Yarış pəncərəsi buradan başlayır. (`this` burada `ewq_addr`-dir.) 4. Əgər qəbuledici indi do_mq_timedreceive::wq_sleep daxilində oyanarsa, `state == STATE_READY` vəziyyətini görəcək və dövrədən çıxacaq. 5. do_mq_timedreceive qayıdır və `ewq_addr` artıq `struct ext_wait_queue *` olmasına zəmanət verilmir, çünki o, do_mq_timedreceive-in stack-ində idi. (Ünvan başqa funksiya ona toxunana qədər üzərinə yazılmaya bilər, yəni qeyri-müəyyən müddət ərzində qala bilər.) 6. do_mq_timedsend::__pipelined_op() hələ də `ewq_addr`-in `struct ext_wait_queue *` olduğuna inanır və ondan wake_q_add_safe çağırışına ötürüləcək task_struct tapmaq üçün istifadə edir. `ewq_addr`-in üzərinə hələ heç nə yazılmadığı uğurlu halda, `ewq_addr->task` düzgün task_struct-dır. Uğursuz halda, __pipelined_op::wake_q_add_safe qəbuledicinin task_struct-ı kimi saxta ünvan alır və crash baş verir. do_mq_timedsend::__pipelined_op() STATE_READY təyin etdikdən sonra `this`-ə müraciət etməməlidir, çünki qəbuledici tərəf artıq qayıtmaqda sərbəstdir. __pipelined_op funksiyasını dəyişdirin ki, qəbuledicinin stack-ində yerləşən `this`-ə müraciət etmək əvəzinə get_task_struct tərəfindən qaytarılan qəbuledicinin task_struct-ı üzərində wake_q_add_safe çağırsın. Manfredin qeyd etdiyi kimi, yarış vəziyyəti potensial olaraq ipc/msg.c::expunge_all və ipc/sem.c::wake_up_sem_queue_prepare funksiyalarında da mövcuddur. Onları da eyni şəkildə düzəldin.

CiddilikYüksək
CVSS7.8
İstismar ehtimalı—
MəhsulLinux Kernel
Dərc1 mar 2024
İlk görülmə1 mar 2024

Necə düzəltmək olar

Yeniləyin
  • linux linux_kernel5.10.40, 5.12.7 və ya daha yeni versiya

Təsirlənən məhsullar

MəhsulTəsirlənən versiyalarDüzəldildiyi versiya
linux linux_kernel5.6 ≤ v < 5.10.40, 5.11 ≤ v < 5.12.7, 5.135.10.40, 5.12.7

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-47069 · Linux Kernel · Dark Radar