CVE-2022-49215
Açıklama
Linux kernel'de aşağıdaki güvenlik açığı giderilmiştir: xsk: soket kapatma sırasındaki yarış durumu düzeltildi xsk soket kapatma kodunda, bir NULL pointer dereference hatasına yol açabilen yarış durumu (race condition) düzeltildi. xsk_unbind_dev() içindeki mevcut xsk ayırma kodu, önce xs->state değerini XSK_UNBOUND olarak ayarlayarak başlar, ardından xs->dev değerini NULL yapar ve daha sonra synchronize_net() kullanarak herhangi bir NAPI işleminin sonlanmasını bekler. Bundan sonra, serbest bırakma kodu soket durumunu kapatmaya ve tahsis edilen belleği boşaltmaya başlar. BUG: kernel NULL pointer dereference, address: 00000000000000c0 PGD 8000000932469067 P4D 8000000932469067 PUD 0 Oops: 0000 [#1] PREEMPT SMP PTI CPU: 25 PID: 69132 Comm: grpcpp_sync_ser Tainted: G I 5.16.0+ #2 Hardware name: Dell Inc. PowerEdge R730/0599V5, BIOS 1.2.10 03/09/2015 RIP: 0010:__xsk_sendmsg+0x2c/0x690 [...] RSP: 0018:ffffa2348bd13d50 EFLAGS: 00010246 RAX: 0000000000000000 RBX: 0000000000000040 RCX: ffff8d5fc632d258 RDX: 0000000000400000 RSI: ffffa2348bd13e10 RDI: ffff8d5fc5489800 RBP: ffffa2348bd13db0 R08: 0000000000000000 R09: 00007ffffffff000 R10: 0000000000000000 R11: 0000000000000000 R12: ffff8d5fc5489800 R13: ffff8d5fcb0f5140 R14: ffff8d5fcb0f5140 R15: 0000000000000000 FS: 00007f991cff9400(0000) GS:ffff8d6f1f700000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00000000000000c0 CR3: 0000000114888005 CR4: 00000000001706e0 Call Trace: <TASK> ? aa_sk_perm+0x43/0x1b0 xsk_sendmsg+0xf0/0x110 sock_sendmsg+0x65/0x70 __sys_sendto+0x113/0x190 ? debug_smp_processor_id+0x17/0x20 ? fpregs_assert_state_consistent+0x23/0x50 ? exit_to_user_mode_prepare+0xa5/0x1d0 __x64_sys_sendto+0x29/0x30 do_syscall_64+0x3b/0xc0 entry_SYSCALL_64_after_hwframe+0x44/0xae Mevcut kodda iki sorun bulunmaktadır. Birincisi, tüm kullanıcıların soketi kullanmayı bırakmasını beklemeden xs->dev değerinin NULL olarak ayarlanması doğru değildir. Veri düzlemi fonksiyonları olan xsk_poll(), xsk_sendmsg() ve xsk_recvmsg()'ye girişlerin tamamı, xs->state değerinin XSK_BOUND durumda olup olmadığını kontrol eden bir test ile korunmaktadır ve değilse hemen geri döner. Ancak bir işlem bu testi geçmiş olabilir fakat henüz kodda xs->dev'in kullanıldığı noktaya ulaşmamış olabilir. Bu ara sürede, xsk_unbind_dev() işlemini yürüten ikinci bir işlem xs->dev değerini NULL yapmış olabilir ve bu da ilk işlem için çökmeye yol açacaktır. Buradaki çözüm, artık kullanılmadığı için bu NULL atamasından kurtulmaktır. 42fddcc7c64b ("xsk: use state member for socket synchronization") commit'inden önce xs->dev, işlemlerin veri düzlemi fonksiyonlarına girmesini sağlayan kapıcıydı; ancak söz konusu commit ile yerini xs->state değişkenine bıraktı. İkinci sorun ise synchronize_net()'in xsk_poll(), xsk_sendmsg() veya xsk_recvmsg() içindeki herhangi bir işlemin tamamlanmasını beklememesidir; bu da güvendikleri durumun vaktinden önce temizlenebileceği anlamına gelir. Bu durum, notifier çağrıldığında (örneğin sürücü kaldırılırken), çünkü xsk_unbind_dev() kullandığından meydana gelebilir. Bu sorun, RCU kritik bölgesini sadece ndo_xsk_wakeup'den yukarıda belirtilen fonksiyonların tamamına genişleterek çözülmüştür; böylece hem xs->state == XSK_BOUND testi hem de xs üyelerinin son kullanımı RCU kritik bölümü tarafından kapsanmış olur. Bu, synchronize_net() tamamlandığında, xsk_poll(), xsk_sendmsg() veya xsk_recvmsg() çalıştıran hiçbir işlemin kalmayacağını ve durumun güvenli bir şekilde temizlenebileceğini garanti eder. Uyuyabilecek fonksiyonlar kullandığı için skb xmit yolu için RCU kilidinin bırakılması gerektiğine dikkat edilmelidir. Bu nedenle, arasında diğer şeylerle birlikte aynı anda notifier üzerinden yürütülen bir xsk_unbind_dev() işleminin bulunabileceği skb xmit kodunu koruyan mutex'i aldıktan sonra xs->state değerini yeniden test etmemiz gerekmektedir.
Nasıl düzeltilir
- linux linux_kernel5.15.33, 5.16.19, 5.17.2 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 | 5.4 ≤ v < 5.15.33, 5.16 ≤ v < 5.16.19, 5.17 ≤ v < 5.17.2 | 5.15.33, 5.16.19, 5.17.2 |
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.