FAILED: patch "[PATCH] smb: client: fix heap overflow in DACL owner/group rewrite" failed to apply to 6.1-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x 0ee150794c75bcd0be0e24ff3394f433cbae18cc
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026091606-uncoiled-disjoin-4b0d@gregkh' --subject-prefix 'PATCH 6.1.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 0ee150794c75bcd0be0e24ff3394f433cbae18cc Mon Sep 17 00:00:00 2001
From: Bjoern Doebel <[email protected]>
Date: Tue, 8 Sep 2026 16:10:00 +0000
Subject: [PATCH] smb: client: fix heap overflow in DACL owner/group rewrite
When id_mode_to_cifs_acl rewrites an existing DACL, it allocates a buffer sized according to the on-disk DACL length reported by dacl_ptr->size. However, replace_sids_and_copy_aces may rewrite each ACE with a new owner/group SID obtained from the cifs.idmap upcall. Those SIDs can have up to SID_MAX_SUB_AUTHORITIES (15) sub-authorities, making each ACE up to 76 bytes (sizeof(struct smb_ace)).
If the original DACL contains short SIDs (e.g., 1 sub-authority) while the replacement SIDs are long, the rewritten ACEs overflow the allocation.
Fix this by always budgeting for worst-case SID expansion: allocate sizeof(struct smb_acl) plus num_aces * sizeof(struct smb_ace), which covers the smb_acl header and room for every ACE at maximum SID size. This replaces the previous split logic that used dacl_ptr->size for cifsacl mounts but num_aces * sizeof(struct smb_ace) for mode_from_sid
mounts: both paths can trigger the same rewrite and need the same headroom.
KASAN reports this as:
BUG: KASAN: slab-out-of-bounds in build_sec_desc+0x1e8a/0x2680 [cifs] Write of size 4 at addr ffff8881a5e25374 by task chown/5298 ... The buggy address is located 0 bytes to the right of allocated 884-byte region [ffff8881a5e25000, ffff8881a5e25374)
fs/smb/client/cifsacl.c +7 -5
@@ -1837,11 +1837,13 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 *pnmode,cifs_put_tlink (tlink);return rc; } -if (mode_from_sid) - nsecdesclen += -le16_to_cpu (dacl_ptr->num_aces) *sizeof (struct smb_ace ); -else /* cifsacl */ - nsecdesclen +=le16_to_cpu (dacl_ptr->size); +/* +* Worst case: every ACE is rewritten with a new SID of +* SID_MAX_SUB_AUTHORITIES sub-auths -> sizeof(smb_ace) each, +* plus the smb_acl header replace_sids_and_copy_aces() emits. +*/ + nsecdesclen +=sizeof (struct smb_acl ) + +le16_to_cpu (dacl_ptr->num_aces) *sizeof (struct smb_ace ); } }
Sasha Levin
maintainerPATCH 1/1 smb: client: fix heap overflow in DACL owner/group rewrite
From: Bjoern Doebel <[email protected]>
[ Upstream commit 0ee150794c75bcd0be0e24ff3394f433cbae18cc ]
When id_mode_to_cifs_acl rewrites an existing DACL, it allocates a buffer sized according to the on-disk DACL length reported by dacl_ptr->size. However, replace_sids_and_copy_aces may rewrite each ACE with a new owner/group SID obtained from the cifs.idmap upcall. Those SIDs can have up to SID_MAX_SUB_AUTHORITIES (15) sub-authorities, making each ACE up to 76 bytes (sizeof(struct smb_ace)).
If the original DACL contains short SIDs (e.g., 1 sub-authority) while the replacement SIDs are long, the rewritten ACEs overflow the allocation.
Fix this by always budgeting for worst-case SID expansion: allocate sizeof(struct smb_acl) plus num_aces * sizeof(struct smb_ace), which covers the smb_acl header and room for every ACE at maximum SID size. This replaces the previous split logic that used dacl_ptr->size for cifsacl mounts but num_aces * sizeof(struct smb_ace) for mode_from_sid
mounts: both paths can trigger the same rewrite and need the same headroom.
KASAN reports this as:
BUG: KASAN: slab-out-of-bounds in build_sec_desc+0x1e8a/0x2680 [cifs] Write of size 4 at addr ffff8881a5e25374 by task chown/5298 ... The buggy address is located 0 bytes to the right of allocated 884-byte region [ffff8881a5e25000, ffff8881a5e25374)
--- fs/smb/client/cifsacl.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
fs/smb/client/cifsacl.c +7 -5
@@ -1733,11 +1733,13 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 *pnmode,cifs_put_tlink (tlink);return rc; } -if (mode_from_sid) - nsecdesclen += -le32_to_cpu (dacl_ptr->num_aces) *sizeof (struct cifs_ace ); -else /* cifsacl */ - nsecdesclen +=le16_to_cpu (dacl_ptr->size); +/* +* Worst case: every ACE is rewritten with a new SID of +* SID_MAX_SUB_AUTHORITIES sub-auths -> sizeof(cifs_ace) each, +* plus the cifs_acl header replace_sids_and_copy_aces() emits. +*/ + nsecdesclen +=sizeof (struct cifs_acl ) + +le32_to_cpu (dacl_ptr->num_aces) *sizeof (struct cifs_ace ); } }
Signature · 1 line
2.53.0