CVE-2026-90001
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: HID: bpf: struct_ops imha yolunda cihaz referans serbest bırakma işlemini serileştirin __hid_bpf_ops_destroy_device() ve hid_bpf_unreg() aynı kayıt referansı üzerinde yarış durumuna girebilir, bu da struct hid_device yapısının iki kez serbest bırakılmasına (double-put) ve hid_destroy_device() hala kullanırken belleğinin boşaltılmasına neden olabilir. Kaldırma/NULL kararını hdev->bpf.prog_list_lock altında serileştirerek her bir kayıt referansının tam olarak tek bir yol tarafından serbest bırakılması sağlanmıştır: unreg işlemi kilit altında ops->hdev değerini yeniden kontrol eder ve imha yolu bunu zaten temizlemişse serbest bırakmadan döner; tüm put_device() çağrıları kilit bırakıldıktan sonra gerçekleşir, bu güvenlidir çünkü eşzamanlı bir unreg işlemi kilit altında ops->hdev == NULL olduğunu gözlemler. Arka Plan: Her başarılı ekleme (hid_bpf_ops_reg) bir cihaz referansı (hid_get_device()) edinir. İki farklı yol bunu serbest bırakabilir: - Cihaz imhası: hid_destroy_device() -> hid_bpf_destroy_device() -> __hid_bpf_ops_destroy_device(); bu işlem rcu_read_lock() altında hdev->bpf.prog_list üzerinden geçer ve eklenen her program için bir referansı düşürür; - BPF bağlantı serbest bırakma: bpf harita silme (BPF_F_LINK olmadan) senkron olarak st_ops->unreg() -> hid_bpf_unreg() fonksiyonlarını çağırır ve kendi kaydı için olan referansı düşürür. Koordinasyon el sıkışması (imha tarafında e->hdev = NULL'a karşı unreg tarafında "if (!hdev) return") bir TOCTOU kontrolüdür: iki yol farklı kilit alanlarında (rcu_read_lock ile prog_list_lock) çalışır, bu nedenle eşzamanlı bir unreg işlemi ops->hdev değerini NULL olmayan olarak okuyabilir, prog_list_lock üzerinde bekleyebilir ve ardından imha taraması yürütülürken devam edebilir - böylece her iki yol da aynı referansı düşürür. Referans sayacı meşru olarak sıfıra ulaşır (her azaltma işlemi bireysel olarak geçerlidir), dolayısıyla herhangi bir refcount_t doygunluğu tetiklenmez: cihaz, taşıma katmanı hala hid_destroy_device() içerisindeyken basitçe serbest bırakılır ve sonraki söküm işlemleri boşaltılmış belleğe erişir. Düzeltme, her iki tarafta kaldırma/NULL kararını prog_list_lock altında serileştirir ve imha tarafındaki put işlemlerini kilidin dışına taşır. Kilit tutulurken, ops->hdev üzerindeki düz okuma/yazma işlemleri yeterlidir; yamayı minimumda tutmak için READ_ONCE/WRITE_ONCE eklenmemiştir. Kilitlenmemiş okuma güvenliği: hid_bpf_unreg() başlangıcındaki ops->hdev kilitlenmemiş okuması serbest bırakılmış bir cihaza erişemez, çünkü unreg yolunun kendisi hala bu kaydın referansını tutmaktadır (yalnızca kilit bırakıldıktan sonra kendi hid_put_device() işlemiyle serbest bırakılır) ve ops->hdev değerini zaten temizlemiş olan bir imha taraması, kilit içi yeniden kontrolün herhangi bir put işlemi yapmadan erken dönmesini sağlar. İki yoldan en fazla biri her bir kayıt referansını serbest bırakır.
Nasıl düzeltilir
- Linux Linux401359684620145be710de97b87e1a47abfe1459, c7f927aa8b55008ed5ea0814313d5dad771dcf3c, bfb7939788f3c8dd080a4dd81e38d625b35d194e, 9cdc7e6dc7a99ad7311ad5e7c145f2b9ce4e24b0 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| Linux Linux | ebc0d8093e8c97de459615438edefad1a4ac352c ≤ v < 401359684620145be710de97b87e1a47abfe1459, ebc0d8093e8c97de459615438edefad1a4ac352c ≤ v < c7f927aa8b55008ed5ea0814313d5dad771dcf3c, ebc0d8093e8c97de459615438edefad1a4ac352c ≤ v < bfb7939788f3c8dd080a4dd81e38d625b35d194e, ebc0d8093e8c97de459615438edefad1a4ac352c ≤ v < 9cdc7e6dc7a99ad7311ad5e7c145f2b9ce4e24b0, 6.11 | 401359684620145be710de97b87e1a47abfe1459, c7f927aa8b55008ed5ea0814313d5dad771dcf3c, bfb7939788f3c8dd080a4dd81e38d625b35d194e, 9cdc7e6dc7a99ad7311ad5e7c145f2b9ce4e24b0 |
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.