CVE-2024-26939

Yüksək

Təsvir

Linux kernel-də aşağıdakı zəiflik həll edilmişdir: drm/i915/vma: retire yarışına qarşı məhv etmə zamanı UAF-ı düzəlt Obyekt sazlama alətləri, boş olduğu güman edilən GT-ni park edərkən hələ də aktiv olan i915 VMA obyektini azad etməyə qanunsuz cəhdlər barədə arabir məlumat verirdilər. [161.359441] ODEBUG: free active (active state 0) object: ffff88811643b958 object type: i915_active hint: __i915_vma_active+0x0/0x50 [i915] [161.360082] WARNING: CPU: 5 PID: 276 at lib/debugobjects.c:514 debug_print_object+0x80/0xb0 ... [161.360304] CPU: 5 PID: 276 Comm: kworker/5:2 Not tainted 6.5.0-rc1-CI_DRM_13375-g003f860e5577+ #1 [161.360314] Hardware name: Intel Corporation Rocket Lake Client Platform/RocketLakeS UDIMM 6L RVP, BIOS RKLSFWI1.R00.3173.A03.2204210138 04/21/2022 [161.360322] Workqueue: i915-unordered __intel_wakeref_put_work [i915] [161.360592] RIP: 0010:debug_print_object+0x80/0xb0 ... [161.361347] debug_object_free+0xeb/0x110 [161.361362] i915_active_fini+0x14/0x130 [i915] [161.361866] release_references+0xfe/0x1f0 [i915] [161.362543] i915_vma_parked+0x1db/0x380 [i915] [161.363129] __gt_park+0x121/0x230 [i915] [161.363515] ____intel_wakeref_put_last+0x1f/0x70 [i915] Müəyyən edilmişdir ki, bu, başqa bir thread __active_retire() köməkçisi daxilində VMA-nı deaktiv edərkən, VMA-nın aktiv sayğacı artıq 0-a endirildikdən sonra, lakin VMA obyektinin deaktivasiyası obyekt sazlama alətinə bildirilməzdən əvvəl baş verir. Bu yarışın qarşısını i915_active_fini()-i __active_retire() ilə ref->tree_lock vasitəsilə ardıcıllaşdırmaqla almaq olardı, lakin bu, VMA-nın istifadəsini dayandırmazdı, məsələn, __active_retire()-in sonunda çağırılan __i915_vma_retire() tərəfindən, həmin VMA artıq i915_active_fini()-dən qayıdışda paralel i915_vma_destroy() tərəfindən azad edildikdən sonra. Buna görə də, problemi i915_active-də deyil, VMA səviyyəsində düzəltmək lazımdır. __i915_vma_parked() __gt_park()-dan GT-nin wakeref-inin son buraxılışında çağırıldığı üçün, problem GT wakeref-ini __active_retire() tamamlanana qədər kifayət qədər uzun müddət saxlamaqla, həmin wakeref buraxılmadan və GT park edilməzdən əvvəl həll edilə bilər. Hesab edirəm ki, problem d93939730347 commit-i ("drm/i915: Remove the vma refcount") tərəfindən təqdim edilmişdir; bu commit i915_active_fini() çağırışını silinmiş VMA kref-inin son buraxılışında çağırılan i915_vma_release()-dən GT wakeref-inin son buraxılışında çağırılan i915_vma_parked() emal yoluna köçürmüşdür. Lakin onun obyekt sazlama alətinə görünməsi i915_active-də iki həftə sonra e92eb246feb9 commit-i ("drm/i915/active: Fix missing debug object activation") ilə düzəldilmiş baq tərəfindən gizlədilmişdi. Sorğu ilə əlaqəli VMA özü GT wakeref-i əldə etmir. Əvəzində o, VM-i ilə əlaqəli GT üçün sorğunun aktiv intel_context-i tərəfindən birbaşa saxlanılan wakeref-dən, və dolayısı ilə, əgər mühərrik VMA-nın VM-i ilə eyni GT-yə aiddirsə, həmin intel_context-in mühərrik wakeref-indən asılıdır. Bu wakeref-lər VMA deaktivasiyasına asinxron şəkildə buraxılır. Problemi VMA-nın GT-si üçün onu aktivləşdirərkən wakeref əldə etməklə və həmin wakeref-i yalnız VMA deaktiv edildikdən sonra buraxmaqla düzəldin. Lakin qlobal GTT-ni bu emal yolundan çıxarın, əks halda GPU heç vaxt boş vəziyyətə keçməz. __i915_vma_retire() atomik kontekstlərdən çağırıla bildiyi üçün wakeref buraxılışının asinxron variantından istifadə edin. Həmçinin, dairəvi kilidləmə asılılığının qarşısını almaq üçün, hər ikisi lazım olduqda wakeref-i VM mutex-indən əvvəl əldə etməyə diqqət yetirin. v7: Aşağıdakılar üçün əsaslandırma ilə inline şərhlər əlavə edin: - intel_gt_pm_get/put()-un izlənməyən variantlarından istifadə (Nirmoy), - _put()-un asinxron variantından istifadə, - qlobal GTT halında wakeref-in əldə edilməməsi, - həmişə ilk wakeref-in vm->mutex-dən kənarda əldə edilməsi. v6: __i915_vma_active/retire() callback-ləri ardıcıllaşdırılmadığı üçün struct i915_vma daxilində wakeref izləmə handle-ı saxlamaq təhlükəsiz deyil və bunun üçün başqa yaxşı yer yoxdur. intel_gt_pm_get/put_async()-in izlənməyən variantlarından istifadə edin. v5: Commit təsviri boyunca "tile"-ı "GT" ilə əvəz edin (Rodrigo), - ---kəsilmiş---

CiddilikYüksək
CVSS7.8
İstismar ehtimalı—
MəhsulLinux Kernel
Dərc1 may 2024
İlk görülmə1 may 2024

Necə düzəltmək olar

Yeniləyin
  • linux linux_kernel6.1.88, 6.6.29, 6.8.3 və ya daha yeni versiya

Təsirlənən məhsullar

MəhsulTəsirlənən versiyalarDüzəldildiyi versiya
linux linux_kernel5.19 ≤ v < 6.1.88, 6.2 ≤ v < 6.6.29, 6.7 ≤ v < 6.8.3, 6.96.1.88, 6.6.29, 6.8.3

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-2024-26939 · Linux Kernel · Dark Radar