CVE-2026-90000
Açıklama
Linux çekirdeğinde aşağıdaki güvenlik açığı giderilmiştir: HID: rmi: yetersiz boyutlu RMI raporları ile oluşan sınır dışı (OOB) erişimi düzeltildi hid-rmi sürücüsü, writeReport/readReport tamponunun boyutunu herhangi bir alt sınır olmaksızın tamamen cihaz tarafından sağlanan rapor tanımlayıcıya göre belirler: data->input_report_size = hid_report_len(input_report); data->output_report_size = hid_report_len(output_report); alloc_size = data->output_report_size + data->input_report_size; data->writeReport = devm_kzalloc(&hdev->dev, alloc_size, GFP_KERNEL); data->readReport = data->writeReport + data->output_report_size; ancak daha sonra bu tampona sabit ofsetlerle okuma ve yazma işlemleri gerçekleştirir. 1 baytlık çıktı ve 1 baytlık girdi raporu beyan eden bir cihazda hid_report_len() her biri için 2 döndürür; böylece alloc_size 4 olurken, probe sırasında rmi_input_configured() aracılığıyla koşulsuz olarak ulaşılan rmi_set_page() fonksiyonu writeReport[4]'e veri yazar ve rmi_hid_read_block() fonksiyonu writeReport[0..5] arasına veri yazar. readReport, writeReport + output_report_size konumunda yer aldığı için bu yazma işlemleri aynı zamanda bir sonraki yanıtın ayrıştırıldığı pencereyi de bozar. Okuma yolu daha kritiktir: kopyalama uzunluğu, cihaz tarafından doldurulan ve 255'e kadar çıkabilen readReport[1] değerinden gelir ve kopyalama işlemi input_report_size dikkate alınmaksızın &readReport[2] adresinden başlar; bu durum tahsis edilen alanın sonuna taşarak komşu slab nesnelerine ulaşır. Bunun için yanıltıcı bir cihaza bile gerek yoktur; rmi_f01_probe() sabit 21 baytlık bir kayıt okuması yapar, dolayısıyla 23 bayttan küçük bir girdi raporu beyan eden herhangi bir cihaz, doğru cevap verse bile sınır dışı okuma yapar. Bu baytlar, RMI çekirdeğinin işlem yaptığı kayıt değerleri haline gelir: rmi_f01_probe() bunları ürün kimliği olarak çekirdek günlüğüne yazdırır ve aynı isimdeki mod 0444 sysfs özniteliği üzerinden dışa aktarır; ayrıca rmi_driver_set_irq_bits() bunları kesme maskesi olarak cihaza geri gönderir. Böylece yetersiz boyutlu bir rapor tanımlayıcısı, yığın içeriğini hem ayrıcalıksız kullanıcı alanına hem de cihazın kendisine sızdırır. Yazma yolunda da herhangi bir sınır bulunmamaktadır: rmi_hid_write_block() sınırsız bir len değerini &writeReport[4] adresine kopyalar ve probe sırasında bir cihazın tetikleyebileceği en büyük çağrıcı, uzunluğu cihazın Sayfa Tanımlama Tablosunda (Page Description Table) beyan ettiği kesme kaynağı sayılarından türetilen rmi_driver_set_irq_bits() fonksiyonudur. Son olarak, okuma döngüsü sıfır uzunluklu bir yanıtta sonlandırılamaz: böyle bir yanıt hiçbir şeyi kopyalamaz ve ne bytes_read ne de bytes_needed değerlerini ilerletmez; bir yanıt geldiği için bir saniyelik wait_event_timeout() da tetiklenmez. Dolayısıyla sonsuza dek 0 yanıtı veren bir cihaz, page_mutex tutulu haldeyken probe işçisi içindeki döngünün çalışmaya devam etmesine neden olur. Her yanıt görevi uyandırdığı için khungtaskd bunu fark etmez. Sürücünün oluşturduğu yapı için çok küçük olan raporlar —yazma raporları için 6 çıktı baytı ve okuma el sıkışması için 3 girdi baytı— probe sırasında reddedilir, yazma ve okuma kopyalamaları cihazın beyan ettiği rapor boyutlarına sabitlenir ve sıfır uzunluklu bir yanıt hata olarak değerlendirilir. Bu şekilde reddedilen bir cihaz, RMI rapor kimliklerini hiç taşımayan bir cihaz gibi sıradan bir HID cihazı olarak başlatılır. Bu yolda RMI_DEVICE değeri device_flags içinde ayarlı bırakılmamalıdır, çünkü rmi_input_configured() o zaman RMI kurulumunu çalıştıracak ve az önce tahsisi atlanan writeReport tamponuna yazan rmi_set_page() fonksiyonuna ulaşacaktır. Bit önceden ayarlanmış olabilir: rmi_probe(), rapor kontrollerinden önce id->driver_data'yı device_flags'e kopyalar ve new_id sysfs özniteliği üzerinden yapılan bir bağlama işlemi, RMI_DEVICE (BIT(0)) ayarlanmış bir driver_data sağlayabilir. Driver_data'nın kopyalandığı yerde bit temizlenerek RMI_DEVICE'ın tam olarak "bu probe raporları doğruladı" anlamına gelmesi sağlanır; bu yamadan önceki üç başlangıç atlaması da kapsanmıştır. Hata yolu, çıkışta RMI_READ_DATA_PENDING bayrağını da temizler, çünkü döngünün başındaki bekleme işlemi bu bayrağı test eder: bunun ayarlı kalması, sonraki her wait_event_timeout() çağrısının eski yanıtta hemen dönmesine neden olacak ve cihazın geri kalan ömrü boyunca okuma yolunu devre dışı bırakacaktır. Sabitleme işlemi çalışan donanımlarda gerilemeye neden olmaz: okuma döngüsü zaten halleder...
Nasıl düzeltilir
- Linux Linuxfba600d824597b2a894ecae72fc422c2b8c08f8c, 056ef8e6700b8b6ca11453a9d4bfb1b868a5cd88, 183da103022ec11af55ba9951d2cc171fb6c836b, a8be8bbf0952bb7ff46636ead1896769c381fe55, ab2958e0c94edd63315dd14dc548874cc63a4043, f4cb9c4556dcb593e66dbb855179dbd351dbb053, 48934c2927414a37a7fadeb6091113177c0b2038, 4956993bb3befdf791d71a4952d8d13bcfd44c7b ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| Linux Linux | 9fb6bf02e3ad04c20edb8e46536ce3eeda32c736 ≤ v < fba600d824597b2a894ecae72fc422c2b8c08f8c, 9fb6bf02e3ad04c20edb8e46536ce3eeda32c736 ≤ v < 056ef8e6700b8b6ca11453a9d4bfb1b868a5cd88, 9fb6bf02e3ad04c20edb8e46536ce3eeda32c736 ≤ v < 183da103022ec11af55ba9951d2cc171fb6c836b, 9fb6bf02e3ad04c20edb8e46536ce3eeda32c736 ≤ v < a8be8bbf0952bb7ff46636ead1896769c381fe55, 9fb6bf02e3ad04c20edb8e46536ce3eeda32c736 ≤ v < ab2958e0c94edd63315dd14dc548874cc63a4043, 9fb6bf02e3ad04c20edb8e46536ce3eeda32c736 ≤ v < f4cb9c4556dcb593e66dbb855179dbd351dbb053, 9fb6bf02e3ad04c20edb8e46536ce3eeda32c736 ≤ v < 48934c2927414a37a7fadeb6091113177c0b2038, 9fb6bf02e3ad04c20edb8e46536ce3eeda32c736 ≤ v < 4956993bb3befdf791d71a4952d8d13bcfd44c7b, 3.16 | fba600d824597b2a894ecae72fc422c2b8c08f8c, 056ef8e6700b8b6ca11453a9d4bfb1b868a5cd88, 183da103022ec11af55ba9951d2cc171fb6c836b, a8be8bbf0952bb7ff46636ead1896769c381fe55, ab2958e0c94edd63315dd14dc548874cc63a4043, f4cb9c4556dcb593e66dbb855179dbd351dbb053, 48934c2927414a37a7fadeb6091113177c0b2038, 4956993bb3befdf791d71a4952d8d13bcfd44c7b |
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.