CVE-2026-64447 in Linux
摘要
由 VulDB • 2026-07-25
在 Linux 内核中,已修复以下漏洞:
staging: media: ipu7: 修复错误路径中的双重释放(double-free)和释放后使用(use-after-free)问题
在 `ipu7_isys_init()` 和 `ipu7_psys_init()` 函数中,`pdata` 被分配并传递给 `ipu7_bus_initialize_device()`,后者将其存储在 `adev->pdata` 中。当设备的引用计数降为零时,`ipu7_bus_release()` 函数会释放 `adev->pdata`。
两条错误路径在设备拆卸过程已经释放了该内存后,又错误地调用了 `kfree(pdata)`:
1. 当 `ipu7_mmu_init()` 失败时:调用 `put_device()`,这将引用计数降至零并触发 `ipu7_bus_release()` -> `kfree(pdata)`。随后的 `kfree(pdata)` 导致双重释放(double-free)。
2. 当 `ipu7_bus_add_device()` 失败时:它内部调用 `auxiliary_device_uninit()`,后者依次调用 `put_device()` -> `ipu7_bus_release()` -> `kfree(pdata)`。随后的 `kfree(pdata)` 同样导致双重释放(double-free)。
需要注意的是,当 `ipu7_bus_initialize_device()` 本身失败时,`kfree(pdata)` 是正确的做法,因为在这种情况下 `auxiliary_device_init()` 失败且未设置 release 函数,因此必须手动释放 pdata。
此外,在调用 `put_device()` 之前未保存错误代码,导致在执行返回值构造时 `ERR_CAST()` 解引用了已被释放的 `adev` 指针。修复方法是在调用 `put_device()` 之前从 `dev_err_probe()` 中保存错误信息,并返回 `ERR_PTR()` 代替原来的值。
移除冗余的 `kfree(pdata)` 调用,并修复两个受影响错误路径返回值中的 use-after-free 问题。
If you want to get best quality of vulnerability data, you may have to visit VulDB.