CVE-2022-49700
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: mm/slub: slab devre dışı bırakıldığında eksik olan TID güncellemeleri eklendi slab_alloc_node() içerisindeki hızlı yol (fastpath), TID aynı kaldığı sürece c->slab yapısının kararlı olduğunu varsayar. Ancak, __slab_alloc() içerisindeki iki nokta, CPU slab'ını devre dışı bırakırken şu anda TID'yi güncellememektedir. Birden fazla işlem uygun şekilde yarıştığında (race condition), bu durum bir nesnenin kaybolmasına veya daha düşük bir ihtimalle, bir nesnenin yanlış slab'ın boş liste (freelist) yapısına serbest bırakılmasına neden olabilir; bu da `inuse` sayacını bozarak nihayetinde hala slab nesneleri içeren bir sayfanın sayfa ayırıcıya (page allocator) serbest bırakılmasına yol açabilir. (Bu durumlar fiilen test edilmemiştir, sadece koda bakılarak tespit edilmiştir. Bu tür durumlar için test senaryoları yazmak oldukça zor görünmektedir...) Durum tutarsızlığına yol açan yarış durumu şöyledir (tüm işlemler aynı CPU ve kmem_cache üzerinde): - görev A: do_slab_free() başlatılır: - TID okunur - pcpu freelist okunur (==NULL) - `slab == c->slab` kontrol edilir (doğru) - [YARIMLAMA (PREEMPT) A->B] - görev B: slab_alloc_node() başlatılır: - hızlı yol başarısız olur (`c->freelist` NULL'dır) - __slab_alloc() girilir - slub_get_cpu_ptr() (yarımlamayı devre dışı bırakır) - ___slab_alloc() girilir - local_lock_irqsave() alınır - c->freelist NULL olarak okunur - get_freelist() NULL döner - `c->slab = NULL` yazılır - local_unlock_irqrestore() bırakılır - new_slab etiketine gidilir - slub_percpu_partial() NULL'dır - get_partial() NULL döner - slub_put_cpu_ptr() (yarımlamayı etkinleştirir) - [YARIMLAMA (PREEMPT) B->A] - görev A: do_slab_free() tamamlanır: - this_cpu_cmpxchg_double() başarılı olur - [BOZULMUŞ DURUM: c->slab==NULL, c->freelist!=NULL] Buradan itibaren, eğer görevin B devam etmesine izin verilirse c->freelist üzerindeki nesne kaybolacaktır: İşlem retry_load_slab etiketine ilerleyecek, c->slab değerini ayarlayacak ve ardından c->freelist değerini üzerine yazarak bozan load_freelist kısmına atlayacaktır. Ancak bunun yerine aşağıdaki gibi devam edilirse, daha ciddi bir bozulma meydana gelir: - görev A: başka bir struct slab nesnesi üzerinde __slab_free() çalıştırılır: - CPU_PARTIAL_FREE durumu (slab hiçbir listede değildi, şimdi pcpu partial listesindedir) - görev A: NUMA düğüm kısıtı ile slab_alloc_node() çalıştırılır: - hızlı yol başarısız olur (c->slab NULL'dır) - __slab_alloc() çağrılır - slub_get_cpu_ptr() (yarımlamayı devre dışı bırakır) - ___slab_alloc() girilir - c->slab NULL'dır: new_slab etiketine gidilir - slub_percpu_partial() NULL değildir - c->slab değeri slub_percpu_partial(c) olarak ayarlanır - [BOZULMUŞ DURUM: c->slab slab-1'i işaret ederken, c->freelist slab-2'den gelen nesnelere sahiptir] - redo etiketine gidilir - node_match() başarısız olur - deactivate_slab etiketine gidilir - mevcut c->freelist, deactivate_slab() fonksiyonuna aktarılır - slab-1'in inuse sayısı, slab-2'den gelen nesneyi hesaba katmak için azaltılır Bu noktada, slab-1'in inuse sayısı olması gerekenden 1 eksiktir. Bu durum, slab-1 içindeki tahsis edilmiş tüm nesnelerden biri hariç hepsi serbest bırakıldığında, SLUB'un slab-1'in tamamen kullanılmadığını düşünmesi ve sayfasını serbest bırakabilmesi anlamına gelir; bu da serbest bırakıldıktan sonra kullanım (use-after-free) hatasına yol açar.
Nasıl düzeltilir
- linux linux_kernel4.9.323, 4.14.288, 4.19.252, 5.4.205, 5.10.130, 5.15.54, 5.18.8 ya da sonraki bir sürüm
Etkilenen ürünler
| Ürün | Etkilenen sürümler | Düzeltildiği sürüm |
|---|---|---|
| linux linux_kernel | 3.1 ≤ v < 4.9.323, 4.10 ≤ v < 4.14.288, 4.15 ≤ v < 4.19.252, 4.20 ≤ v < 5.4.205, 5.5 ≤ v < 5.10.130, 5.11 ≤ v < 5.15.54, 5.16 ≤ v < 5.18.8, 5.19 | 4.9.323, 4.14.288, 4.19.252, 5.4.205, 5.10.130, 5.15.54, 5.18.8 |
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.