CVE-2026-99109: smb: client: reject SetEA requests that do not fit the request buffer

Published Oct 28, 2026
·
Updated

In the Linux kernel, the following vulnerability has been resolved:

smb: client: reject SetEA requests that do not fit the request buffer

CIFSSMBSetEA() copies the caller's extended attribute value into the SMB request buffer without checking that it fits. The requirement is stated in the source but was never implemented:

/BB add length check to see if it would fit in negotiated SMB buffer size BB / / if (eavaluelen > buffersize - 512 (enough for header)) / if (eavaluelen) memcpy(parmdata->list.name + namelen + 1, eavalue, eavaluelen);

The only bound applied on the way in is in cifsxattrset():

#define MAXEAVALUESIZE CIFSMaxBufSize ... if (size > MAXEAVALUESIZE)

CIFSMaxBufSize is the full payload capacity of the buffer, so a value of exactly that size leaves no room for the SMB header, the TRANS2 parameter block, the fealist header and the EA name that are written ahead of it in the same object.

SendReceive() already enforces the correct limit on this very length:

if (inlen > CIFSMaxBufSize + MAXCIFSHDRSIZE)

but it is called after the copy has taken place. An unprivileged setxattr(2) on an SMB1 mount with a 250-byte name and a 16384-byte value writes 16384 bytes starting 345 bytes into a 16588-byte cifsrequest object, ending 141 bytes past it:

BUG: KASAN: slab-out-of-bounds in CIFSSMBSetEA+0xabc/0xde0 Write of size 16384 at addr ffff888003aa0159 by task init/68 asanmemcpy+0x3c/0x60 CIFSSMBSetEA+0xabc/0xde0 cifsxattrset+0xd3a/0xff0 vfssetxattr+0x13e/0x1a0 The buggy address is located 345 bytes inside of allocated 16588-byte region

Apply SendReceive()'s limit to the assembled request before the copy rather than after it, and widen the byte counters so the sum cannot wrap before it is tested.

bytecount is also tested against U16MAX, because it is stored in the 16-bit pSMB->ByteCount. That becomes reachable when CIFSMaxBufSize is raised at module load, where it may be set as high as 1024127: with a 5-byte EA name and a 65521-byte value, count is exactly U16MAX while bytecount is 65556, and cputole16() would truncate it to 20 and transmit a frame whose ByteCount does not match its length. Testing bytecount covers count as well, since bytecount is the larger of the two and count's only 16-bit consumer is written after this point.

checkaddoverflow() is evaluated first so that totallen is assigned before it is reported.

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Compensating control

    Reject CIFS SMB1 SetEA requests that do not fit within the negotiated SMB request buffer before copying the extended-attribute value.

Event History

Oct 28, 2026
CVE Published
via MITRE·10:34 AM
Data Sourced
via MITRE·10:34 AM
Description

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203