CVE-2023-53638CVE-2023-53638是Linux内核中octeon_ep网络设备驱动存在的一个高危释放后使用(Use-After-Free)漏洞。该漏洞位于Linux内核的octeon_ep模块中,具体涉及驱动探测(probe)阶段的错误处理路径。当octep_probe函数在获取设备MAC地址失败时,会直接退出函数,但此时已入队的延迟工作项(delayed work)intr_poll_task并未被取消。当该延迟工作项稍后运行时,由于相关设备结构体已被释放,将触发释放后使用漏洞,可能导致内核崩溃、信息泄露或权限提升。
该漏洞的CVSS 3.1评分为7.8,属于高危级别。攻击者需要本地低权限访问权限,无需用户交互即可利用。漏洞的成功利用可能造成高机密性影响、高完整性影响和高可用性影响。由于octeon_ep驱动用于Marvell Octeon系列网络处理器,该漏洞主要影响使用此类硬件加速器的服务器和嵌入式系统。
此漏洞的修复方案是将intr_poll_task的取消操作从octep_remove函数移至octep_device_cleanup函数中。由于octep_device_cleanup函数在probe错误路径中也会被调用,这样可以确保在probe失败时也能正确取消已入队的工作项,避免释放后使用问题的发生。值得注意的是,ctrl_mbox_task的取消操作必须放在intr_poll_task之后,因为ctrl_mbox_task可能由intr_poll_task入队。
该漏洞的技术原理涉及Linux内核中的工作队列(workqueue)机制和驱动生命周期管理。具体分析如下:
1. **漏洞触发条件**:在octeon_ep驱动的probe阶段,当调用获取设备MAC地址的接口失败时,probe函数会跳转到错误处理路径并退出,但未取消已经入队的延迟工作项intr_poll_task。
2. **释放后利用过程**:probe失败后,内核会释放与设备关联的octep_device结构体内存。然而,之前入队的intr_poll_task延迟工作项仍然存在于系统工作队列中。当定时器到期或工作队列调度执行该任务时,intr_poll_task将尝试访问已经被释放的octep_device结构体内容,从而触发use-after-free漏洞。
3. **利用方式**:攻击者可以通过以下方式触发该漏洞:
- 在具有低权限本地访问权限的系统中,触发octeon_ep设备的probe流程;
- 通过某种方式使MAC地址获取操作失败(例如硬件故障模拟或特定配置);
- 等待延迟工作项执行,此时将访问已释放的内存;
- 通过精心构造的内存布局,攻击者可以在被释放的内存中放置恶意数据,实现代码执行或权限提升。
4. **修复方案**:将cancel_delayed_work_sync(&oct->intr_poll_task)从octep_remove函数移至octep_device_cleanup函数。由于octep_device_cleanup在probe错误路径和remove正常路径中都会被调用,因此可以确保工作项在所有退出路径上都被正确取消。同时,ctrl_mbox_task的取消必须放在intr_poll_task之后执行,因为前者可能被后者入队。