In the Linux kernel, the following vulnerability has been resolved:
nfsd: fix management of listener transports
Currently, when no active threads are running, a root user using nfsdctl command can try to remove a particular listener from the list of previously added ones, then start the server by increasing the number of threads, it leads to the following problem:
[ 158.835354] refcountt: addition on 0; use-after-free. [ 158.835603] WARNING: CPU: 2 PID: 9145 at lib/refcount.c:25 refcountwarnsaturate+0x160/0x1a0 [ 158.836017] Modules linked in: rpcrdma rdmacm iwcm ibcm ibcore nfsd authrpcgss nfsacl lockd grace overlay isofs uinput sndseqdummy sndhrtimer nftfibinet nftfibipv4 nftfibipv6 nftfib nftrejectinet nfrejectipv4 nfrejectipv6 nftreject nftct nftchainnat nfnat nfconntrack nfdefragipv6 nfdefragipv4 rfkill ipset nftables qrtr sunrpc vfat fat uvcvideo videobuf2vmalloc videobuf2memops uvc videobuf2v4l2 videodev videobuf2common sndhdacodecgeneric mc e1000e sndhdaintel sndinteldspcfg sndhdacodec sndhdacore sndhwdep sndseq sndseqdevice sndpcm sndtimer snd soundcore sg loop dmmultipath dmmod nfnetlink vsockloopback vmwvsockvirtiotransportcommon vmwvsockvmcitransport vmwvmci vsock xfs libcrc32c crct10difce ghashce vmwgfx sha2ce sha256arm64 srmod sha1ce cdrom nvme drmclientlib drmttmhelper ttm nvmecore drmkmshelper nvmeauth drm fuse [ 158.840093] CPU: 2 UID: 0 PID: 9145 Comm: nfsd Kdump: loaded Tainted: G B W 6.13.0-rc6+ #7 [ 158.840624] Tainted: [B]=BADPAGE, [W]=WARN [ 158.840802] Hardware name: VMware, Inc. VMware20,1/VBSA, BIOS VMW201.00V.24006586.BA64.2406042154 06/04/2024 [ 158.841220] pstate: 61400005 (nZCv daif +PAN -UAO -TCO +DIT -SSBS BTYPE=--) [ 158.841563] pc : refcountwarnsaturate+0x160/0x1a0 [ 158.841780] lr : refcountwarnsaturate+0x160/0x1a0 [ 158.842000] sp : ffff800089be7d80 [ 158.842147] x29: ffff800089be7d80 x28: ffff00008e68c148 x27: ffff00008e68c148 [ 158.842492] x26: ffff0002e3b5c000 x25: ffff600011cd1829 x24: ffff00008653c010 [ 158.842832] x23: ffff00008653c000 x22: 1fffe00011cd1829 x21: ffff00008653c028 [ 158.843175] x20: 0000000000000002 x19: ffff00008653c010 x18: 0000000000000000 [ 158.843505] x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000 [ 158.843836] x14: 0000000000000000 x13: 0000000000000001 x12: ffff600050a26493 [ 158.844143] x11: 1fffe00050a26492 x10: ffff600050a26492 x9 : dfff800000000000 [ 158.844475] x8 : 00009fffaf5d9b6e x7 : ffff000285132493 x6 : 0000000000000001 [ 158.844823] x5 : ffff000285132490 x4 : ffff600050a26493 x3 : ffff8000805e72bc [ 158.845174] x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffff000098588000 [ 158.845528] Call trace: [ 158.845658] refcountwarnsaturate+0x160/0x1a0 (P) [ 158.845894] svcrecv+0x58c/0x680 [sunrpc] [ 158.846183] nfsd+0x1fc/0x348 [nfsd] [ 158.846390] kthread+0x274/0x2f8 [ 158.846546] retfrom_fork+0x10/0x20 [ 158.846714] ---[ end trace 0000000000000000 ]---
nfsdnllistenersetdoit() would manipulate the list of transports of server's svpermsocks and close the specified listener but the other list of transports (server's spxprts list) would not be changed leading to the problem above.
Instead, determined if the nfsdctl is trying to remove a listener, in which case, delete all the existing listener transports and re-create all-but-the-removed ones.