{"id":15081,"date":"2026-09-04T19:02:24","date_gmt":"2026-09-04T11:02:24","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-64112"},"modified":"2026-09-04T19:02:24","modified_gmt":"2026-09-04T11:02:24","slug":"cve-2026-64112","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-64112","title":{"rendered":"CVE-2026-64112 [HIGH] &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nrbd: eliminate a race"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>rbd: eliminate a race in lock_dwork draining on unmap<\/p>\n<p>Given how rbd_lock_add_request() and rbd_img_exclusive_lock() are<br \/>\nwritten, lock_dwork may be (re)queued more than it&#8217;s actually needed:<br \/>\nfor example in case a new I\/O request comes in while we are in the<br \/>\nmiddle of rbd_acquire_lock() on behalf of another I\/O request.  This is<br \/>\nexpected and with rbd_release_lock() preemptively canceling lock_dwork<br \/>\nis benign under normal operation.<\/p>\n<p>A more problematic example is maybe_kick_acquire():<\/p>\n<p>    if (have_requests || delayed_work_pending(&amp;rbd_dev-&gt;lock_dwork)) {<br \/>\n            dout(&#8220;%s rbd_dev %p kicking lock_dworkn&#8221;, __func__, rbd_dev);<br \/>\n            mod_delayed_work(rbd_dev-&gt;task_wq, &amp;rbd_dev-&gt;lock_dwork, 0);<br \/>\n    }<\/p>\n<p>It&#8217;s not unrealistic for lock_dwork to get canceled right after<br \/>\ndelayed_work_pending() returns true and for mod_delayed_work() to<br \/>\nrequeue it right there anyway.  This is a classic TOCTOU race.<\/p>\n<p>When it comes to unmapping the image, there is an implicit assumption<br \/>\nof no self-initiated exclusive lock activity past the point of return<br \/>\nfrom rbd_dev_image_unlock() which unlocks the lock if it happens to be<br \/>\nheld.  This unlock is assumed to be final and lock_dwork (as well as<br \/>\nall other exclusive lock tasks, really) isn&#8217;t expected to get queued<br \/>\nagain.  However, lock_dwork is canceled only in cancel_tasks_sync()<br \/>\n(i.e. later in the unmap sequence) and on top of that the cancellation<br \/>\ncan get in effect nullified by maybe_kick_acquire().  This may result<br \/>\nin rbd_acquire_lock() executing after rbd_dev_device_release() and<br \/>\nrbd_dev_image_release() run and free and\/or reset a bunch of things.<br \/>\nOne of the possible failure modes then is a violated<\/p>\n<p>    rbd_assert(rbd_image_format_valid(rbd_dev-&gt;image_format));<\/p>\n<p>in rbd_dev_header_info() which is called via rbd_dev_refresh() from<br \/>\nrbd_post_acquire_action().<\/p>\n<p>Redo exclusive lock task draining to provide saner semantics and try<br \/>\nto meet the assumptions around rbd_dev_image_unlock().<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>rbd: eliminate a race in lock_dwork draining on unmap<\/p>\n<p>Given how rbd_lock_add_request() and rbd_img_exclusive_lock() are<br \/>\nwritten, l<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-15081","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/15081","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=15081"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=15081"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=15081"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}