CVE-2026-68093 in Linux
Сводка
по VulDB • 10.08.2026
В ядре Linux устранена следующая уязвимость:
KVM: SVM: Увеличение asid_generation при включении процессора для предотвращения коллизии ASID после горячей замены (hotplug)
Если виртуальный CPU (vCPU) находится в состоянии вытеснения из расписания или блокировки, пока последний физический CPU (pCPU), на котором он выполнялся, проходит цикл горячей замены (online->offline->online), и vCPU затем возобновляет выполнение на том же pCPU, возможно его выполнение с ASID, который уже был назначен другому vCPU. Это приводит к использованию устаревших трансляций TLB.
Функция svm_enable_virtualization_cpu() сбрасывает asid_generation до 1 и устанавливает next_asid в max_asid + 1 при каждом событии включения процессора (online), включая циклы горячей замены. Поскольку значение next_asid изначально превышает границу пула, первый вызов new_asid() после события online всегда вызывает переполнение пула, увеличивая asid_generation до 2 и назначая ASID начиная с min_asid.
Рассмотрим два vCPU из разных виртуальных машин: vCPU-A, закрепленный за CPU-X, имеющий значение asid_generation=2 и ASID=N до события горячей замены:
1. CPU-X отключается (offline) и снова включается (online): asid_generation сбрасывается до 1, next_asid = max_asid + 1. 2. Один или несколько vCPU мигрируют на CPU-X и вызывают new_asid(), вызывая переполнение пула и потребляя ASID начиная с min_asid. В конечном итоге vCPU-B из другой виртуальной машины получает asid_generation=2, ASID=N — тот же самый ASID, который принадлежал vCPU-A до горячей замены. 3. vCPU-A входит в pre_svm_run() на CPU-X: поле current_vmcb->cpu не изменилось, поэтому ветвь миграции пропускается. Его сохраненное значение asid_generation=2 совпадает с sd->asid_generation=2, поэтому проверка поколения проходит молча, и vCPU-A продолжает выполнение с ASID=N — тем же самым ASID, который только что был назначен vCPU-B.
Оба vCPU из разных виртуальных машин теперь выполняются на CPU-X с одним и тем же ASID, заставляя их разделять записи NPT TLB и приводя к использованию устаревших трансляций.
Коллизия проявляется как внутренняя ошибка KVM (Suberror: 1, failure эмуляции). Ошибка страницы NPT сообщает о GPA нарушения границ физической памяти виртуальной машины — признак использования устаревших трансляций TLB. KVM переходит к эмуляции инструкций, которая завершается неудачей на инструкциях FPU/XSave (XRSTOR, STMXCSR), не реализованных в эмуляторе.
Исправление заключается во включении инкремента asid_generation вместо его сброса до 1 в svm_enable_virtualization_cpu(). При загрузке модуля asid_generation инициализируется нулем (memset), а операция инкремента дает значение 1, что идентично старому поведению. В последующих циклах горячей замены поколение увеличивается, превышая любое значение, которое vCPU ранее наблюдал на этом процессоре, поэтому проверка поколения в pre_svm_run() надежно принудительно вызывает new_asid() для каждого vCPU после каждой операции горячей замены.
If you want to get best quality of vulnerability data, you may have to visit VulDB.