CVE-2026-31706: ksmbd: validate num_aces and harden ACE walk in smb_inherit_dacl()

Published May 1, 2026
·
Updated

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

ksmbd: validate numaces and harden ACE walk in smbinheritdacl()

smbinheritdacl() trusts the on-disk numaces value from the parent directory's DACL xattr and uses it to size a heap allocation:

acesbase = kmalloc(sizeof(struct smbace) numaces 2, ...);

numaces is a u16 read from le16tocpu(parentpdacl->numaces) without checking that it is consistent with the declared pdaclsize. An authenticated client whose parent directory's security.NTACL is tampered (e.g. via offline xattr corruption or a concurrent path that bypasses parsedacl()) can present numaces = 65535 with minimal actual ACE data. This causes a ~8 MB allocation (not kzalloc, so uninitialized) that the subsequent loop only partially populates, and may also overflow the three-way sizet multiply on 32-bit kernels.

Additionally, the ACE walk loop uses the weaker offsetof(struct smbace, accessreq) minimum size check rather than the minimum valid on-wire ACE size, and does not reject ACEs whose declared size is below the minimum.

Reproduced on UML + KASAN + LOCKDEP against the real ksmbd code path. A legitimate mount.cifs client creates a parent directory over SMB (ksmbd writes a valid security.NTACL xattr), then the NTACL blob on the backing filesystem is rewritten to set numaces = 0xFFFF while keeping the posixaclhash bytes intact so ksmbdvfsgetsdxattr()'s hash check still passes. A subsequent SMB2 CREATE of a child under that parent drives smb2open() into smbinheritdacl() (share has "vfs objects = aclxattr" set), which fails the page allocator:

WARNING: mm/pagealloc.c:5226 at allocfrozenpagesnoprof+0x46c/0x9c0 Workqueue: ksmbd-io handleksmbdwork allocfrozenpagesnoprof+0x46c/0x9c0 kmalloclargenode+0x68/0x130 kmalloclargenodenoprof+0x24/0x70 kmallocnoprof+0x4c9/0x690 smbinheritdacl+0x394/0x2430 smb2open+0x595d/0xabe0 handleksmbdwork+0x3d3/0x1140

With the patch applied the added guard rejects the tampered value with -EINVAL before any large allocation runs, smb2open() falls back to smb2createsdbuffer(), and the child is created with a default SD. No warning, no splat.

Fix by:

1. Validating numaces against pdaclsize using the same formula applied in parsedacl().

2. Replacing the raw kmalloc(sizeof numaces 2) with kmallocarray(numaces 2, sizeof(...)) for overflow-safe allocation.

3. Tightening the per-ACE loop guard to require the minimum valid ACE size (offsetof(smbace, sid) + CIFSSIDBASESIZE) and rejecting under-sized ACEs, matching the hardening in smbcheckpermdacl() and parsedacl().

v1 -> v2: - Replace the synthetic test-module splat in the changelog with a real-path UML + KASAN reproduction driven through mount.cifs and SMB2 CREATE; Namjae flagged the kcifs3testinheritdaclold name in v1 since it does not exist in ksmbd. - Drop the commit-hash citation from the code comment per Namjae's review; keep the parsedacl() pointer.

Affected Software

4 affected components
Linux Linux kernel (ksmbd)
Linux Linux kernel>=5.15<6.12.84
Linux Linux kernel>=6.13<6.18.25
Linux Linux kernel>=6.19<7.0.2

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Configuration

    In smb_inherit_dacl(), validate num_aces read from le16_to_cpu(parent_pdacl->num_aces) against pdacl_size using the same formula/minimum-valid on-wire ACE size check; if declared size is below the minimum, return -EINVAL before any large allocation and reject under-sized ACEs.

    ksmbd smb_inherit_dacl() num_aces validation = reject inconsistent/tampered num_aces
  2. Configuration

    Tighten the per-ACE walk loop guard in smb_inherit_dacl() to require the minimum valid ACE size (offsetof(smb_ace, sid) + CIFS_SID_BASE_SIZE) so tampered on-disk num_aces cannot drive allocation/iteration using an under-sized/partial ACE buffer.

    ksmbd smb_inherit_dacl() ACE walk loop guard = require minimum valid ACE size (offsetof(smb_ace, sid) + CIFS_SID_BASE_SIZE)
  3. Operational

    After applying the kernel fix, reproduce and verify that large/tampered on-disk parent DACL/NTACL xattr values that previously allowed num_aces to reach 65535 are rejected early with -EINVAL before large kmalloc allocations (per the added guard rejecting the tampered value).

Event History

May 1, 2026
CVE Published
via MITRE·01:56 PM
Data Sourced
via MITRE·01:56 PM
DescriptionSeverity
Data Sourced
via NVD·02:16 PM
RemedyDescriptionSeverityAffected Software
Free Weekly Intel

Don't miss critical vulnerabilities

Join thousands of security professionals who receive our weekly digest of trending CVEs, zero-days, and exploited vulnerabilities.

No spam. Unsubscribe anytime.

Frequently Asked Questions

1

What is the severity of CVE-2026-31706?

CVE-2026-31706 has a medium severity rating due to its impact on the Linux kernel's ksmbd component.

2

How do I fix CVE-2026-31706?

To fix CVE-2026-31706, update the Linux kernel to a version that includes the security patch addressing the vulnerability.

3

What components are affected by CVE-2026-31706?

CVE-2026-31706 specifically affects the ksmbd component of the Linux kernel.

4

What does CVE-2026-31706 exploit?

CVE-2026-31706 exploits a validation issue in the handling of Access Control Entries (ACEs) in the smb_inherit_dacl() function.

5

Is there a workaround for CVE-2026-31706?

There is no documented workaround for CVE-2026-31706, so upgrading to a patched kernel is recommended.

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