net/x25: fix use-after-free in x25_kill_by_neigh()
- Published
- Last modified
- Where the record stands: published, rejected by its publisher, or superseded by another id.What do these mean? →
- published
- Whether CISA lists it in its Known Exploited Vulnerabilities catalog: proof that attackers are using it.What do these mean? →
- Not listed in CISA KEV
- Fix
- Fixed in 5.10.265, 5.15.216, 4.10, 4.15, 4.20, and 3 more
- Whether working attack code is public (Exploit-DB, Metasploit, Nuclei or GitHub). Public code makes attacks easier.What do these mean? →
- None on Exploit-DB, Metasploit or GitHub
Summary
In the Linux kernel, the following vulnerability has been resolved: net/x25: fix use-after-free in x25_kill_by_neigh() x25_kill_by_neigh() walks the global X.25 socket list looking for sockets attached to a terminating neighbour. x25_list_lock protects list membership while the lookup is in progress, but it does not pin a socket's lifetime after the lock is dropped. The function currently drops x25_list_lock before calling lock_sock(s). A concurrent close can run x25_release(), remove the same socket from x25_list, and drop the last socket reference in that window. The neighbour teardown path can then lock or inspect a freed struct sock/struct x25_sock. Take sock_hold(s) while x25_list_lock still proves that the list entry is live, then drop the temporary reference after the socket has been locked, rechecked, and released. Recheck x25_sk(s)->neighbour after lock_sock(), because another path may have disconnected the socket before this path acquired the socket lock. Restart the list walk after each disconnect because the list lock was dropped and the previous iterator state may no longer be valid. A QEMU/KASAN run against origin/master reproduced a slab-use-after-free in x25_kill_by_neigh().
Timeline
- CVE published
- Record last updated
Affected versions
- Linux Linux
From 5.10.110 · fixed in 5.10.265; From 5.15.33 · fixed in 5.15.216; From 4.9.311 · fixed in 4.10; From 4.14.276 · fixed in 4.15; From 4.19.238 · fixed in 4.20; From 5.4.189 · fixed in 5.5; From 5.16.19 · fixed in 5.17; From 5.17.2 · fixed in 5.18
- Linux Linux
5.18
References 8
git.kernel.org
- stable/c/db6b04f6d65549bb1c7bc8e64a92e7b7d03be676
- stable/c/5e8a754ac2009a88a7b99ab61eab6296eed360f3
- stable/c/c98a454d1a9e1bd09d5fd55a7aa589b199340b88
- stable/c/3f4fe26c20c30bd5a2e2583e80685def0b27858c
- stable/c/610678d4be94b619c751572e8a58de705592cd07
- stable/c/ec6d91a1bf2ebd767d3d43f6d249ee0ed3f4558a
- stable/c/9aabda553184346f74810e2ee1d96920b4612e3f
- stable/c/5499e0602d2faafd42c580d25f615903c3fbe11b