CVE-2021-47182

In the Linux kernel, the following vulnerability has been resolved: scsi: core: Fix scsi_mode_sense() buffer length handling Several problems exist with scsi_mode_sense() buffer length handling: 1) The allocation length field of the MODE SENSE(10) command is 16-bits, occupying bytes 7 and 8 of the CDB. With this command, access to mode pages larger than 255 bytes is thus possible. However, the CDB allocation length field is set by assigning len to byte 8 only, thus truncating buffer length larger than 255. 2) If scsi_mode_sense() is called with len smaller than 8 with sdev->use_10_for_ms set, or smaller than 4 otherwise, the buffer length is increased to 8 and 4 respectively, and the buffer is zero filled with these increased values, thus corrupting the memory following the buffer. Fix these 2 problems by using put_unaligned_be16() to set the allocation length field of MODE SENSE(10) CDB and by returning an error when len is too small. Furthermore, if len is larger than 255B, always try MODE SENSE(10) first, even if the device driver did not set sdev->use_10_for_ms. In case of invalid opcode error for MODE SENSE(10), access to mode pages larger than 255 bytes are not retried using MODE SENSE(6). To avoid buffer length overflows for the MODE_SENSE(10) case, check that len is smaller than 65535 bytes. While at it, also fix the folowing: * Use get_unaligned_be16() to retrieve the mode data length and block descriptor length fields of the mode sense reply header instead of using an open coded calculation. * Fix the kdoc dbd argument explanation: the DBD bit stands for Disable Block Descriptor, which is the opposite of what the dbd argument description was.
Configurations

Configuration 1 (hide)

cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*

History

21 Mar 2025, 11:54

Type Values Removed Values Added
CVSS v2 : unknown
v3 : unknown
v2 : unknown
v3 : 5.5
First Time Linux linux Kernel
Linux
CWE CWE-770
References () https://git.kernel.org/stable/c/17b49bcbf8351d3dbe57204468ac34f033ed60bc - () https://git.kernel.org/stable/c/17b49bcbf8351d3dbe57204468ac34f033ed60bc - Patch
References () https://git.kernel.org/stable/c/e15de347faf4a9f494cbd4e9a623d343dc1b5851 - () https://git.kernel.org/stable/c/e15de347faf4a9f494cbd4e9a623d343dc1b5851 - Patch
CPE cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*

21 Nov 2024, 06:35

Type Values Removed Values Added
Summary
  • (es) En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: scsi: core: Fix scsi_mode_sense() buffer length management Existen varios problemas con el manejo de la longitud del búfer de scsi_mode_sense(): 1) El campo de longitud de asignación del comando MODE SENSE(10) es de 16 bits y ocupa los bytes 7 y 8 del CDB. Con este comando, es posible acceder a páginas de modo mayores de 255 bytes. Sin embargo, el campo de longitud de asignación del CDB se establece asignando len solo al byte 8, truncando así la longitud del búfer mayor de 255. 2) Si se llama a scsi_mode_sense() con len menor que 8 con sdev->use_10_for_ms establecido, o menor que 4 en caso contrario, la longitud del búfer aumenta a 8 y 4 respectivamente, y el búfer se rellena con ceros con estos valores aumentados, corrompiendo así la memoria que sigue al búfer. Solucione estos 2 problemas usando put_unaligned_be16() para configurar el campo de longitud de asignación de MODE SENSE(10) CDB y devolviendo un error cuando len sea demasiado pequeño. Además, si len es mayor que 255B, siempre intente MODE SENSE(10) primero, incluso si el controlador del dispositivo no configuró sdev->use_10_for_ms. En caso de error de código de operación no válido para MODE SENSE(10), el acceso a páginas de modo mayores a 255 bytes no se vuelve a intentar usando MODE SENSE(6). Para evitar desbordamientos de longitud de búfer para el caso de MODE_SENSE(10), verifique que len sea menor a 65535 bytes. Mientras lo hace, también solucione lo siguiente: * Use get_unaligned_be16() para recuperar los campos de longitud de datos de modo y longitud de descriptor de bloque del encabezado de respuesta de sentido de modo en lugar de usar un cálculo de código abierto. * Corregir la explicación del argumento dbd de kdoc: el bit DBD significa Deshabilitar descriptor de bloque, que es lo opuesto a lo que era la descripción del argumento dbd.
References () https://git.kernel.org/stable/c/17b49bcbf8351d3dbe57204468ac34f033ed60bc - () https://git.kernel.org/stable/c/17b49bcbf8351d3dbe57204468ac34f033ed60bc -
References () https://git.kernel.org/stable/c/e15de347faf4a9f494cbd4e9a623d343dc1b5851 - () https://git.kernel.org/stable/c/e15de347faf4a9f494cbd4e9a623d343dc1b5851 -

10 Apr 2024, 19:49

Type Values Removed Values Added
New CVE

Information

Published : 2024-04-10 19:15

Updated : 2025-03-21 11:54


NVD link : CVE-2021-47182

Mitre link : CVE-2021-47182

CVE.ORG link : CVE-2021-47182


JSON object : View

Products Affected

linux

  • linux_kernel
CWE
CWE-770

Allocation of Resources Without Limits or Throttling