]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ksmbd: prevent path traversal bypass by restricting caseless retry
authorNamjae Jeon <linkinjeon@kernel.org>
Sun, 7 Jun 2026 11:15:51 +0000 (20:15 +0900)
committerSteve French <stfrench@microsoft.com>
Tue, 16 Jun 2026 23:57:21 +0000 (18:57 -0500)
ksmbd_vfs_path_lookup() enforces LOOKUP_BENEATH to restrict path
resolution within the share root. When a crafted path attempts to
escape the share boundary using parent-directory components ('..'),
vfs_path_parent_lookup() detects this and immediately fails,
returning -EXDEV.

However, a bug exists in __ksmbd_vfs_kern_path() under caseless mode.
The function fails to intercept the -EXDEV error and erroneously
falls through to the caseless retry logic, which is intended only
for genuinely missing files. During this retry process, the path
is reconstructed, leading to an unintended LOOKUP_BENEATH bypass
that allows write-capable users to create zero-length files or
directories outside the exported share.

Fix this by ensuring that the execution only proceeds to the caseless
lookup retry when the error is specifically -ENOENT. Any other errors,
such as -EXDEV from a path traversal attempt, must be returned immediately.

Cc: stable@vger.kernel.org
Reported-by: Y s65 <yu4ys@outlook.com>
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/server/vfs.c

index cd1dbca0cffbfcae437ab9fe6dc6eabecbae7a0e..18c0a7c6b41bd65416ef0b62a80c95e405809a4e 100644 (file)
@@ -1140,7 +1140,7 @@ int __ksmbd_vfs_kern_path(struct ksmbd_work *work, char *filepath,
 
 retry:
        err = ksmbd_vfs_path_lookup(share_conf, filepath, flags, path, for_remove);
-       if (!err || !caseless)
+       if (!err || err != -ENOENT || !caseless)
                return err;
 
        path_len = strlen(filepath);