CVE-2022-50540CVE-2022-50540是Linux内核dmaengine子系统中qcom-adm(Qualcomm ADM DMA)驱动的一个高危漏洞。该漏洞位于slave_config函数中,由于开发者在编写代码时错误地使用了sizeof操作符,将peripheral_size与配置结构体指针的大小进行比较,而不是与配置结构体本身的大小进行比较。这种类型混淆导致crci(Command Rate Change Index)值被忽略,进而在使用adm驱动的任何从设备上触发内核崩溃(kernel panic)。该漏洞于2022年报告,但由于各种原因直到2025年10月7日才正式披露。CVSS评分为5.5分,属于中危级别,攻击者需要本地低权限访问即可触发该漏洞,无需用户交互。漏洞的成功利用将导致系统可用性完全丧失,可能造成拒绝服务攻击。由于该漏洞影响Linux内核的DMA引擎驱动,属于底层硬件抽象层组件,因此影响范围涵盖了所有使用Qualcomm ADM DMA控制器的高通平台设备,包括众多Android智能手机、嵌入式设备以及服务器平台。该漏洞的修复涉及对sizeof比较操作的简单更正,属于典型的代码审查遗漏问题,但其影响却十分严重,可能导致整个系统不可用。
该漏洞的技术根源在于Linux内核dmaengine qcom-adm驱动的slave_config回调函数中。DMA(Direct Memory Access)引擎是系统中负责在外设和内存之间传输数据的硬件组件,qcom-adm是高通平台特有的DMA控制器驱动。在slave_config函数中,开发者需要验证外设配置的peripheral_size字段是否合法,正确的做法是将其与struct dma_slave_config结构体的大小进行比较。然而,由于疏忽,代码错误地使用了sizeof(config_ptr)而非sizeof(struct dma_slave_config),在64位系统上,前者为8字节,后者通常远大于8字节,导致验证逻辑失效。攻击者(或正常的外设驱动调用)可以传入任意大小的peripheral_size值,该值会被接受并用于后续的DMA配置操作。由于crci值被错误忽略,DMA控制器可能被错误配置,最终触发内核空指针解引用或非法内存访问,导致kernel panic。漏洞利用条件相对简单:攻击者只需拥有本地系统的低权限访问权限(如普通用户账户),通过加载特定的内核模块或调用相关的IOCTL接口即可触发该漏洞。由于无需用户交互且攻击复杂度低,该漏洞可被用于本地权限提升或拒绝服务攻击。修复方法是将sizeof比较操作更正为正确比较结构体大小。