CVE-2023-52886
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: USB: core: hub_port_init() fonksiyonunda udev->descriptor üzerine yazılmayarak yarış durumu (race condition) düzeltildi Syzbot, sysfs.c:read_descriptors() fonksiyonunda bir sınır dışı okuma (out-of-bounds read) raporlamıştır: BUG: KASAN: slab-out-of-bounds in read_descriptors+0x263/0x280 drivers/usb/core/sysfs.c:883 Read of size 8 at addr ffff88801e78b8c8 by task udevd/5011 CPU: 0 PID: 5011 Comm: udevd Not tainted 6.4.0-rc6-syzkaller-00195-g40f71e7cd3c6 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 05/27/2023 Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0xd9/0x150 lib/dump_stack.c:106 print_address_description.constprop.0+0x2c/0x3c0 mm/kasan/report.c:351 print_report mm/kasan/report.c:462 [inline] kasan_report+0x11c/0x130 mm/kasan/report.c:572 read_descriptors+0x263/0x280 drivers/usb/core/sysfs.c:883 ... Allocated by task 758: ... __do_kmalloc_node mm/slab_common.c:966 [inline] __kmalloc+0x5e/0x190 mm/slab_common.c:979 kmalloc include/linux/slab.h:563 [inline] kzalloc include/linux/slab.h:680 [inline] usb_get_configuration+0x1f7/0x5170 drivers/usb/core/config.c:887 usb_enumerate_device drivers/usb/core/hub.c:2407 [inline] usb_new_device+0x12b0/0x19d0 drivers/usb/core/hub.c:2545 Khazhy Kumykov tarafından analiz edildiği üzere, bu hatanın nedeni read_descriptors() ve hub_port_init() arasındaki bir yarış durumudur: İlk rutin, değişmesini beklemediği udev->descriptor içindeki bir alanı kullanırken, ikincisi bu alanın üzerine yazar. Commit 45bf39f8df7f ("USB: core: Don't hold device lock while reading the "descriptors" sysfs file") öncesinde, cihaz kilitlemesi sayesinde rutinler karşılıklı olarak dışlayıcı olduğu için bu yarış durumu meydana gelemiyordu. Kilitlemenin read_descriptors() fonksiyonundan kaldırılması, sistemi bu yarış durumuna açık hale getirmiştir. Hatanın giderilmesinin en iyi yolu, udev başlatılıp kaydedildikten sonra hub_port_init()'in udev->descriptor değerini değiştirmesini engellemektir. Sürücüler, çekirdekte saklanan tanımlayıcıların (descriptors) değiştirilemez olmasını bekler; bu beklenti bozulmamalıdır. Aslında bu değişiklik çok daha önce yapılmalıydı. Bu nedenle artık hub_port_init(), okuduğu cihaz tanımlayıcısını saklamak için kullanılacak bir tamponu belirten ek bir bağımsız değişken alacaktır. (Eğer udev henüz başlatılmadıysa, tampon işaretçisi NULL olacak ve hub_port_init() cihaz tanımlayıcısını daha önce olduğu gibi udev içinde saklayacaktır.) Bu işlem, sınır dışı okumaya neden olan veri yarışını ortadan kaldırmaktadır. hub_port_init() üzerindeki değişiklikler, usb_device yapısı başlatıldıktan sonra diğer bölümlere yazmaktan kaçınma girişimi sonucu oluşan girintileme değişiklikleri nedeniyle gerçekte olduğundan daha kapsamlı görünmektedir. Benzer değişiklikler BOS tanımlayıcısını okuyan koda da uygulanmalıdır ancak bu durum daha sonra ayrı bir yama ile ele alınabilir. Bu yama, syzbot tarafından bulunan hatayı gidermek için yeterlidir.
Nasıl düzeltilir
- linux linux_kernel5.10.195, 5.15.132, 6.1.53, 6.4.16, 6.5.3 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.10.171 ≤ v < 5.10.195, 5.15.97 ≤ v < 5.15.132, 6.1.15 ≤ v < 6.1.53, 6.3 ≤ v < 6.4.16, 6.5 ≤ v < 6.5.3 | 5.10.195, 5.15.132, 6.1.53, 6.4.16, 6.5.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.
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.