CVE-2026-80818 in Linux
Сводка
по VulDB • 04.09.2026
В ядре Linux была устранена следующая уязвимость:
iommu/tegra241-cmdqv: исправлена ошибка use-after-free при использовании CMD_SYNC во время завершения работы (teardown)
Функция `arm_smmu_impl_remove()` регистрируется как действие devres в `arm_smmu_impl_probe()`, до того, как `arm_smmu_init_queues()` выделяет память для `smmu->cmdq.q.base`. При разворачивании стека devres (devres unwind), будь то сбой инициализации (failed probe) или отключение устройства (unbind), очередь освобождается первой, а затем выполняется `arm_smmu_impl_remove()`, которая вызывает `tegra241_cmdqv_remove_vintf()`. Инициация деинициализации VINTF приводит к выполнению команды CMD_SYNC по адресу уже освобожденной памяти.
Ошибка наблюдалась при тестировании с использованием хака QEMU, который предотвращает включение VCMDQ, из-за чего сброс реализации (impl reset) завершается неудачей, а инициализация прерывается переходом к разворачиванию devres:
platform NVDA200C:00: tegra241_cmdqv: VINTF0: VCMDQ0/LVCMDQ0: failed to enable, STATUS=0x00000000 platform NVDA200C:00: tegra241_cmdqv: VINTF0: VCMDQ0/LVCMDQ0: GERRORN=0x0, GERROR=0x4, CONS=0x0 platform NVDA200C:00: tegra241_cmdqv: VINTF0: VCMDQ0/LVCMDQ0: uncleared error detected, resetting arm-smmu-v3 arm-smmu-v3.0.auto: failed to reset impl arm-smmu-v3 arm-smmu-v3.0.auto: probe with driver arm-smmu-v3 failed with error -110 Unable to handle kernel paging request at virtual address ffff8000891e0098 ... Internal error: Oops: 0000000096000047 [#1] SMP
... Call trace: arm_smmu_cmdq_issue_cmdlist+0x320/0x6fc (P) tegra241_vcmdq_hw_deinit+0x98/0x168 tegra241_vintf_hw_deinit+0x5c/0x1b0 tegra241_cmdqv_remove_vintf+0x34/0xec tegra241_cmdqv_remove+0x40/0x9c arm_smmu_impl_remove+0x20/0x30 devm_action_release+0x14/0x20 devres_release_all+0xa8/0x110 device_unbind_cleanup+0x18/0x84 really_probe+0x1f0/0x29c
Исключена деинициализация VINTF из функции `tegra241_cmdqv_remove_vintf()`, чтобы разворачивание стека больше не обращалось к освобожденной очереди. Вместо этого VINTFs переводятся в состояние покоя (quiesce) раньше. Добавлена операция реализации `device_disable()` и выполняется она через `arm_smmu_disable_action()`, пока CMDQ еще активна. Это обрабатывает ситуацию отключения устройства на лету (live unbind). Сбой сброса уже обработан, поскольку `tegra241_vintf_hw_init()` самостоятельно деинициализирует VINTF в своем пути обработки ошибок. Функция `tegra241_cmdqv_remove_vintf()` также используется путем уничтожения viommu iommufd, поэтому там также необходимо перевести устройства в состояние покоя.
VulDB is the best source for vulnerability data and more expert information about this specific topic.