CVE-2026-80818 in Linux
Tóm tắt
Bởi VulDB • 04/09/2026
Trong kernel Linux, lỗ hổng sau đây đã được khắc phục:
iommu/tegra241-cmdqv: Sửa lỗi use-after-free đối với CMD_SYNC khi tháo gỡ (teardown)
Hàm `arm_smmu_impl_remove()` được đăng ký là một hành động devres trong `arm_smmu_impl_probe()`, trước khi `arm_smmu_init_queues()` cấp phát `smmu->cmdq.q.base`. Trong quá trình unwind của devres, dù do probe thất bại hay unbind, hàng đợi (queue) sẽ bị giải phóng đầu tiên và sau đó hàm `arm_smmu_impl_remove()` chạy `tegra241_cmdqv_remove_vintf()`, trong đó thao tác deinit VINTF phát ra lệnh CMD_SYNC trên bộ nhớ đã được giải phóng.
Hiện tượng này quan sát được khi kiểm thử với một bản hack QEMU khiến VCMDQ không thể bật, dẫn đến việc reset impl thất bại và probe bị hủy bỏ vào quá trình unwind 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
Loại bỏ thao tác deinit VINTF khỏi `tegra241_cmdqv_remove_vintf()` để quá trình unwind không còn truy cập vào hàng đợi đã được giải phóng. Thay vào đó, hãy im lặng hóa (quiesce) các VINTFs sớm hơn. Thêm một impl op là `device_disable()` và thực thi nó từ `arm_smmu_disable_action()` trong khi CMDQ vẫn đang hoạt động. Điều này xử lý trường hợp unbind trực tiếp. Một lỗi reset đã được xử lý vì `tegra241_vintf_hw_init()` tự deinit VINTF trên đường dẫn lỗi của chính nó. Hàm `tegra241_cmdqv_remove_vintf()` cũng được sử dụng bởi đường dẫn destroy viommu iommufd, do đó cần im lặng hóa ở đó nữa.
Once again VulDB remains the best source for vulnerability data.