HIGH
ksmbd Lock Handler NULL Deref
CVE-2026-31477
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
KernelScan AI7.5HIGH
01Description
In the Linux kernel, the following vulnerability has been resolved: ksmbd: fix memory leaks and NULL deref in smb2_lock() smb2_lock() has three error handling issues after list_del() detaches smb_lock from lock_list at no_check_cl: 1) If vfs_lock_file() returns an unexpected error in the non-UNLOCK path, goto out leaks smb_lock and its flock because the out: handler only iterates lock_list and rollback_list, neither of which contains the detached smb_lock. 2) If vfs_lock_file() returns -ENOENT in the UNLOCK path, goto out leaks smb_lock and flock for the same reason. The error code returned to the dispatcher is also stale. 3) In the rollback path, smb_flock_init() can return NULL on allocation failure. The result is dereferenced unconditionally, causing a kernel NULL pointer dereference. Add a NULL check to prevent the crash and clean up the bookkeeping; the VFS lock itself cannot be rolled back without the allocation and will be released at file or connection teardown. Fix cases 1 and 2 by hoisting the locks_free_lock()/kfree() to before the if(!rc) check in the UNLOCK branch so all exit paths share one free site, and by freeing smb_lock and flock before goto out in the non-UNLOCK branch. Propagate the correct error code in both cases. Fix case 3 by wrapping the VFS unlock in an if(rlock) guard and adding a NULL check for locks_free_lock(rlock) in the shared cleanup. Found via call-graph analysis using sqry.
02KernelScan AI Analysis
Risk summary
A remote authenticated attacker can cause kernel crashes through NULL pointer dereferences by sending specially crafted SMB lock requests that trigger allocation failures. The vulnerability also causes memory leaks that could lead to resource exhaustion over time. This affects SMB file servers and could result in denial of service.
Vulnerability analysis
Root Cause: The smb2_lock() function in ksmbd has three critical error handling flaws: (1) Memory leaks when vfs_lock_file() fails in non-UNLOCK paths because smb_lock is detached from tracking lists but not freed, (2) Memory leaks and stale error codes when vfs_lock_file() returns -ENOENT in UNLOCK paths, and (3) Unconditional dereference of potentially NULL return value from smb_flock_init() during rollback operations.
Attack Surface: Network-accessible through SMB/CIFS protocol. Requires authenticated SMB client access to trigger file locking operations. The vulnerability can be triggered by malicious SMB clients sending crafted lock requests that cause allocation failures or specific VFS error conditions.
Fix Mechanism: The patch fixes these issues by: (1) Moving locks_free_lock()/kfree() calls before conditional checks in UNLOCK paths to ensure cleanup on all exit paths, (2) Adding explicit cleanup before goto out in non-UNLOCK error paths with proper error code propagation, and (3) Adding NULL checks around smb_flock_init() return values and wrapping VFS unlock operations in conditional guards to prevent NULL pointer dereferences.
03Fix Versions
| Branch | Fixed in | Patch commit |
|---|---|---|
| 6.1 | 6.1.168 | cdac6f7e7e42 |
| 6.12 | 6.12.80 | 91aeaa725600 |
| 6.18 | 6.18.21 | 3cdacd11b415 |
| 6.19 | 6.19.11 | aab42f079562 |
| 6.6 | 6.6.131 | c9b95ef6f503 |
| mainline | 7.0 | 309b44ed6844 |