[PATCH] ksmbd: validate compound request size before reading StructureSize2

Xiang Mei (Microsoft) posted 1 patch 1 week, 4 days ago
fs/smb/server/smb2misc.c | 5 +++++
1 file changed, 5 insertions(+)
[PATCH] ksmbd: validate compound request size before reading StructureSize2
Posted by Xiang Mei (Microsoft) 1 week, 4 days ago
When ksmbd validates a compound (chained) SMB2 request,
ksmbd_smb2_check_message() reads pdu->StructureSize2 without first
checking that the compound element is large enough to contain it.
StructureSize2 is a 2-byte field at offset 64
(__SMB2_HEADER_STRUCTURE_SIZE) from the start of each element.

The compound-walking logic only guarantees that a full 64-byte SMB2
header is present for the trailing element: when NextCommand is 0, len is
reduced to the number of bytes remaining after next_smb2_rcv_hdr_off. A
remote client can craft a compound request whose last element has exactly
64 bytes, so the 2-byte StructureSize2 read at offset 64 extends one byte
past the receive buffer, producing a slab-out-of-bounds read.

  BUG: KASAN: slab-out-of-bounds in ksmbd_smb2_check_message (fs/smb/server/smb2misc.c:402)
  Read of size 2 at addr ffff888012ae31ac by task kworker/0:1/14
  The buggy address is located 172 bytes inside of allocated 173-byte region
  Workqueue: ksmbd-io handle_ksmbd_work
  Call Trace:
   ...
   kasan_report (mm/kasan/report.c:595)
   ksmbd_smb2_check_message (fs/smb/server/smb2misc.c:402)
   handle_ksmbd_work (fs/smb/server/server.c:119)
   process_one_work (kernel/workqueue.c:3314)
   worker_thread (kernel/workqueue.c:3397)
   kthread (kernel/kthread.c:436)
   ret_from_fork (arch/x86/kernel/process.c:158)
   ret_from_fork_asm (arch/x86/entry/entry_64.S:245)

Reject any compound element that is too small to hold StructureSize2
before dereferencing it.

Fixes: e2f34481b24d ("cifsd: add server-side procedures for SMB3")
Reported-by: AutonomousCodeSecurity@microsoft.com
Signed-off-by: Xiang Mei (Microsoft) <xmei5@asu.edu>
---
 fs/smb/server/smb2misc.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/fs/smb/server/smb2misc.c b/fs/smb/server/smb2misc.c
index c0c4edd092c2..9f3629c86291 100644
--- a/fs/smb/server/smb2misc.c
+++ b/fs/smb/server/smb2misc.c
@@ -407,6 +407,11 @@ int ksmbd_smb2_check_message(struct ksmbd_work *work)
 		return 1;
 	}
 
+	if (len < __SMB2_HEADER_STRUCTURE_SIZE + sizeof(__le16)) {
+		ksmbd_debug(SMB, "Message is too small for StructureSize2\n");
+		return 1;
+	}
+
 	if (smb2_req_struct_sizes[command] != pdu->StructureSize2) {
 		if (!(command == SMB2_OPLOCK_BREAK_HE &&
 		    (le16_to_cpu(pdu->StructureSize2) == OP_BREAK_STRUCT_SIZE_20 ||
-- 
2.43.0
Re: [PATCH] ksmbd: validate compound request size before reading StructureSize2
Posted by Namjae Jeon 1 week, 4 days ago
On Tue, Jul 14, 2026 at 6:55 AM Xiang Mei (Microsoft) <xmei5@asu.edu> wrote:
>
> When ksmbd validates a compound (chained) SMB2 request,
> ksmbd_smb2_check_message() reads pdu->StructureSize2 without first
> checking that the compound element is large enough to contain it.
> StructureSize2 is a 2-byte field at offset 64
> (__SMB2_HEADER_STRUCTURE_SIZE) from the start of each element.
>
> The compound-walking logic only guarantees that a full 64-byte SMB2
> header is present for the trailing element: when NextCommand is 0, len is
> reduced to the number of bytes remaining after next_smb2_rcv_hdr_off. A
> remote client can craft a compound request whose last element has exactly
> 64 bytes, so the 2-byte StructureSize2 read at offset 64 extends one byte
> past the receive buffer, producing a slab-out-of-bounds read.
>
>   BUG: KASAN: slab-out-of-bounds in ksmbd_smb2_check_message (fs/smb/server/smb2misc.c:402)
>   Read of size 2 at addr ffff888012ae31ac by task kworker/0:1/14
>   The buggy address is located 172 bytes inside of allocated 173-byte region
>   Workqueue: ksmbd-io handle_ksmbd_work
>   Call Trace:
>    ...
>    kasan_report (mm/kasan/report.c:595)
>    ksmbd_smb2_check_message (fs/smb/server/smb2misc.c:402)
>    handle_ksmbd_work (fs/smb/server/server.c:119)
>    process_one_work (kernel/workqueue.c:3314)
>    worker_thread (kernel/workqueue.c:3397)
>    kthread (kernel/kthread.c:436)
>    ret_from_fork (arch/x86/kernel/process.c:158)
>    ret_from_fork_asm (arch/x86/entry/entry_64.S:245)
>
> Reject any compound element that is too small to hold StructureSize2
> before dereferencing it.
>
> Fixes: e2f34481b24d ("cifsd: add server-side procedures for SMB3")
> Reported-by: AutonomousCodeSecurity@microsoft.com
> Signed-off-by: Xiang Mei (Microsoft) <xmei5@asu.edu>
Applied it to #ksmbd-for-next-next.
Thanks!