CVE-2023-52894
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: usb: gadget: f_ncm: ncm_bitrate() fonksiyonundaki potansiyel NULL ptr deref hatası düzeltildi Google dahili hata kaydı 265639009 kapsamında, aarch64 GKI 5.10.149-android13 çalıştıran bir cihazdan (henüz) yeniden üretilemeyen bir çökme raporu alınmıştır. Gördüğüm kadarıyla kaynak kodu şuradadır: https://android.googlesource.com/kernel/common/+/refs/tags/ASB-2022-12-05_13-5.10 Çağrı yığını şu şekildedir: ncm_close() -> ncm_notify() -> ncm_do_notify() Çökme ise burada gerçekleşmektedir: ncm_do_notify+0x98/0x270 Kod: 79000d0b b9000a6c f940012a f9400269 (b9405d4b) Bu kısmın şu şekilde disassemble edildiğine inanıyorum (ARM assembly bilmiyorum ancak bana yeterince mantıklı görünüyor...): // muhtemelen event->wLength'e (struct usb_cdc_notification'ın 6. ofsetinde) yapılan halfword (16-bit) depolama 0B 0D 00 79 strh w11, [x8, #6] // muhtemelen req->Length'e (struct usb_request'in 8. ofsetinde) yapılan word (32-bit) depolama 6C 0A 00 B9 str w12, [x19, #8] // x10 (NULL), geçerli işaretçi x9'un 0. ofsetinden burada okundu // Kanımca 'cdev->gadget' okunuyor ve NULL dönüyor // gadget gerçekten de struct usb_composite_dev'in 0. ofsetindedir 2A 01 40 F9 ldr x10, [x9] // struct usb_request'in 0. ofsetindeki req->buf işaretçisi yükleniyor 69 02 40 F9 ldr x9, [x19] // x10 null, çökme meydana geliyor, cdev->gadget->max_speed değerini okuma girişimi olduğu görülüyor 4B 5D 40 B9 ldr w11, [x10, #0x5c] Bu durum, ncm_do_notify() içerisindeki NCM_NOTIFY_SPEED kod parçasıyla örtüşüyor gibi görünmektedir: event->wLength = cpu_to_le16(8); req->length = NCM_STATUS_BYTECOUNT; /* SPEED_CHANGE verileri bit/sn cinsinden yukarı/aşağı hızlardır */ data = req->buf + sizeof *event; data[0] = cpu_to_le32(ncm_bitrate(cdev->gadget)); Yazmaçlar ve NULL ptr deref çökme ofseti üzerindeki analizim (Sanal adres 000000000000005c konumunda çekirdek NULL pointer dereference hatası işlenemedi) şu satır yürütülürken 'cdev->gadget' değerinin NULL olması nedeniyle çökmeyi güçlü bir şekilde desteklemektedir: data[0] = cpu_to_le32(ncm_bitrate(cdev->gadget)); bu işlem şunu çağırır: ncm_bitrate(NULL) o da şunu çağırır: gadget_is_superspeed(NULL) bu da şunu okur: ((struct usb_gadget *)NULL)->max_speed ve panik oluşur. Doğru sayıyorsam, max_speed ofseti gerçekten de 0x5C'dir. (struct work_struct içinde 16 baytlık bir GKI KABI rezervasyonu olduğunu unutmayın) Tüm bunların nasıl çalışması gerektiği benim için hiç net değil... ancak 0 döndürmek, paniğe yol açmaktan çok daha iyidir...
Nasıl düzeltilir
- linux linux_kernel4.14.304, 4.19.271, 5.4.230, 5.10.165, 5.15.90, 6.1.8 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 | v < 4.14.304, 4.15 ≤ v < 4.19.271, 4.20 ≤ v < 5.4.230, 5.5 ≤ v < 5.10.165, 5.11 ≤ v < 5.15.90, 5.16 ≤ v < 6.1.8, 6.2 | 4.14.304, 4.19.271, 5.4.230, 5.10.165, 5.15.90, 6.1.8 |
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.