Vulnerabilidad en XFS que permite leer datos sin procesar del dispositivo de bloque

Se ha identificado una vulnerabilidad (CVE-2021-4155) en el código del sistema de archivos XFS que permite a un usuario local sin privilegios leer datos de bloque no utilizados directamente desde un dispositivo de bloque. Todas las versiones principales del kernel de Linux anteriores a 5.16 que contienen el controlador XFS se ven afectadas por este problema. La solución se incluyó en la versión 5.16, así como en las actualizaciones del kernel 5.15.14, 5.10.91, 5.4.171, 4.19.225, etc. El estado de las actualizaciones que se generan para solucionar el problema en las distribuciones se puede rastrear en estas páginas: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch.

La vulnerabilidad es causada por el comportamiento incorrecto de dos ioctl(XFS_IOC_ALLOCSP) e ioctl(XFS_IOC_FREESP) específicos de XFS, que son un análogo funcional de la llamada al sistema fallocate() en todo el kernel. Al aumentar el tamaño de un archivo que no está alineado con el bloque, ioctls XFS_IOC_ALLOCSP/XFS_IOC_FREESP no restablece los bytes finales a cero hasta el siguiente límite del bloque. Por lo tanto, en XFS con un tamaño de bloque estándar de 4096 bytes, un atacante puede leer hasta 4095 bytes de datos escritos previamente de cada bloque. Estas áreas pueden contener datos de archivos eliminados, archivos desfragmentados y archivos con bloques deduplicados.

Puede probar su sistema para detectar el problema utilizando un prototipo de exploit simple. Si después de ejecutar la secuencia de comandos propuesta es posible leer el texto de Shakespeare, entonces el controlador FS es vulnerable. Inicialmente, montar una partición XFS para demostración requiere privilegios de root.

Dado que ioctl(XFS_IOC_ALLOCSP) e ioctl(XFS_IOC_FREESP) son prácticamente iguales en funcionalidad que el fallocate() estándar, y su única diferencia es la fuga de datos, su presencia es similar a una puerta trasera. A pesar de la política general de no cambiar las interfaces existentes en el kernel, por sugerencia de Linus, se decidió eliminar por completo estos ioctls en la próxima versión.

Fuente: opennet.ru

Añadir un comentario