Re: [PATCH] smb: client: validate the data area in SMB2_read()
From: Paulo Alcantara
Date: Thu Oct 22 2026 - 19:44:52 EST
Abdifatah Suruur <suruurism@xxxxxxxxx> writes:
> SMB2_read() copies le32_to_cpu(rsp->DataLength) bytes from
> (char *)rsp + rsp->DataOffset without checking that the range lies
> within the response actually received. A READ response with
> DataOffset == 0 makes smb2_get_data_area_len() zero the data length, so
> smb2_check_message() accepts a frame as short as the fixed response,
> while SMB2_read() still uses the server-supplied DataLength, capped only
> by CIFS_MAX_MSGSIZE and the caller's length.
>
> A malicious server can answer the synchronous read used by the
> mfsymlinks (or SFU) symlink parser with an 81-byte READ response
> carrying DataOffset 0 and DataLength 1067, making the client copy 1067
> bytes from a 448-byte receive object (KASAN slab-out-of-bounds; up to
> 16 KiB in the general case).
>
> Clamp a zero (or header-overlapping) DataOffset to read_rsp_size, as
> handle_read_data() does for the asynchronous path, and reject the
> response unless DataOffset + DataLength fits within rsp_iov.iov_len.
> The SMB1 helper was fixed the same way in 5be5bdda5863.
> ...
Applied.