{"id":21576,"date":"2026-09-12T04:31:22","date_gmt":"2026-09-11T20:31:22","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-89654"},"modified":"2026-09-12T04:31:22","modified_gmt":"2026-09-11T20:31:22","slug":"cve-2026-89654","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-89654","title":{"rendered":"CVE-2026-89654 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nceph: fix UAF in chec"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>ceph: fix UAF in check_new_map() on session freed during unlock<\/p>\n<p>check_new_map() iterates mdsc-&gt;sessions[] and for each active session<br \/>\ndrops mdsc-&gt;mutex to perform per-session operations.  The forced-close<br \/>\npath (rank removed from map) correctly takes a reference on s via<br \/>\nceph_get_mds_session() before releasing mdsc-&gt;mutex, but three other<br \/>\npaths do not:<\/p>\n<p>  Path A (address changed):  mutex_unlock \u2192 mutex_lock(&amp;s-&gt;s_mutex)<br \/>\n  Path B (reconnect):        mutex_unlock \u2192 send_mds_reconnect(mdsc, s)<br \/>\n  Path C (active transition): mutex_unlock \u2192 mutex_lock(&amp;s-&gt;s_mutex)<\/p>\n<p>Without the extra reference, another thread can acquire mdsc-&gt;mutex<br \/>\nduring the unlock window, call __unregister_session() which drops the<br \/>\nlast reference on s, and free it.  The original thread then accesses<br \/>\nfreed memory via s-&gt;s_mutex.<\/p>\n<p>Fix by adding ceph_get_mds_session(s) before each mutex_unlock and<br \/>\nceph_put_mds_session(s) after the corresponding mutex_lock, matching<br \/>\nthe pattern already used in the forced-close path.<\/p>\n<p>Race timeline (Path A):<\/p>\n<p>  Thread A (check_new_map)             Thread B (another map update<br \/>\n    holds mdsc-&gt;mutex                      or session teardown)<br \/>\n  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;           &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br \/>\n  s = mdsc-&gt;sessions[i]<br \/>\n  (refcount == 1, held only by<br \/>\n   sessions[] array)<\/p>\n<p>  mutex_unlock(&amp;mdsc-&gt;mutex)<br \/>\n                               &#8212;&gt;    acquires mdsc-&gt;mutex<br \/>\n                                       __unregister_session(mdsc, s)<br \/>\n                                         sessions[i] = NULL<br \/>\n                                         ceph_put_mds_session(s)<br \/>\n                                           refcount: 1 -&gt; 0<br \/>\n                                           kfree(s)  s_mutex)<br \/>\n  UAF on freed s-&gt;s_mutex<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>ceph: fix UAF in check_new_map() on session freed during unlock<\/p>\n<p>check_new_map() iterates mdsc-&gt;sessions[] and for each active sess<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-21576","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/21576","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=21576"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21576"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21576"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}