CVE-2022-49605
Açıklama
Linux kernel içerisinde aşağıdaki güvenlik açığı giderilmiştir: igc: IGC_REMOVED mantığını yeniden etkinleştir ve düzgün şekilde uygula igc sürücü kodunun başlangıçta birleştirilen versiyonu (146740f9abc4 numaralı commit ile, "igc: Add support for PF"), igc_rd32/wr32() MMIO erişimcilerinde şu IGC_REMOVED kontrollerini içeriyordu: u32 igc_rd32(struct igc_hw *hw, u32 reg) { u8 __iomem *hw_addr = READ_ONCE(hw->hw_addr); u32 value = 0; if (IGC_REMOVED(hw_addr)) return ~value; value = readl(&hw_addr[reg]); /* okumalar tümü F dönmemeli */ if (!(~value) && (!reg || !(~readl(hw_addr)))) hw->hw_addr = NULL; return value; } Ve: #define wr32(reg, val) \ do { \ u8 __iomem *hw_addr = READ_ONCE((hw)->hw_addr); \ if (!IGC_REMOVED(hw_addr)) \ writel((val), &hw_addr[(reg)]); \ } while (0) Örneğin igb, MMIO erişimcilerinde benzer kontrollere sahiptir ve şu şekilde uygulanan benzer bir E1000_REMOVED makrosuna sahiptir: #define E1000_REMOVED(h) unlikely(!(h)) Bu kontroller, bir PCIe bağlantı kopması (link flap) veya başka bir tür PCI veri yolu hatasından kaynaklanabilecek cihazdan gelen 0xffffffff MMIO okuma dönüşünü tespit edip kaydetmeye ve bu noktadan itibaren MMIO okuma ve yazma işlemlerinin gerçekleştirilmesini önlemeye yarar. Ancak, IGC_REMOVED makrosu başlangıçta uygulanmamıştı: #ifndef IGC_REMOVED #define IGC_REMOVED(a) (0) #endif /* IGC_REMOVED */ Bu durum, söz konusu kontrollerin yalnızca sanallaştırma için önemli olduğu ve igc'nin sanallaştırmayı desteklemediği gerekçesiyle, sonraki bir commit'te (3c215fb18e70 numaralı commit, "igc: remove IGC_REMOVED function") IGC_REMOVED mantığının tamamen kaldırılmasına yol açmıştır. Fakat bir PCIe aygıtı, sanallaştırma kullanılmasa bile ayrılabilir ve uygun kontroller olmadan, bir igc adaptörünü etkileyen PCIe veri yolu hatası çeşitli NULL pointer dereference hatalarına yol açacaktır; çünkü hatadan sonraki ilk erişim hw->hw_addr değerini NULL olarak ayarlayacak ve sonraki erişimler körü körüne artık NULL olan bu işaretçiyi çözümleyecektir. Bu yama, igc_rd32/wr32() içindeki IGC_REMOVED kontrollerini yeniden etkinleştirir ve IGC_REMOVED'yi, hw_addr'nin NULL olma ihtimalini unlikely() durumuyla kontrol ederek igb'de yapıldığı şekilde uygular. Bu değişiklik, bir igc adaptöründe PCIe bağlantı kopması meydana geldiğinde görülen oops hatalarını önler.
Nasıl düzeltilir
- linux linux_kernel5.4.208, 5.10.134, 5.15.58, 5.18.15 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.20 ≤ v < 5.4.208, 5.5 ≤ v < 5.10.134, 5.11 ≤ v < 5.15.58, 5.16 ≤ v < 5.18.15, 5.19 | 5.4.208, 5.10.134, 5.15.58, 5.18.15 |
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.