[<prev] [next>] [day] [month] [year] [list]
Message-ID: <2024122718-CVE-2024-53176-85e0@gregkh>
Date: Fri, 27 Dec 2024 14:52:22 +0100
From: Greg Kroah-Hartman <gregkh@...uxfoundation.org>
To: linux-cve-announce@...r.kernel.org
Cc: Greg Kroah-Hartman <gregkh@...uxfoundation.org>
Subject: CVE-2024-53176: smb: During unmount, ensure all cached dir instances drop their dentry
Description
===========
In the Linux kernel, the following vulnerability has been resolved:
smb: During unmount, ensure all cached dir instances drop their dentry
The unmount process (cifs_kill_sb() calling close_all_cached_dirs()) can
race with various cached directory operations, which ultimately results
in dentries not being dropped and these kernel BUGs:
BUG: Dentry ffff88814f37e358{i=1000000000080,n=/} still in use (2) [unmount of cifs cifs]
VFS: Busy inodes after unmount of cifs (cifs)
------------[ cut here ]------------
kernel BUG at fs/super.c:661!
This happens when a cfid is in the process of being cleaned up when, and
has been removed from the cfids->entries list, including:
- Receiving a lease break from the server
- Server reconnection triggers invalidate_all_cached_dirs(), which
removes all the cfids from the list
- The laundromat thread decides to expire an old cfid.
To solve these problems, dropping the dentry is done in queued work done
in a newly-added cfid_put_wq workqueue, and close_all_cached_dirs()
flushes that workqueue after it drops all the dentries of which it's
aware. This is a global workqueue (rather than scoped to a mount), but
the queued work is minimal.
The final cleanup work for cleaning up a cfid is performed via work
queued in the serverclose_wq workqueue; this is done separate from
dropping the dentries so that close_all_cached_dirs() doesn't block on
any server operations.
Both of these queued works expect to invoked with a cfid reference and
a tcon reference to avoid those objects from being freed while the work
is ongoing.
While we're here, add proper locking to close_all_cached_dirs(), and
locking around the freeing of cfid->dentry.
The Linux kernel CVE team has assigned CVE-2024-53176 to this issue.
Affected and fixed versions
===========================
Issue introduced in 6.1 with commit ebe98f1447bbccf8228335c62d86af02a0ed23f7 and fixed in 6.6.64 with commit 73934e535cffbda1490fa97d82690a0f9aa73e94
Issue introduced in 6.1 with commit ebe98f1447bbccf8228335c62d86af02a0ed23f7 and fixed in 6.11.11 with commit ff4528bbc82d0d90073751f7b49e7b9e9c7e5638
Issue introduced in 6.1 with commit ebe98f1447bbccf8228335c62d86af02a0ed23f7 and fixed in 6.12.2 with commit 548812afd96982a76a93ba76c0582ea670c40d9e
Issue introduced in 6.1 with commit ebe98f1447bbccf8228335c62d86af02a0ed23f7 and fixed in 6.13-rc1 with commit 3fa640d035e5ae526769615c35cb9ed4be6e3662
Please see https://www.kernel.org for a full list of currently supported
kernel versions by the kernel community.
Unaffected versions might change over time as fixes are backported to
older supported kernel versions. The official CVE entry at
https://cve.org/CVERecord/?id=CVE-2024-53176
will be updated if fixes are backported, please check that for the most
up to date information about this issue.
Affected files
==============
The file(s) affected by this issue are:
fs/smb/client/cached_dir.c
fs/smb/client/cached_dir.h
fs/smb/client/cifsfs.c
fs/smb/client/cifsglob.h
fs/smb/client/inode.c
fs/smb/client/trace.h
Mitigation
==========
The Linux kernel CVE team recommends that you update to the latest
stable kernel version for this, and many other bugfixes. Individual
changes are never tested alone, but rather are part of a larger kernel
release. Cherry-picking individual commits is not recommended or
supported by the Linux kernel community at all. If however, updating to
the latest release is impossible, the individual changes to resolve this
issue can be found at these commits:
https://git.kernel.org/stable/c/73934e535cffbda1490fa97d82690a0f9aa73e94
https://git.kernel.org/stable/c/ff4528bbc82d0d90073751f7b49e7b9e9c7e5638
https://git.kernel.org/stable/c/548812afd96982a76a93ba76c0582ea670c40d9e
https://git.kernel.org/stable/c/3fa640d035e5ae526769615c35cb9ed4be6e3662
Powered by blists - more mailing lists