CVE-2024-26939

Yüksek

Açıklama

Linux çekirdeğinde aşağıdaki güvenlik açığı giderilmiştir: drm/i915/vma: imha ve emekliye ayırma yarışı sırasında oluşan UAF hatası düzeltildi Nesne hata ayıklama araçları, boşta olduğu düşünülen bir GT park edilirken, hala aktif olan bir i915 VMA nesnesini serbest bırakmaya yönelik düzensiz yasadışı girişimler raporluyordu. [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/RocketLake S 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] Bu durumun; başka bir iş parçacığının, VMA'nın aktif sayacı zaten 0'a düşürüldükten sonra ancak VMA nesnesinin devre dışı kalması nesne hata ayıklama aracına bildirilmeden önce, __active_retire() yardımcı fonksiyonu içinde VMA'yı devre dışı bıraktığında meydana geldiği tespit edilmiştir. i915_active_fini()'yi ref->tree_lock üzerinden __active_retire() ile seri hale getirerek bu yarışı önleyebilirdik, ancak bu durum VMA'nın kullanılmasını engellemezdi; örneğin, eşzamanlı bir i915_vma_destroy() çağrısının i915_active_fini()'den dönüp VMA'yı çoktan serbest bırakmış olması durumunda, __active_retire()'ın sonunda çağrılan __i915_vma_retire() tarafından VMA hala kullanılabilirdi. Bu nedenle sorunu i915_active seviyesinde değil, VMA seviyesinde çözmemiz gerekir. __i915_vma_parked(), GT'nin wakeref'inin son kez bırakılmasıyla __gt_park() üzerinden çağrıldığından, sorun, wakeref serbest bırakılmadan ve GT park edilmeden önce __active_retire()'ın tamamlanması için GT wakeref'inin yeterince uzun süre tutulmasıyla giderilebilir. Sorunun, i915_active_fini() çağrısını kaldırılan VMA kref'inin son bırakılışında çağrılan i915_vma_release()'dan alıp, GT wakeref'inin son bırakılışında çağrılan i915_vma_parked() işlem yoluna taşıyan d93939730347 ("drm/i915: Remove the vma refcount") commit'i ile ortaya çıktığına inanıyorum. Ancak, bunun nesne hata ayıklama aracı üzerindeki görünürlüğü, iki hafta sonra e92eb246feb9 ("drm/i915/active: Fix missing debug object activation") commit'i ile düzeltilen i915_active içindeki bir hata nedeniyle bastırılmıştı. Bir istekle ilişkili bir VMA, kendi başına bir GT wakeref edinmez. Bunun yerine, isteğin aktif intel_context'i tarafından VM'si ile ilişkili bir GT için doğrudan tutulan bir wakeref'e ve eğer motor VMA'nın VM'si ile aynı GT'ye aitse dolaylı olarak o intel_context'in motor wakeref'ine bağlıdır. Bu wakeref'ler, VMA deaktivasyonundan asenkron olarak serbest bırakılır. Hata, VMA etkinleştirilirken onun GT'si için bir wakeref alınarak ve bu wakeref yalnızca VMA devre dışı kaldıktan sonra bırakılarak giderilmiştir. Ancak, GPU'nun hiçbir zaman boşta kalmaması için küresel GTT bu işlem yolundan hariç tutulmuştur. __i915_vma_retire() atomik bağlamlardan çağrılabileceği için wakeref put işleminin asenkron varyantı kullanılmıştır. Ayrıca, döngüsel kilitleme bağımlılığını önlemek için her ikisine de ihtiyaç duyulduğunda wakeref'in VM mutex'inden önce alınmasına dikkat edilmiştir. v7: Şunlar için gerekçelendirme içeren satır içi yorumlar eklendi: - intel_gt_pm_get/put() fonksiyonlarının izlenmeyen varyantlarının kullanımı (Nirmoy), - _put()'un asenkron varyantının kullanımı, - küresel GTT durumunda wakeref alınmaması, - ilk wakeref'in her zaman vm->mutex dışında alınması. v6: __i915_vma_active/retire() geri çağırmaları seri hale getirilmediğinden, struct i915_vma içinde bir wakeref takip tutamacı saklamak güvenli değildir ve bunun için başka uygun bir yer yoktur. intel_gt_pm_get/put_async() fonksiyonlarının izlenmeyen varyantları kullanılmıştır. v5: Commit açıklaması boyunca "tile" ifadesi "GT" ile değiştirildi (Rodrigo).

ÖnemYüksek
CVSS7.8
İstismar olasılığı—
ÜrünLinux Kernel
Yayın1 May 2024
İlk görülme1 May 2024

Nasıl düzeltilir

Güncelleyin
  • linux linux_kernel6.1.88, 6.6.29, 6.8.3 ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
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

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.