Re: [PATCH v2] ksmbd: deny access for an empty DACL instead of granting the request
From: Namjae Jeon
Date: Tue Oct 20 2026 - 21:21:58 EST
On Wed, Sep 16, 2026 at 7:49 PM Aamir Ahmed <elb12345@xxxxxxxxxxxxx> wrote:
>
> smb_check_perm_dacl() returns the access mask it computes to the SMB2
> CREATE handler, which uses it as the granted access for the open. For a
> security descriptor whose DACL is present but contains no ACEs, the
> function is supposed to deny access: an empty (non-NULL) DACL grants no
> access to anyone except the object owner's implicit READ_CONTROL and
> WRITE_DAC (MS-DTYP 2.4.5).
>
> The empty-DACL branch only denies when both
>
> - the DACL has no trailing bytes (pdacl_size == sizeof(struct smb_acl)),
> and
> - the request contains bits beyond READ_CONTROL / WRITE_DAC.
>
> In every other case it takes the shared "goto err_out" with rc still 0,
> which returns success without modifying *pdaccess, so the caller grants
> the full requested access. Three problems follow:
>
> - The READ_CONTROL / WRITE_DAC carve-out models the owner's implicit
> rights, but the check runs before is_owner is computed, so those
> rights are handed to *every* caller, not just the owner. For
> READ_CONTROL the SMB2 CREATE path does not fall back to
> inode_permission(), so any user can read the security descriptor of
> an object whose empty DACL is meant to deny them.
>
> - A request of exactly READ_CONTROL and/or WRITE_DAC is granted to any
> caller. WRITE_DAC lets the handle rewrite the DACL.
>
> - A DACL that declares zero ACEs but carries trailing bytes
> (pdacl_size > sizeof(struct smb_acl)) skips the deny entirely and is
> granted whatever was requested.
>
> On shares where the NT ACL is the authoritative access control -- e.g.
> "force user" shares, where every client maps to one POSIX identity so
> POSIX cannot distinguish users -- this is an access-control bypass.
>
> Compute is_owner before the empty-DACL branch and deny access from an
> empty DACL unless the caller is the owner requesting no more than
> READ_CONTROL / WRITE_DAC.
>
> Fixes: e2f34481b24d ("cifsd: add server-side procedures for SMB3")
> Cc: stable@xxxxxxxxxxxxxxx
> Assisted-by: LLM
> Signed-off-by: Aamir Ahmed <elb12345@xxxxxxxxxxxxx>
Applied it to #ksmbd-for-next.
Thanks!