CVE-2021-46925
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: net/smc: smc_sock yarış durumundan kaynaklanan kernel panic hatası düzeltildi smc_cdc_tx_handler() fonksiyonu smc_sock erişimi sağlamaya çalıştığında ancak smc_release() tarafından zaten serbest bırakılmış olduğunda bir çökme meydana gelir. [ 4570.695099] BUG: unable to handle page fault for address: 000000002eae9e88 [ 4570.696048] #PF: supervisor write access in kernel mode [ 4570.696728] #PF: error_code(0x0002) - not-present page [ 4570.697401] PGD 0 P4D 0 [ 4570.697716] Oops: 0002 [#1] PREEMPT SMP NOPTI [ 4570.698228] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.16.0-rc4+ #111 [ 4570.699013] Hardware name: Alibaba Cloud Alibaba Cloud ECS, BIOS 8c24b4c 04/0 [ 4570.699933] RIP: 0010:_raw_spin_lock+0x1a/0x30 <...> [ 4570.711446] Call Trace: [ 4570.711746] <IRQ> [ 4570.711992] smc_cdc_tx_handler+0x41/0xc0 [ 4570.712470] smc_wr_tx_tasklet_fn+0x213/0x560 [ 4570.712981] ? smc_cdc_tx_dismisser+0x10/0x10 [ 4570.713489] tasklet_action_common.isra.17+0x66/0x140 [ 4570.714083] __do_softirq+0x123/0x2f4 [ 4570.714521] irq_exit_rcu+0xc4/0xf0 [ 4570.714934] common_interrupt+0xba/0xe0 smc_cdc_tx_handler() smc bağlantısının varlığını kontrol etse de, smc_cdc_tx_handler() tekrar erişmeden önce smc_release() smc soketini çoktan iptal etmiş ve serbest bırakmış olabilir. smc_cdc_tx_handler() |smc_release() if (!conn) | | |smc_cdc_tx_dismiss_slots() | smc_cdc_tx_dismisser() | |sock_put(&smc->sk) <- son sock_put, | smc_sock serbest bırakıldı bh_lock_sock(&smc->sk) (panic) | smc_sock serbest bırakıldıktan sonra herhangi bir CDC mesajı almadığımızdan emin olmak için; yoldaki CDC mesajları (QP'ye gönderilmiş ancak ilgili CQE henüz alınmamış olanlar) için smc_connection üzerine bir referans sayacı (refcount) eklenmiş ve başarılı veya başarısız tüm yoldaki CDC mesajları tamamlanana kadar smc_connection serbest bırakılmayacak şekilde düzenlenmiştir. CDC mesajlarında referans sayacı kullanımı başka bir sorunu beraberinde getirmiştir: Bağlantı yok edileceği zaman, smcr_link_clear() QP'yi sıfırlayacak ve bu da CQ içindeki QP ile ilgili bekleyen tüm CQE'lerin kaldırılmasına neden olacaktır. Tüm CQE'lerin her zaman geri döneceğinden ve böylece smc_connection üzerindeki referans sayacının her zaman 0'a ulaşabileceğinden emin olmak için smc_ib_modify_qp_reset() fonksiyonu smc_ib_modify_qp_error() ile değiştirilmiştir. Ayrıca, tüm bekleyen WQE'lerin tamamlanmasını beklememiz gerektiği için smc_wr_tx_wait_no_pending_sends() içerisindeki zaman aşımı kaldırılmıştır; aksi takdirde CQE'ler işlenirken serbest bırakıldıktan sonra kullanım (use-after-free) durumuyla karşılaşılabilir. IB aygıt kaldırma rutini için, aygıttaki CQ'lar yok edilmeden önce o aygıttaki tüm QP'lerin yok edilmesini beklemek gerekir; aksi takdirde smc_connection üzerindeki referans sayacı 0'a ulaşmaz ve smc_sock serbest bırakılamaz.
Nasıl düzeltilir
- linux linux_kernel5.10.90, 5.15.13 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 | 4.11.0 ≤ v < 5.10.90, 5.11.0 ≤ v < 5.15.13 | 5.10.90, 5.15.13 |
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.