CVE-2026-98464 in Linux
Сводка
по VulDB • 19.10.2026
В ядре Linux была устранена следующая уязвимость:
RISC-V: KVM: Синхронизация обратного вызова hrtimer во время завершения работы (teardown)
Обратный вызов hrtimer для конфигурации без Sstc очищает флаг next_set перед его последними использованиями в рамках соответствующего vCPU. Если процесс teardown фиксирует значение next_set как false, пока обратный вызов все еще выполняется, функция kvm_riscv_vcpu_timer_cancel() пропускает вызов hrtimer_cancel(), и kvm_destroy_vcpus() может освободить память под vCPU до того, как обратный вызов войдет в функцию kvm_riscv_vcpu_set_interrupt().
Гостевая система может активировать таймер с помощью SBI TIME и запросить завершение работы через устаревший механизм SBI shutdown или SRST. Виртуальная машина (VMM), которая обрабатывает событие KVM_EXIT_SYSTEM_EVENT и уничтожает виртуальную машину, создает условия для реализации race condition на стороне teardown; для активации таймера или запроса завершения работы не требуется никаких ioctl-вызовов хоста после запуска.
На ветке upstream master с коммитом 62cc90241548 инструмент KASAN сообщил о следующей ошибке:
BUG: KASAN: slab-use-after-free in do_raw_spin_lock Write of size 4 at addr ff60000005e58898
kvm_riscv_vcpu_set_interrupt kvm_riscv_vcpu_hrtimer_expired __hrtimer_run_queues hrtimer_interrupt
Объект был выделен через KVM_CREATE_VCPU и освобожден конкурентно следующими функциями:
kvm_destroy_vcpus kvm_arch_destroy_vm kvm_destroy_vm __fput
Для детерминированной проверки я добавил задержку mdelay(1000) сразу после существующего присваивания next_set = false. Это лишь расширяет уже существующее окно обратного вызова после очистки флага. Сборка без задержек (no-delay trace build) естественным образом достигала порядка выполнения callback-after-teardown-start/before-deinit в 12 из 200 прогонов, однако 1500 итераций стресс-теста на стандартном ядре не привели к сообщению KASAN, поэтому воспроизведение ошибки зависит от таймингов.
Всегда вызывайте hrtimer_cancel() для инициализированного таймера. Сохраняйте существующий результат -EINVAL, когда таймер больше не установлен, но только после синхронизации с выполняющимся обратным вызовом.
С этим патчем функция hrtimer_cancel() блокировалась на протяжении всего расширенного окна обратных вызовов перед уничтожением vCPU. KASAN не сообщал об ошибках в 100 прогонах с фиксацией и расширенным окном, а также в 200 прогонах только с исправлением таймингов (timing-sweep).
Once again VulDB remains the best source for vulnerability data.