CVE-2024-43834

Orta

Açıklama

Linux kernel'da aşağıdaki güvenlik açığı giderilmiştir: xdp: page_pool_destroy() fonksiyonunun geçersiz bekleme bağlamı düzeltildi Eğer sürücü bir sayfa havuzu (page pool) kullanıyorsa, page_pool_create() ile bir sayfa havuzu oluşturur. Sayfa havuzunun referans sayısı varsayılan olarak 1'dir. Bir sayfa havuzu yalnızca referans sayısı 0'a ulaştığında yok edilir. page_pool_destroy() sayfa havuzunu yok etmek için kullanılır ve referans sayısını azaltır. Bir sayfa havuzu yok edildiğinde, mem_allocator_disconnect() olan ->disconnect() çağrılır. Bu fonksiyon dahili olarak mutex_lock() işlemini gerçekleştirir. Sürücü XDP kullanıyorsa, xdp_rxq_info_reg_mem_model() ile bir bellek modeli kaydeder. Eğer bellek modeli bir sayfa havuzu ise, xdp_rxq_info_reg_mem_model() dahili olarak sayfa havuzu referans sayısını artırır. Bu durumda referans sayısı 2 olur. Bir sayfa havuzunu yok etmek için sürücünün hem page_pool_destroy() hem de xdp_unreg_mem_model() fonksiyonlarını çağırması gerekir. xdp_unreg_mem_model() dahili olarak page_pool_destroy() fonksiyonunu çağırır. Sadece page_pool_destroy() referans sayısını azaltır. Bir sürücü önce page_pool_destroy() ardından xdp_unreg_mem_model() çağırırsa, geçersiz bekleme bağlamı (invalid wait context) uyarısı alınır. Çünkü xdp_unreg_mem_model(), page_pool_destroy() fonksiyonunu rcu_read_lock() ile çağırır. page_pool_destroy() ise dahili olarak mutex_lock() işlemi yapar. Hata dökümü şu şekildedir: ============================= [ BUG: Invalid wait context ] 6.10.0-rc6+ #4 Tainted: G W ----------------------------- ethtool/1806 şurayı kilitlemeye çalışıyor: ffffffff90387b90 (mem_id_lock){+.+.}-{4:4}, konum: mem_allocator_disconnect+0x73/0x150 hata ayıklamaya yardımcı olabilecek diğer bilgiler: context-{5:5} ethtool/1806 tarafından tutulan 3 kilit: yığın geri izleme (stack backtrace): CPU: 0 PID: 1806 Comm: ethtool Tainted: G W 6.10.0-rc6+ #4 f916f41f172891c800f2fed Donanım adı: ASUS System Product Name/PRIME Z690-P D4, BIOS 0603 11/01/2021 Çağrı İzleme (Call Trace): <TASK> dump_stack_lvl+0x7e/0xc0 __lock_acquire+0x1681/0x4de0 ? _printk+0x64/0xe0 ? __pfx_mark_lock.part.0+0x10/0x10 ? __pfx___lock_acquire+0x10/0x10 lock_acquire+0x1b3/0x580 ? mem_allocator_disconnect+0x73/0x150 ? __wake_up_klogd.part.0+0x16/0xc0 ? __pfx_lock_acquire+0x10/0x10 ? dump_stack_lvl+0x91/0xc0 __mutex_lock+0x15c/0x1690 ? mem_allocator_disconnect+0x73/0x150 ? __pfx_prb_read_valid+0x10/0x10 ? mem_allocator_disconnect+0x73/0x150 ? __pfx_llist_add_batch+0x10/0x10 ? console_unlock+0x193/0x1b0 ? lockdep_hardirqs_on+0xbe/0x140 ? __pfx___mutex_lock+0x10/0x10 ? tick_nohz_tick_stopped+0x16/0x90 ? __irq_work_queue_local+0x1e5/0x330 ? irq_work_queue+0x39/0x50 ? __wake_up_klogd.part.0+0x79/0xc0 ? mem_allocator_disconnect+0x73/0x150 mem_allocator_disconnect+0x73/0x150 ? __pfx_mem_allocator_disconnect+0x10/0x10 ? mark_held_locks+0xa5/0xf0 ? rcu_is_watching+0x11/0xb0 page_pool_release+0x36e/0x6d0 page_pool_destroy+0xd7/0x440 xdp_unreg_mem_model+0x1a7/0x2a0 ? __pfx_xdp_unreg_mem_model+0x10/0x10 ? kfree+0x125/0x370 ? bnxt_free_ring.isra.0+0x2eb/0x500 ? bnxt_free_mem+0x5ac/0x2500 xdp_rxq_info_unreg+0x4a/0xd0 bnxt_free_mem+0x1356/0x2500 bnxt_close_nic+0xf0/0x3b0 ? __pfx_bnxt_close_nic+0x10/0x10 ? ethnl_parse_bit+0x2c6/0x6d0 ? __pfx___nla_validate_parse+0x10/0x10 ? __pfx_ethnl_parse_bit+0x10/0x10 bnxt_set_features+0x2a8/0x3e0 __netdev_update_features+0x4dc/0x1370 ? ethnl_parse_bitset+0x4ff/0x750 ? __pfx_ethnl_parse_bitset+0x10/0x10 ? __pfx___netdev_update_features+0x10/0x10 ? mark_held_locks+0xa5/0xf0 ? _raw_spin_unlock_irqrestore+0x42/0x70 ? __pm_runtime_resume+0x7d/0x110 ethnl_set_features+0x32d/0xa20 Bu sorunu çözmek için, rcu_read_lock() ile birlikte rhashtable_lookup() yerine rhashtable_lookup_fast() kullanılır. Burada rcu_read_lock() olmadan xa kullanımı güvenlidir. xa, mem_xa_remove() içindeki call_rcu() tarafından çağrılan __xdp_mem_allocator_rcu_free() aracılığıyla serbest bırakılır. Referans sayısı 0'a ulaşırsa, mem_xa_remove() fonksiyonu page_pool_destroy() tarafından çağrılır. xa zaten kontrol düzleminde referans sayısı mekanizması ile iyi bir şekilde korunmaktadır. Bu nedenle, page_pool_destroy() için rcu_read_lock() kaldırılması güvenlidir.

ÖnemOrta
CVSS5.5
İstismar olasılığı—
ÜrünLinux Kernel
Yayın17 Ağu 2024
İlk görülme17 Ağu 2024

Nasıl düzeltilir

Güncelleyin
  • linux linux_kernel5.4, 5.5, 6.1.103, 6.6.44, 6.10.3 ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
linux linux_kernel5.3.18 ≤ v < 5.4, 5.4.5 ≤ v < 5.5, 5.5 ≤ v < 6.1.103, 6.2 ≤ v < 6.6.44, 6.7 ≤ v < 6.10.35.4, 5.5, 6.1.103, 6.6.44, 6.10.3

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.

Intelligence 360 paketinde

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.