CVE-2023-53552CVE-2023-53552是Linux内核drm/i915图形驱动子系统中存在的一个高危释放后使用(Use-After-Free)漏洞。该漏洞位于i915图形驱动对GuC(Graphics microController)虚拟引擎的处理逻辑中。当用户空间通过sync_file或dmabuf(dma-resv)机制持有对i915_request的引用时,这些引用可能会被跨进程无限期地持有。为了避免内存泄漏,内核尝试在request完成后不再保留对其的引用。然而,在fence释放时需要判断rq->engine是否有效且指向硬件引擎(对于非虚拟请求为true)。在GuC虚拟引擎场景下,由于缺少对虚拟引擎的标记机制,导致在request完成后,rq->engine指针可能指向已被释放的虚拟引擎内存区域,从而触发释放后使用漏洞。该漏洞CVSS评分为7.8,属于高危级别,攻击者需要本地低权限访问即可利用,可能导致权限提升、系统崩溃或任意代码执行。该漏洞影响了多个Linux内核稳定版本,已通过cherry-pick方式从上游提交280410677af763f3871b93e794a199cfcf6fb580回溯修复。
该漏洞的根本原因在于i915驱动中对GuC虚拟引擎的生命周期管理不当。具体技术细节如下:
1. **引用持有机制**:i915_request对象可能被用户空间通过sync_file或dmabuf(dma-resv)机制捕获并持有,这些引用可以跨进程传递并长期存在。
2. **内存回收策略**:为防止内存泄漏,内核在request完成后会尝试释放对request的内部引用,但这可能导致rq->engine指针指向的引擎结构已被回收。
3. **fence释放逻辑缺陷**:在fence释放回调中,代码需要通过rq->engine判断是否指向有效的硬件引擎。对于非虚拟请求,rq->execution_mask可以准确反映引擎类型;但对于GuC虚拟引擎请求,由于未做特殊标记,代码无法区分虚拟引擎和物理引擎,导致在访问rq->engine时可能触发释放后使用。
4. **修复方案**:通过在rq->execution_mask中增加额外位来标记虚拟引擎,使得在fence释放时能够正确识别虚拟引擎请求,避免访问已释放的引擎结构。
5. **利用方式**:本地攻击者可通过构造特定的GPU命令序列,触发虚拟引擎的request创建和完成流程,在fence释放时触发UAF漏洞,实现内核代码执行或权限提升。