CVE-2025-22003

In the Linux kernel, the following vulnerability has been resolved: can: ucan: fix out of bound read in strscpy() source Commit 7fdaf8966aae ("can: ucan: use strscpy() to instead of strncpy()") unintentionally introduced a one byte out of bound read on strscpy()'s source argument (which is kind of ironic knowing that strscpy() is meant to be a more secure alternative :)). Let's consider below buffers: dest[len + 1]; /* will be NUL terminated */ src[len]; /* may not be NUL terminated */ When doing: strncpy(dest, src, len); dest[len] = '\0'; strncpy() will read up to len bytes from src. On the other hand: strscpy(dest, src, len + 1); will read up to len + 1 bytes from src, that is to say, an out of bound read of one byte will occur on src if it is not NUL terminated. Note that the src[len] byte is never copied, but strscpy() still needs to read it to check whether a truncation occurred or not. This exact pattern happened in ucan. The root cause is that the source is not NUL terminated. Instead of doing a copy in a local buffer, directly NUL terminate it as soon as usb_control_msg() returns. With this, the local firmware_str[] variable can be removed. On top of this do a couple refactors: - ucan_ctl_payload->raw is only used for the firmware string, so rename it to ucan_ctl_payload->fw_str and change its type from u8 to char. - ucan_device_request_in() is only used to retrieve the firmware string, so rename it to ucan_get_fw_str() and refactor it to make it directly handle all the string termination logic.
Configurations

Configuration 1 (hide)

OR cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc3:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc5:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc6:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc7:*:*:*:*:*:*

History

10 Apr 2025, 16:13

Type Values Removed Values Added
First Time Linux linux Kernel
Linux
CWE CWE-125
CVSS v2 : unknown
v3 : unknown
v2 : unknown
v3 : 5.5
CPE cpe:2.3:o:linux:linux_kernel:6.14:rc6:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc1:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc7:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc2:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc5:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc4:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
cpe:2.3:o:linux:linux_kernel:6.14:rc3:*:*:*:*:*:*
References () https://git.kernel.org/stable/c/1d22a122ffb116c3cf78053e812b8b21f8852ee9 - () https://git.kernel.org/stable/c/1d22a122ffb116c3cf78053e812b8b21f8852ee9 - Patch
References () https://git.kernel.org/stable/c/8cec9e314d3360fc1d8346297c41a6ee45cb45a9 - () https://git.kernel.org/stable/c/8cec9e314d3360fc1d8346297c41a6ee45cb45a9 - Patch
References () https://git.kernel.org/stable/c/a4994161a61bc8fd71d105c579d847cefee99262 - () https://git.kernel.org/stable/c/a4994161a61bc8fd71d105c579d847cefee99262 - Patch
References () https://git.kernel.org/stable/c/cc29775a8a72d7f3b56cc026796ad99bd65804a7 - () https://git.kernel.org/stable/c/cc29775a8a72d7f3b56cc026796ad99bd65804a7 - Patch

07 Apr 2025, 14:18

Type Values Removed Values Added
Summary
  • (es) En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: can: ucan: fix out of bound read in strscpy() source Commit 7fdaf8966aae ("can: ucan: use strscpy() to instead of strncpy()") introdujo involuntariamente una lectura fuera de los límite de un byte en el argumento source de strscpy() (lo cual es un poco irónico sabiendo que strscpy() está destinado a ser una alternativa más segura :)). Consideremos los siguientes búferes: dest[len + 1]; /* terminará en NUL */ src[len]; /* puede que no termine en NUL */ Al hacer: strncpy(dest, src, len); dest[len] = '\0'; strncpy() leerá hasta len bytes desde src. Por otro lado: strscpy(dest, src, len + 1); Leerá hasta len + 1 bytes de src; es decir, se producirá una lectura fuera de los límites de un byte en src si no termina en NUL. Tenga en cuenta que el byte src[len] nunca se copia, pero strscpy() aún necesita leerlo para verificar si se produjo un truncamiento. Este mismo patrón ocurrió en ucan. La causa raíz es que el origen no termina en NUL. En lugar de hacer una copia en un búfer local, termine directamente en NUL tan pronto como usb_control_msg() regrese. Con esto, se puede eliminar la variable local firmware_str[]. Además, realice un par de refactorizaciones: - ucan_ctl_payload->raw solo se usa para la cadena de firmware, así que renómbrelo a ucan_ctl_payload->fw_str y cambie su tipo de u8 a char. - ucan_device_request_in() solo se utiliza para recuperar la cadena de firmware, así que cámbiele el nombre a ucan_get_fw_str() y refactorícelo para que gestione directamente toda la lógica de terminación de la cadena.

03 Apr 2025, 08:15

Type Values Removed Values Added
New CVE

Information

Published : 2025-04-03 08:15

Updated : 2025-04-10 16:13


NVD link : CVE-2025-22003

Mitre link : CVE-2025-22003

CVE.ORG link : CVE-2025-22003


JSON object : View

Products Affected

linux

  • linux_kernel
CWE
CWE-125

Out-of-bounds Read