CVE-2025-22126
Severity CVSS v4.0:
Pending analysis
Type:
Unavailable / Other
Publication date:
16/04/2025
Last modified:
25/04/2025
Description
In the Linux kernel, the following vulnerability has been resolved:<br />
<br />
md: fix mddev uaf while iterating all_mddevs list<br />
<br />
While iterating all_mddevs list from md_notify_reboot() and md_exit(),<br />
list_for_each_entry_safe is used, and this can race with deletint the<br />
next mddev, causing UAF:<br />
<br />
t1:<br />
spin_lock<br />
//list_for_each_entry_safe(mddev, n, ...)<br />
mddev_get(mddev1)<br />
// assume mddev2 is the next entry<br />
spin_unlock<br />
t2:<br />
//remove mddev2<br />
...<br />
mddev_free<br />
spin_lock<br />
list_del<br />
spin_unlock<br />
kfree(mddev2)<br />
mddev_put(mddev1)<br />
spin_lock<br />
//continue dereference mddev2->all_mddevs<br />
<br />
The old helper for_each_mddev() actually grab the reference of mddev2<br />
while holding the lock, to prevent from being freed. This problem can be<br />
fixed the same way, however, the code will be complex.<br />
<br />
Hence switch to use list_for_each_entry, in this case mddev_put() can free<br />
the mddev1 and it&#39;s not safe as well. Refer to md_seq_show(), also factor<br />
out a helper mddev_put_locked() to fix this problem.
Impact
References to Advisories, Solutions, and Tools
- https://git.kernel.org/stable/c/5462544ccbad3fc938a71b01fa5bd3a0dc2b750a
- https://git.kernel.org/stable/c/8542870237c3a48ff049b6c5df5f50c8728284fa
- https://git.kernel.org/stable/c/ca9f84de76723b358dfc0606668efdca54afc2e5
- https://git.kernel.org/stable/c/d69a23d8e925f8052d657652a6875ec2712c7e33
- https://git.kernel.org/stable/c/e2a9f73ee408a460f4c9dfe03b4741d6b11652b8