CVE-2022-50526CVE-2022-50526是Linux内核drm/msm/dp(DisplayPort)驱动中存在的一个内存破坏漏洞。该漏洞源于驱动在处理桥接设备(bridge)时,缺少对桥接计数器(bridge counter)的健全性检查(sanity check)。在Linux内核的msm DisplayPort驱动中,桥接数组是一个固定大小的数据结构(最大支持8个桥接器),但当系统中存在超过8个桥接设备时,驱动未能正确限制桥接器的数量,导致数据被写入超出固定大小数组的边界,从而引发内存破坏。攻击者可以利用此漏洞在本地提升权限,导致系统崩溃或执行任意代码。该漏洞的CVSS 3.1评分为7.8分,属于高危级别,攻击向量为本地(AV:L),需要低权限(PR:L),无需用户交互(UI:N),对机密性、完整性和可用性均有高影响(C:H/I:H/A:H)。该漏洞影响使用Qualcomm MSM系列SoC的设备,特别是搭载Adreno GPU的Android设备和嵌入式Linux系统。
在Linux内核的drm/msm/dp驱动中,DisplayPort控制器通过桥接器(bridge)链来管理显示输出。驱动内部使用一个固定大小的数组来存储桥接器指针,该数组的最大容量为8。当系统配置中连接了超过8个桥接设备时,驱动在遍历或注册桥接器的过程中,bridge_count计数器会持续递增而没有上限检查。这导致后续的桥接器指针被写入数组边界之外的内存区域,造成堆内存破坏(heap memory corruption)。具体而言,当bridge_count超过数组容量时,驱动仍然会执行类似`bridge_array[bridge_count++] = bridge`的操作,覆写了相邻的内存数据。这种内存破坏可以被本地攻击者利用,通过精心构造的显示设备拓扑或利用其他内核子系统的漏洞来触发。攻击者可以通过加载特定的显示驱动模块、修改设备树(device tree)配置,或利用udev规则加载恶意桥接器驱动来触发该漏洞。修复方案是在bridge_count达到上限时增加健全性检查,如果超过8个桥接器则返回错误,避免越界写入。