Instituto Nacional de ciberseguridad. Sección Incibe
Instituto Nacional de Ciberseguridad. Sección INCIBE-CERT

Vulnerabilidad en kernel de Linux (CVE-2022-49605)

Gravedad:
Pendiente de análisis
Tipo:
No Disponible / Otro tipo
Fecha de publicación:
26/02/2025
Última modificación:
26/02/2025

Descripción

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: igc: Restablecer la lógica IGC_REMOVED e implementarla correctamente La versión fusionada inicialmente del código del controlador igc (a través de el commit 146740f9abc4, "igc: Agregar soporte para PF") contenía las siguientes comprobaciones IGC_REMOVED checks in the igc_rd32/wr32() MMIO accessors: 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]); /* reads should not return all F's */ if (!(~value) && (!reg || !(~readl(hw_addr)))) hw->hw_addr = NULL; return value; } And: #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) Por ejemplo, igb tiene verificaciones similares en sus accesores MMIO y tiene una macro similar E1000_REMOVED, que se implementa de la siguiente manera: #define E1000_REMOVED(h) Unlikely(!(h)) Estas verificaciones sirven para detectar y tomar nota de un retorno de lectura MMIO 0xffffffff del dispositivo, que puede ser causado por una falla en el enlace PCIe o algún otro tipo de error de bus PCI, y para evitar realizar lecturas y escrituras MMIO desde ese punto en adelante. Sin embargo, la macro IGC_REMOVED no se implementó originalmente: #ifndef IGC_REMOVED #define IGC_REMOVED(a) (0) #endif /* IGC_REMOVED */ Esto provocó que la lógica IGC_REMOVED se eliminara por completo en una confirmación posterior (confirmación 3c215fb18e70, "igc: eliminar la función IGC_REMOVED"), con el fundamento de que dichas comprobaciones solo son importantes para la virtualización y que igc no admite la virtualización, pero un dispositivo PCIe puede desconectarse incluso sin que se utilice la virtualización y, sin las comprobaciones adecuadas, un error de bus PCIe que afecte a un adaptador igc provocará varias desreferencias de puntero NULL, ya que el primer acceso después del error establecerá hw->hw_addr en NULL, y los accesos posteriores desreferenciarán ciegamente este puntero ahora NULL. Este parche restablece las comprobaciones IGC_REMOVED en igc_rd32/wr32() e implementa IGC_REMOVED de la forma en que se hace para igb, comprobando el caso improbable() de que hw_addr sea NULL. Este cambio evita los errores que se observan cuando se produce una falla en el enlace PCIe en un adaptador igc.

Impacto