CVE-2026-63894

Yüksek

Açıklama

Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: usb: gadget: f_fs: DMABUF iptalini istek tamamlanmasına karşı serileştirin ffs_epfile_dmabuf_io_complete() fonksiyonu, tamamlanan istek üzerinde usb_ep_free_request() çağrısı yapar ancak ffs_dmabuf_transfer() tarafından gönderim sırasında ayarlanan geri işaretçi olan priv->req'in serbest bırakılan belleği göstermesine neden olur. Daha sonra gelen bir FUNCTIONFS_DMABUF_DETACH ioctl veya kapatma yolundaki ffs_epfile_release() işlemi, ffs->eps_lock altında priv->req değerini hâlâ NULL olmayan olarak görür: if (priv->ep && priv->req) usb_ep_dequeue(priv->ep, priv->req); bu nedenle serbest bırakılmış bir usb_request üzerinde usb_ep_dequeue() çağrılır. dummy_hcd üzerinde sıradan çıkarma yolu yalnızca canlı bir kuyruğu tarar ve işaretçileri karşılaştırır; bu nedenle serbest bırakılan işaretçi hata vermeden okunur ve serbest bırakıldıktan sonra kullanım (use-after-free) durumunun ortaya çıkması için KASAN, FunctionFS çağrı noktasında açık bir kontrol gerektirir. SG destekli dahili UDC'lerde ise sıradan çıkarma yolu sağlanan isteğe hemen erişir: * chipidea'nın ep_dequeue() fonksiyonu container_of(req, struct ci_hw_req, req) işlemini gerçekleştirir ve kendi kilidini almadan önce hwreq->req.status değerini okur. * cdnsp'nin cdnsp_gadget_ep_dequeue() fonksiyonu önce request->status değerini okur. Tamamlamada cmpxchg() aracılığıyla priv->req'in temizlenmesi şeklindeki daha dar seçenek yarışı sona erdirmez: tamamlama işlemi eps_lock olmadan çalışır, dolayısıyla eps_lock tutan bir iptal yolu hâlâ priv->req'i NULL olmayan olarak görebilir, temizleme ve serbest bırakma yapan eşzamanlı bir tamamlama ile yarışabilir ve serbest bırakılan işaretçiyi usb_ep_dequeue()'ya aktarabilir. Serbest bırakma işlemini temizleme işine taşıyan biraz daha kapsamlı bir düzeltme gereklidir. Bu durum, yakın zamandaki usbip-vudc zamanlayıcı düzeltmesi [1] ile aynı sınıfta bir yaşam süresi yarışıdır. usb_ep_free_request() fonksiyonunu tamamlamadan çıkarıp, ffs_dmabuf_signal_done() tarafından ffs->io_completion_wq üzerinde planlanan mevcut iş yöneticisi ffs_dmabuf_cleanup() içerisine taşıyarak, geri çağırma yönünden priv->req'i değiştiren tek yerde eps_lock alınmıştır. Burada, serbest bırakmadan önce eps_lock altında priv->req temizlenir ve yalnızca priv->req hâlâ bizim isteğimizi tanımlıyorsa temizlenir (aynı ekleme üzerindeki sonraki bir ffs_dmabuf_transfer() yeni bir tane kuyruğa eklemiş olabilir). Bu işlem, mevcut dummy_hcd senkron-sıradan-çıkarma değişmezini korur: tamamlama geri çağrımı hâlâ UDC tarafından eps_lock tutulmadan çağrılır (dummy_hcd geri çağrıyı yapmadan önce kendi kilidini bırakır) ve geri çağrı artık hiçbir f_fs kilidi almaz. İptal yoluna karşı serileştirme, giriş sırasında hiçbir f_fs kilidi tutulmadan iş kuyruğundan çalışan temizleme aşamasında gerçekleşir. priv referans sayacı, kapsayıcı ffs_dmabuf_priv'i korur: ffs_dmabuf_transfer() ffs_dmabuf_get() üzerinden bir referans alır, temizleme işlemi bunu ffs_dmabuf_put() üzerinden bırakır; böylece iptal yolunun list_del + ffs_dmabuf_put işlemlerinden sonra bile priv, temizleme işlemi için canlı kalır. ffs_dmabuf_transfer() hata yolu artık usb_req'i satır içi olarak serbest bırakmaz: fence->req ve fence->ep, usb_ep_queue() öncesinde ayarlanır, böylece kuyruk işleminin başarılı olup olmadığına bakılmaksızın (hata yolu ffs_dmabuf_signal_done() tarafından planlanan) ffs_dmabuf_cleanup() serbest bırakma işlemini üstlenir. Hatalı işaretçi erişimini ortaya çıkarmak için iki FunctionFS iptal noktasında gözlemlenebilirlik kancası (usb_ep_dequeue'dan hemen önce kasan_check_byte(priv->req)) kullanılarak hem ayırma hem de kapatma yollarında dummy_hcd üzerinde KASAN ile yeniden üretilmiştir; kanca bu yamanın bir parçası değildir. Yakalanan dökümlerdeki KASAN tahsis edici / serbest bırakma yığınları aynı isteği tanımlar: dummy_alloc_request içinde tahsis, dummy_timer içinde serbest bırakma, ffs_epfile_release (kapatma) ve FUNCTIONFS_DMABUF_DETACH ioctl (ayırma) üzerinden hataya ulaşılmıştır. Yama uygulandığında, her iki yol da aynı kanca altında sessiz kalmaktadır. Hata, gerçek dağıtımlarda ayrıcalıklı gadget daemon'ına (adbd, UMS, kompozit gadget servisleri vb.) ait olan FunctionFS cihaz düğümünden tetiklenmektedir; ayrıcalıksız kullanıcı alanından veya kablo üzerindeki bir USB ana bilgisayarından erişilemez. FunctionFS bağlamaları varsayılan olarak GLOBAL_ROOT_UID'ye ayarlanmıştır, ancak dosya sistemi kök olmayan bir gadget daemon'ına uid=, gid= ve fmode= delegasyonunu destekler, bu nedenle gerçek dağıtımlarda saldırgan root yerine daha az yetkili bir servis olabilir.

ÖnemYüksek
CVSS7.8
İstismar olasılığı—
ÜrünLinux
Yayın19 Tem 2026
İlk görülme19 Tem 2026

Nasıl düzeltilir

Güncelleyin
  • Linux Linuxc872d8a065b3b499ce4c3ad168b5d34b68524f66, c7d421123b98d5e9c1c84bd9957aba36f1cbb4ca, 552dae28dbeb5f7c4fafcda43962dc46569f58a0, 2796646f6d892c1eb6818c7ca41fdfa12568e8d1 ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
Linux Linux7b07a2a7ca02a20124b552be96c5a56910795488 ≤ v < c872d8a065b3b499ce4c3ad168b5d34b68524f66, 7b07a2a7ca02a20124b552be96c5a56910795488 ≤ v < c7d421123b98d5e9c1c84bd9957aba36f1cbb4ca, 7b07a2a7ca02a20124b552be96c5a56910795488 ≤ v < 552dae28dbeb5f7c4fafcda43962dc46569f58a0, 7b07a2a7ca02a20124b552be96c5a56910795488 ≤ v < 2796646f6d892c1eb6818c7ca41fdfa12568e8d1, 6.9c872d8a065b3b499ce4c3ad168b5d34b68524f66, c7d421123b98d5e9c1c84bd9957aba36f1cbb4ca, 552dae28dbeb5f7c4fafcda43962dc46569f58a0, 2796646f6d892c1eb6818c7ca41fdfa12568e8d1

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.

Intelligence 360 paketinde

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.

CVE-2026-63894 · Linux · Dark Radar