CVE-2026-63894

Yüksək

Təsvir

Linux nüvəsində aşağıdakı zəiflik aradan qaldırılmışdır: usb: gadget: f_fs: DMABUF ləğvinin sorğu tamamlanmasına qarşı seriyallaşdırılması ffs_epfile_dmabuf_io_complete() funksiyası tamamlanmış sorğu üzərində usb_ep_free_request() çağırır, lakin ffs_dmabuf_transfer() tərəfindən təqdimat zamanı təyin edilmiş geri-göstərici olan priv->req azad edilmiş yaddaşa işarə etməyə davam edir. Sonrakı FUNCTIONFS_DMABUF_DETACH ioctl və ya bağlanma yolundakı ffs_epfile_release() hələ də ffs->eps_lock altında priv->req-in NULL olmadığını görür: if (priv->ep && priv->req) usb_ep_dequeue(priv->ep, priv->req); beləliklə, azad edilmiş usb_request üzərində usb_ep_dequeue() çağırılır. dummy_hcd-də növbədən çıxarma yolu yalnız aktiv növbəni gəzir və göstəriciləri müqayisə edir, buna görə də azad edilmiş göstərici xəta vermədən oxunur və use-after-free halını aşkar etmək üçün KASAN FunctionFS çağırış yerində açıq şəkildə yoxlama tələb edir. SG dəstəkli daxili UDC-lərdə növbədən çıxarma yolu təmin edilən sorğunu dərhal dereference edir: * chipidea-nın ep_dequeue() funksiyası öz kilidini əldə etməzdən əvvəl container_of(req, struct ci_hw_req, req) həyata keçirir və hwreq->req.status-u oxuyur. * cdnsp-nin cdnsp_gadget_ep_dequeue() funksiyası əvvəlcə request->status-u oxuyur. Tamamlanma zamanı cmpxchg() vasitəsilə priv->req-in təmizlənməsi kimi daha dar seçim yarış şəraitini (race condition) aradan qaldırmır: tamamlanma eps_lock olmadan işləyir, buna görə də eps_lock-u saxlayan ləğv yolu hələ də priv->req-in NULL olmadığını görə bilər, onu təmizləyib azad edən eyni vaxtda baş verən tamamlanma ilə yarışa girə bilər və azad edilmiş göstəricini usb_ep_dequeue()-ya ötürə bilər. Azad etmə prosesini təmizlik işinə köçürən bir qədər daha geniş düzəliş tələb olunur. Bu, sonuncu usbip-vudc taymer düzəlişi [1] ilə eyni növ ömür dövrü yarışı (lifetime race) sinfinə aiddir. usb_ep_free_request()-i tamamlanmadan çıxarıb ffs_dmabuf_cleanup()-a (ffs->io_completion_wq üzərində ffs_dmabuf_signal_done() tərəfindən planlaşdırılan mövcud iş emalçısı) köçürməklə, callback istiqamətindən priv->req-i dəyişdirən yeganə yerdə eps_lock götürülür. Orada azad etməzdən əvvəl eps_lock altında priv->req təmizlənir və yalnız priv->req hələ də bizim sorğumuzu adlandırırsa təmizlənir (eyni qoşulmada sonrakı ffs_dmabuf_transfer() yeni bir sorğunu növbəyə almış ola bilər). Bu, mövcud dummy_hcd sinxron-növbədən-çıxarma invariantını qoruyub saxlayır: tamamlanma callback-i hələ də UDC tərəfindən eps_lock tutulmadan çağırılır (dummy_hcd callback-i çağırmazdan əvvəl öz kilidini buraxır) və callback artıq heç bir f_fs kilidi götürmür. Ləğv yoluna qarşı seriyallaşdırma, girişdə heç bir f_fs kilidi tutulmadan iş növbəsindən (workqueue) işləyən təmizlik prosesində baş verir. Priv istinad sayğacı tərkibindəki ffs_dmabuf_priv-i qoruyur: ffs_dmabuf_transfer() ffs_dmabuf_get() vasitəsilə istinad götürür, təmizlik isə ffs_dmabuf_put() vasitəsilə onu buraxır, beləliklə, ləğv yolunun list_del + ffs_dmabuf_put əməliyyatlarından sonra belə priv təmizlik üçün aktiv qalır. ffs_dmabuf_transfer() xəta yolu artıq usb_req-i sətirlər arası azad etmir: fence->req və fence->ep usb_ep_queue()-dan əvvəl təyin edilir, buna görə də növbənin uğurlu olub-olmamasından asılı olmayaraq ffs_dmabuf_cleanup() (xəta yolu ffs_dmabuf_signal_done() tərəfindən planlaşdırılır) azad etməyə sahib olur. Köhnəlmiş göstərici girişini aşkar etmək üçün iki FunctionFS ləğv yerində müşahidə hook-u (usb_ep_dequeue-dan dərhal əvvəl kasan_check_byte(priv->req)) ilə dummy_hcd-də həm ayırma (detach), həm də bağlama (close) yollarında KASAN altında təkrar istehsal edildi; hook bu yamın hissəsi deyil. Tutulan splatlardakı KASAN allocator / free stekləri eyni sorğunu müəyyən edir: dummy_alloc_request-də ayrılma, dummy_timer-də azad olma, ffs_epfile_release (bağlama) və FUNCTIONFS_DMABUF_DETACH ioctl (ayırma) vasitəsilə çatılan xəta. Yam tətbiq edildikdən sonra hər iki yol eyni hook altında səssiz qalır. Səhv FunctionFS cihaz düyünündən törəyir ki, real tətbiqlərdə bu, imtiyazlı gadget demonuna (adbd, UMS, kompozit gadget xidmətləri və s.) məxsusdur; ona imtiyazsız istifadəçi sahəsindən və ya kabeldəki USB hostundan çatmaq mümkün deyil. FunctionFS mount-ları standart olaraq GLOBAL_ROOT_UID-yə təyin edilir, lakin fayl sistemi qeyri-root gadget demonuna uid=, gid= və fmode= delegasiyasını dəstəkləyir, buna görə də real tətbiqlərdə hücumçu root-dan daha az imtiyazlı xidmət ola bilər.

CiddilikYüksək
CVSS7.8
İstismar ehtimalı—
MəhsulLinux
Dərc19 iyl 2026
İlk görülmə19 iyl 2026

Necə düzəltmək olar

Yeniləyin
  • Linux Linuxc872d8a065b3b499ce4c3ad168b5d34b68524f66, c7d421123b98d5e9c1c84bd9957aba36f1cbb4ca, 552dae28dbeb5f7c4fafcda43962dc46569f58a0, 2796646f6d892c1eb6818c7ca41fdfa12568e8d1 və ya daha yeni versiya

Təsirlənən məhsullar

MəhsulTəsirlənən versiyalarDüzəldildiyi versiya
Linux Linux7b07a2a7ca02a20124b552be96c5a56910795488 ≤ v < c872d8a065b3b499ce4c3ad168b5d34b68524f66, 7b07a2a7ca02a20124b552be96c5a56910795488 ≤ v < c7d421123b98d5e9c1c84bd9957aba36f1cbb4ca, 7b07a2a7ca02a20124b552be96c5a56910795488 ≤ v < 552dae28dbeb5f7c4fafcda43962dc46569f58a0, 7b07a2a7ca02a20124b552be96c5a56910795488 ≤ v < 2796646f6d892c1eb6818c7ca41fdfa12568e8d1, 6.9c872d8a065b3b499ce4c3ad168b5d34b68524f66, c7d421123b98d5e9c1c84bd9957aba36f1cbb4ca, 552dae28dbeb5f7c4fafcda43962dc46569f58a0, 2796646f6d892c1eb6818c7ca41fdfa12568e8d1

Versiyanızı yoxlayın

Məhsulu seçin və istifadə etdiyiniz versiyanı yazın; versiyanın təsirlənən aralıqda olub-olmadığını görün.

Intelligence 360 paketində

Attack Surface Management

Domenlərinizə bağlı aktivləri, onlarda işləyən texnologiyaları və məlum zəiflikləri bir siyahıda görün.

CVE-2026-63894 · Linux · Dark Radar