mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
bnxt_en: fix OOB access in DBG_BUF_PRODUCER async event handler
The ASYNC_EVENT_CMPL_EVENT_ID_DBG_BUF_PRODUCER handler in
bnxt_async_event_process() uses a firmware-supplied 'type' field
directly as an index into bp->bs_trace[] without bounds validation.
The 'type' field is a 16-bit value extracted from DMA-mapped completion
ring memory that the NIC writes directly to host RAM. A malicious or
compromised NIC can supply any value from 0 to 65535, causing an
out-of-bounds access into kernel heap memory.
The bnxt_bs_trace_check_wrap() call then dereferences bs_trace->magic_byte
and writes to bs_trace->last_offset and bs_trace->wrapped, leading to
kernel memory corruption or a crash.
Fix by adding a bounds check and defining BNXT_TRACE_MAX as
DBG_LOG_BUFFER_FLUSH_REQ_TYPE_ERR_QPC_TRACE + 1 to cover all currently
defined firmware trace types (0x0 through 0xc).
Fixes: 84fcd9449f ("bnxt_en: Manage the FW trace context memory")
Reported-by: Yuhao Jiang <danisjiang@gmail.com>
Cc: stable@vger.kernel.org
Signed-off-by: Junrui Luo <moonafterrain@outlook.com>
Reviewed-by: Michael Chan <michael.chan@broadcom.com>
Link: https://patch.msgid.link/SYBPR01MB7881A253A1C9775D277F30E9AF42A@SYBPR01MB7881.ausprd01.prod.outlook.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
069c8f5aeb
commit
64dcbde7f8
@@ -2929,6 +2929,8 @@ static int bnxt_async_event_process(struct bnxt *bp,
|
||||
u16 type = (u16)BNXT_EVENT_BUF_PRODUCER_TYPE(data1);
|
||||
u32 offset = BNXT_EVENT_BUF_PRODUCER_OFFSET(data2);
|
||||
|
||||
if (type >= ARRAY_SIZE(bp->bs_trace))
|
||||
goto async_event_process_exit;
|
||||
bnxt_bs_trace_check_wrap(&bp->bs_trace[type], offset);
|
||||
goto async_event_process_exit;
|
||||
}
|
||||
|
||||
@@ -2146,7 +2146,7 @@ enum board_idx {
|
||||
};
|
||||
|
||||
#define BNXT_TRACE_BUF_MAGIC_BYTE ((u8)0xbc)
|
||||
#define BNXT_TRACE_MAX 11
|
||||
#define BNXT_TRACE_MAX (DBG_LOG_BUFFER_FLUSH_REQ_TYPE_ERR_QPC_TRACE + 1)
|
||||
|
||||
struct bnxt_bs_trace_info {
|
||||
u8 *magic_byte;
|
||||
|
||||
Reference in New Issue
Block a user