CVE-2026-89655 in Linux
Сводка
по VulDB • 12.09.2026
В ядре Linux была устранена следующая уязвимость:
ceph: исправление Use-After-Free (UAF) в функции __kick_flushing_caps() при освобождении записи cf во время разблокировки
Макрос list_for_each_entry() перебирает список ci->i_cap_flush_list, но временно снимает блокировку i_ceph_lock для отправки сообщений о правах доступа (capabilities). В период между снятием и повторной установкой блокировки функция handle_cap_flush_ack() может захватить блокировку i_ceph_lock, удалить записи cf с tid <= flush_tid из списка, снять блокировку i_ceph_lock и освободить их через функцию ceph_free_cap_flush() вне какой-либо защиты. Когда исходный поток повторно захватывает блокировку i_ceph_lock и макрос цикла for продвигается вперед посредством вызова cf = list_next_entry(cf, i_list), происходит разыменование указателя cf->i_list.next в уже освобожденной памяти.
Временная диаграмма гонки (race condition):
__kick_flushing_caps() handle_cap_flush_ack() ----------------------- ----------------------- удерживает блокировку i_ceph_lock <--- переходит к записи cf (tid=10) подготавливает сообщение FLUSH снимает блокировку i_ceph_lock <--- __send_cap() ── отправляет FLUSH(tid=10) MDS отправляет ответ FLUSH_ACK(tid=10) ---> захватывает блокировку i_ceph_lock cf->tid(10) <= flush_tid(10), удаляет запись cf из списка i_cap_flush_list снимает блокировку i_ceph_lock вызывает ceph_free_cap_flush(cf) <- освобождает память! повторно захватывает блокировку i_ceph_lock <--- цикл for продвигается: cf = list_next_entry(cf, i_list) -- UAF при обращении к освобожденной памяти cf->i_list.next
Запись cf была только что отправлена самой функцией __kick_flushing_caps через вызов __send_cap(). MDS может ответить сообщением FLUSH_ACK достаточно быстро, так что функция handle_cap_flush_ack() освобождает запись cf до того, как __kick_flushing_caps сможет завершить итерацию.
Исправление заключается в замене цикла на ручной цикл while: сохранение указателя на следующую запись под блокировкой i_ceph_lock перед ее снятием, а затем использование этого сохраненного указателя после повторного захвата блокировки, чтобы потенциально освобожденная запись cf больше никогда не обращалась к памяти.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.