CVE-2023-52933
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: Squashfs: xattr_ids sayımının işlenmesi ve tutarlılık kontrolü düzeltildi Bozulmuş bir dosya sistemi, dosya sistemindeki xattr_ids sayımının işlenmesi ve tutarlılık kontrolündeki iki kusuru ortaya çıkarmaktadır. Bu kusurların her ikisi de hatalı veri tipi kullanımı nedeniyle hesaplama taşmasına yol açmaktadır. Bozulmuş dosya sisteminde xattr_ids değeri 4294967071'dir ve bu değer imzalı (signed) bir değişkende saklandığında -225 negatif sayısına dönüşür. Kusur 1 (Yalnızca 64-bit sistemler): İmzalı tamsayı olan xattr_ids değişkeni işaret genişlemesine (sign extension) neden olur. Bu durum, SQUASHFS_XATTR_*(A) makrolarında değişken taşmasına yol açar. Değişken önce, sizeof operatörünün tipinin "unsigned long" olduğu sizeof(struct squashfs_xattr_id) ile çarpılır. 64-bit bir sistemde bu değer 64-bit boyutundadır ve negatif sayının işaret genişlemesiyle 64-bite çıkarılmasına ve ardından imzasız (unsigned) hale gelmesine neden olur. Bu işlem, 18446744073709548016 veya 2^64 - 3600 gibi çok büyük bir sayı üretir. Bu sayı, SQUASHFS_METADATA_SIZE - 1 (8191 bayt) ile yukarı yuvarlanıp SQUASHFS_METADATA_SIZE değerine bölündüğünde taşma meydana gelir ve sonuç olarak 0 uzunluğu (len içinde saklanan) üretilir. Kusur 2 (Yalnızca 32-bit sistemler): 32-bit bir sistemde tamsayı değişkeni, sizeof operatörünün unsigned long tipi (32-bit) tarafından genişletilmez ve değişkenin imzalı olması, her zaman imzasız olarak değerlendirildiği için bir etki yaratmaz. Yukarıdaki bozulmuş 4294967071 xattr_ids değeri çarpıldığında taşma meydana gelir ve 4294963696 veya 2^32 - 3400 sayısı üretilir. Bu sayı, SQUASHFS_METADATA_SIZE - 1 (8191 bayt) ile yukarı yuvarlanıp SQUASHFS_METADATA_SIZE değerine bölündüğünde tekrar taşma oluşur ve 0 uzunluğu üretilir. 0 uzunluk hesaplamasının etkisi: Bozulmuş xattr_ids alanı ile birlikte, dosya sistemi aynı zamanda dosya sisteminin son değeri olan 850 ile eşleşen bozulmuş bir xattr_table_start değerine sahiptir. Hatalı hesaplanan 0 len değeri, superblock tarafından bildirilen tablonun hatalı boyutuyla (0 bayt) eşleştiği için aşağıdaki tutarlılık kontrol kodu başarısız olur: len = SQUASHFS_XATTR_BLOCK_BYTES(*xattr_ids); indexes = SQUASHFS_XATTR_BLOCKS(*xattr_ids); /* * İndeks tablosunun hesaplanan boyutu (len bayt), tablo başlangıç * ve bitiş noktalarıyla tam olarak eşleşmelidir */ start = table_start + sizeof(*id_table); end = msblk->bytes_used; if (len != (end - start)) return ERR_PTR(-EINVAL); xattr_ids değişkeninin "unsigned int" olarak değiştirilmesi, 64-bit sistemlerdeki kusuru giderir. Bu çözüm, hesaplamanın sizeof operatörünün unsigned long tipi tarafından genişletilmesi gerçeğine dayanır. Değişkenin yukarıdaki makroda u64 tipine dönüştürülmesi (casting), 32-bit sistemlerdeki bu kusuru giderir. Bu durum ayrıca, 64-bit sistemlerin hesaplamayı genişletmek için örtük olarak sizeof operatörünün tipine güvenmediği anlamına gelir. [1] https://lore.kernel.org/lkml/[email protected]/
Nasıl düzeltilir
- linux linux_kernel4.5, 4.10, 4.14.306, 4.19.273, 5.4.232, 5.10.168, 5.15.93, 6.1.11 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 | 4.4.258 ≤ v < 4.5, 4.9.258 ≤ v < 4.10, 4.14.222 ≤ v < 4.14.306, 4.19.176 ≤ v < 4.19.273, 5.4.98 ≤ v < 5.4.232, 5.10.16 ≤ v < 5.10.168, 5.11.1 ≤ v < 5.15.93, 5.16 ≤ v < 6.1.11, 5.11, 6.2 | 4.5, 4.10, 4.14.306, 4.19.273, 5.4.232, 5.10.168, 5.15.93, 6.1.11 |
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.