CVE-2023-53646CVE-2023-53646是Linux内核drm/i915/perf子系统中存在的一个全局数组越界读取漏洞。该漏洞位于Intel i915图形驱动的性能监控(OA/Observability Architecture)模块中,具体涉及xehp_oa_b_counters数组的定义与使用。问题根源在于传递给reg_in_range_table函数的数组缺少以空记录(sentinel/empty record)作为结束标记的元素,导致函数在遍历数组时越过数组边界,读取未初始化的内存数据。
该漏洞由KASAN(Kernel Address Sanitizer,内核地址 sanitizer)工具检测发现,触发时的调用栈显示在xehp_is_valid_b_counter_addr函数中发生了全局越界读取操作。触发条件为执行perf相关操作(任务名为perf),表明该漏洞可通过Linux的perf性能分析子系统触发。受影响的硬件平台包括Intel Meteor Lake Client Platform(MTL-P)等使用Xe HP架构的集成显卡平台。
该漏洞的CVSS评分为7.1分,属于高危级别。其攻击向量为本地(AV:L),需要低权限(PR:L),无需用户交互(UI:N),对机密性影响为高(C:H),对完整性影响为无(I:N),对可用性影响为高(A:H)。这意味着本地低权限用户可通过利用此漏洞读取内核敏感数据,并可能导致系统崩溃或不可用。该漏洞已在Linux内核稳定版中通过cherry-pick方式修复(原始提交为2f42c5afb34b5696cf5fe79e744f99be9b218798)。
该漏洞的技术原理在于Linux内核i915驱动中xehp_oa_b_counters数组的定义缺少哨兵元素(sentinel)。在Linux内核的reg_in_range_table辅助函数中,其实现逻辑依赖于遍历传入的数组来检查给定地址是否落在某个寄存器范围内。该函数通过检测数组中的空记录(所有字段为零的记录)来判断数组的结束位置。
具体而言,xehp_oa_b_counters数组用于定义Xe HP架构GPU的OA B计数器地址范围。原始代码中该数组以非空记录结束,当xehp_is_valid_b_counter_addr函数遍历该数组时,reg_in_range_table无法找到预期的空哨兵记录,继续读取数组边界之外的全局内存数据,从而触发KASAN检测到的global-out-of-bounds错误。
利用方式方面,攻击者需要在受影响系统上具有本地低权限访问权限,通过执行perf工具或调用内核perf子系统相关接口(如perf_event_open系统调用),触发i915驱动的OA计数器地址验证流程。当内核尝试验证某个OA计数器地址时,会调用xehp_is_valid_b_counter_addr函数,进而触发越界读取。攻击者可利用此漏洞读取内核地址空间中的敏感数据(机密性影响为高),并可能导致内核崩溃(可用性影响为高)。由于该漏洞为读取型漏洞,不涉及数据修改,因此完整性影响为无。