In the Linux kernel, the following vulnerability has been resolved:
bnx2x: Fix multiple UBSAN array-index-out-of-bounds
Fix UBSAN warnings that occur when using a system with 32 physical
cpu cores or more, or when the user defines a number of Ethernet
queues greater than or equal to FP_SB_MAX_E1x using the num_queues
module parameter.
Currently there is a read/write out of bounds that occurs on the array
“struct stats_query_entry query” present inside the “bnx2x_fw_stats_req”
struct in “drivers/net/ethernet/broadcom/bnx2x/bnx2x.h”.
Looking at the definition of the “struct stats_query_entry query” array:
struct stats_query_entry query[FP_SB_MAX_E1x+
BNX2X_FIRST_QUEUE_QUERY_IDX];
FP_SB_MAX_E1x is defined as the maximum number of fast path interrupts and
has a value of 16, while BNX2X_FIRST_QUEUE_QUERY_IDX has a value of 3
meaning the array has a total size of 19.
Since accesses to “struct stats_query_entry query” are offset-ted by
BNX2X_FIRST_QUEUE_QUERY_IDX, that means that the total number of Ethernet
queues should not exceed FP_SB_MAX_E1x (16). However one of these queues
is reserved for FCOE and thus the number of Ethernet queues should be set
to [FP_SB_MAX_E1x -1] (15) if FCOE is enabled or [FP_SB_MAX_E1x] (16) if
it is not.
This is also described in a comment in the source code in
drivers/net/ethernet/broadcom/bnx2x/bnx2x.h just above the Macro definition
of FP_SB_MAX_E1x. Below is the part of this explanation that it important
for this patch
/*
However this driver also supports NICs that use the E2 controller which can
handle more queues due to having more FP-SB represented by FP_SB_MAX_E2.
Looking at the commits when the E2 support was added, it was originally
using the E1x parameters: commit f2e0899f0f27 (“bnx2x: Add 57712 support”).
Back then FP_SB_MAX_E2 was set to 16 the same as E1x. However the driver
was later updated to take full advantage of the E2 instead of having it be
limited to the capabilities of the E1x. But as far as we can tell, the
array “stats_query_entry query” was still limited to using the FP-SB
available to the E1x cards as part of an oversignt when the driver was
updated to take full advantage of the E2, and now with the driver being
aware of the greater queue size supported by E2 NICs, it causes the UBSAN
warnings seen in the stack traces below.
This patch increases the size of the “stats_query_entry query” array by
replacing FP_SB_MAX_E1x with FP_SB_MAX_E2 to be large enough to handle
both types of NICs.
Stack traces:
UBSAN: array-index-out-of-bounds in
drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.c:1529:11
index 20 is out of range for type ‘stats_query_entry [19]’
CPU: 12 PID: 858 Comm: systemd-network Not tainted 6.9.0-060900rc7-generic
#202405052133
Hardware name: HP ProLiant DL360 Gen9/ProLiant DL360
—truncated—
[
{
"product": "Linux",
"vendor": "Linux",
"defaultStatus": "unaffected",
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"programFiles": [
"drivers/net/ethernet/broadcom/bnx2x/bnx2x.h"
],
"versions": [
{
"version": "50f0a562f8cc",
"lessThan": "cfb04472ce33",
"status": "affected",
"versionType": "git"
},
{
"version": "50f0a562f8cc",
"lessThan": "cbe53087026a",
"status": "affected",
"versionType": "git"
},
{
"version": "50f0a562f8cc",
"lessThan": "8b17cec33892",
"status": "affected",
"versionType": "git"
},
{
"version": "50f0a562f8cc",
"lessThan": "0edae06b4c22",
"status": "affected",
"versionType": "git"
},
{
"version": "50f0a562f8cc",
"lessThan": "9504a1550686",
"status": "affected",
"versionType": "git"
},
{
"version": "50f0a562f8cc",
"lessThan": "f1313ea92f82",
"status": "affected",
"versionType": "git"
},
{
"version": "50f0a562f8cc",
"lessThan": "b9ea38e76745",
"status": "affected",
"versionType": "git"
},
{
"version": "50f0a562f8cc",
"lessThan": "134061163ee5",
"status": "affected",
"versionType": "git"
}
]
},
{
"product": "Linux",
"vendor": "Linux",
"defaultStatus": "affected",
"repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
"programFiles": [
"drivers/net/ethernet/broadcom/bnx2x/bnx2x.h"
],
"versions": [
{
"version": "3.3",
"status": "affected"
},
{
"version": "0",
"lessThan": "3.3",
"status": "unaffected",
"versionType": "custom"
},
{
"version": "4.19.318",
"lessThanOrEqual": "4.19.*",
"status": "unaffected",
"versionType": "custom"
},
{
"version": "5.4.280",
"lessThanOrEqual": "5.4.*",
"status": "unaffected",
"versionType": "custom"
},
{
"version": "5.10.222",
"lessThanOrEqual": "5.10.*",
"status": "unaffected",
"versionType": "custom"
},
{
"version": "5.15.163",
"lessThanOrEqual": "5.15.*",
"status": "unaffected",
"versionType": "custom"
},
{
"version": "6.1.98",
"lessThanOrEqual": "6.1.*",
"status": "unaffected",
"versionType": "custom"
},
{
"version": "6.6.39",
"lessThanOrEqual": "6.6.*",
"status": "unaffected",
"versionType": "custom"
},
{
"version": "6.9.9",
"lessThanOrEqual": "6.9.*",
"status": "unaffected",
"versionType": "custom"
},
{
"version": "6.10",
"lessThanOrEqual": "*",
"status": "unaffected",
"versionType": "original_commit_for_fix"
}
]
}
]
git.kernel.org/stable/c/0edae06b4c227bcfaf3ce21208d49191e1009d3b
git.kernel.org/stable/c/134061163ee5ca4759de5c24ca3bd71608891ba7
git.kernel.org/stable/c/8b17cec33892a66bbd71f8d9a70a45e2072ae84f
git.kernel.org/stable/c/9504a1550686f53b0bab4cab31d435383b1ee2ce
git.kernel.org/stable/c/b9ea38e767459111a511ed4fb74abc37db95a59d
git.kernel.org/stable/c/cbe53087026ad929cd3950508397e8892a6a2a0f
git.kernel.org/stable/c/cfb04472ce33bee2579caf4dc9f4242522f6e26e
git.kernel.org/stable/c/f1313ea92f82451923e28ab45a4aaa0e70e80b98