[<prev] [next>] [day] [month] [year] [list]
Message-ID: <2025040349-CVE-2025-22003-ea29@gregkh>
Date: Thu, 3 Apr 2025 08:17:55 +0100
From: Greg Kroah-Hartman <gregkh@...uxfoundation.org>
To: linux-cve-announce@...r.kernel.org
Cc: Greg Kroah-Hartman <gregkh@...uxfoundation.org>
Subject: CVE-2025-22003: can: ucan: fix out of bound read in strscpy() source
Description
===========
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.
The Linux kernel CVE team has assigned CVE-2025-22003 to this issue.
Affected and fixed versions
===========================
Issue introduced in 6.2 with commit 7fdaf8966aae476deafe11f9a0067ff588615444 and fixed in 6.6.85 with commit cc29775a8a72d7f3b56cc026796ad99bd65804a7
Issue introduced in 6.2 with commit 7fdaf8966aae476deafe11f9a0067ff588615444 and fixed in 6.12.21 with commit 8cec9e314d3360fc1d8346297c41a6ee45cb45a9
Issue introduced in 6.2 with commit 7fdaf8966aae476deafe11f9a0067ff588615444 and fixed in 6.13.9 with commit a4994161a61bc8fd71d105c579d847cefee99262
Issue introduced in 6.2 with commit 7fdaf8966aae476deafe11f9a0067ff588615444 and fixed in 6.14 with commit 1d22a122ffb116c3cf78053e812b8b21f8852ee9
Please see https://www.kernel.org for a full list of currently supported
kernel versions by the kernel community.
Unaffected versions might change over time as fixes are backported to
older supported kernel versions. The official CVE entry at
https://cve.org/CVERecord/?id=CVE-2025-22003
will be updated if fixes are backported, please check that for the most
up to date information about this issue.
Affected files
==============
The file(s) affected by this issue are:
drivers/net/can/usb/ucan.c
Mitigation
==========
The Linux kernel CVE team recommends that you update to the latest
stable kernel version for this, and many other bugfixes. Individual
changes are never tested alone, but rather are part of a larger kernel
release. Cherry-picking individual commits is not recommended or
supported by the Linux kernel community at all. If however, updating to
the latest release is impossible, the individual changes to resolve this
issue can be found at these commits:
https://git.kernel.org/stable/c/cc29775a8a72d7f3b56cc026796ad99bd65804a7
https://git.kernel.org/stable/c/8cec9e314d3360fc1d8346297c41a6ee45cb45a9
https://git.kernel.org/stable/c/a4994161a61bc8fd71d105c579d847cefee99262
https://git.kernel.org/stable/c/1d22a122ffb116c3cf78053e812b8b21f8852ee9
Powered by blists - more mailing lists