CVE-2026-31656Linux内核中的Intel i915显卡驱动模块存在一个高危安全漏洞。该漏洞源于心跳工作线程与intel_engine_park_heartbeat()函数在处理引擎心跳请求时发生竞态条件。由于读取指针与清空指针的操作是非原子的,导致同一请求可能被两个执行路径同时释放,引发引用计数下溢或释放后使用。本地低权限攻击者可利用此漏洞导致系统崩溃,甚至可能通过内存破坏进一步实现权限提升,严重影响系统的机密性、完整性和可用性。
该漏洞位于Linux内核的drivers/gpu/drm/i915/gt/intel_engine_heartbeat.c文件中。当心跳工作线程检测到请求完成时,会调用i915_request_put()释放请求,并在随后的步骤中清空engine->heartbeat.systole指针。与此同时,在另一个CPU核心上,请求退役流程可能将引擎的唤醒引用计数降为零,触发__engine_park()进而调用intel_engine_park_heartbeat()。如果此时心跳定时器处于挂起状态,cancel_delayed_work()返回真,导致该函数读取到尚未被清空的旧指针,并再次调用i915_request_put()。这种双重释放导致引用计数下溢。修复方案使用xchg()原子指令替换原有的非原子操作,确保读取旧指针和写入NULL的步骤不可分割,从而避免竞态。