IPBUF安全漏洞报告
English
CVE-2025-71081 CVSS 5.5 中危

CVE-2025-71081: Linux内核ASoC stm32 SAI驱动OF节点泄漏漏洞

披露日期: 2026-01-13
来源: 416baaa9-dc9f-4396-8d5f-8c081fb06d67

漏洞信息

漏洞编号
CVE-2025-71081
漏洞类型
资源泄漏/Use-after-free
CVSS评分
5.5 中危
攻击向量
本地 (AV:L)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Linux kernel ASoC stm32 SAI driver

相关标签

Linux内核资源泄漏Use-after-freeASoC驱动STM32本地提权拒绝服务内核驱动漏洞OF节点设备树

漏洞概述

CVE-2025-71081是Linux内核中ASoC(ALSA System on Chip)stm32 SAI(Serial Audio Interface)驱动的一个资源管理漏洞。该漏洞发生在设备探针(probe)过程中,当驱动对sync provider的OF(Open Firmware)设备树节点获取引用后,未能在所有错误路径上正确释放该引用。具体而言,引用仅在set_sync()回调失败时才会被释放,但如果平台设备探针失败(如probe deferral延迟探针)或驱动解绑时,引用不会被正确释放,导致OF节点泄漏。长期累积可能导致内存泄漏,更危险的是,如果DAI(Digital Audio Interface)在未重新绑定平台驱动的情况下重新探针,可能触发use-after-free漏洞,攻击者可利用此漏洞进行本地权限提升或拒绝服务攻击。该漏洞需要本地访问,攻击复杂度低,但成功利用可造成高可用性影响。

技术细节

该漏洞位于Linux内核的sound/soc/stm/stm32_sai.c文件中。在SAI驱动的probe函数中,代码通过of_parse_phandle()或类似函数获取sync provider的OF节点引用,并将引用计数增加。正常流程中,这个引用应该在驱动卸载或probe失败时通过of_node_put()释放。然而,当前实现仅在set_sync()回调失败时才释放引用,忽略了以下场景:1) platform_driver的probe函数返回错误(如probe deferral);2) driver被unbind时未清理;3) DAI重新probe时旧引用未释放。当这些情况发生时,OF节点的引用计数错误,导致节点无法被正确释放。在Linux设备模型中,OF节点在所有引用释放前不会被回收,因此会持续占用内存。如果后续代码尝试访问已被释放的节点对象,将触发use-after-free,可能导致内核崩溃或任意代码执行。修复方案是在所有可能的错误路径和卸载路径上添加of_node_put()调用,确保引用计数平衡。

攻击链分析

STEP 1
1. 环境准备
攻击者需要本地访问目标Linux系统,具备低权限用户身份,系统需使用stm32平台并启用ASoC SAI驱动
STEP 2
2. 触发驱动探针
通过热插拔、驱动重新加载或设备重新枚举等操作触发SAI驱动的probe流程,造成probe失败或deferral
STEP 3
3. 诱导引用泄漏
在probe过程中触发错误条件(如资源不可用),使probe函数提前返回,但此时OF节点引用未被释放
STEP 4
4. 触发use-after-free
多次重复触发探针操作,导致旧的OF节点对象被释放,但驱动仍持有指向该内存的指针
STEP 5
5. 内存破坏
攻击者通过精心构造的内存布局,触发对已释放OF节点的访问,可能导致内核崩溃或代码执行

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// This is a kernel driver vulnerability that requires no user-space PoC // The fix involves adding proper reference cleanup in the probe error path // Vulnerable code pattern (before fix): int stm32_sai_probe(struct platform_device *pdev) { struct device_node *np = pdev->dev.of_node; struct device_node *sync_provider; // Get reference to sync provider OF node - reference count incremented sync_provider = of_parse_phandle(np, "stm32,sai-syncmaster", 0); if (!sync_provider) return -EINVAL; // This reference is only released if set_sync() fails if (set_sync(sync_provider) < 0) { of_node_put(sync_provider); // Reference released here return -EINVAL; } // If probe fails here or driver unbinds, reference is leaked! return 0; } // Fixed code pattern (after fix): int stm32_sai_probe(struct platform_device *pdev) { struct device_node *np = pdev->dev.of_node; struct device_node *sync_provider; int ret; sync_provider = of_parse_phandle(np, "stm32,sai-syncmaster", 0); if (!sync_provider) return -EINVAL; ret = set_sync(sync_provider); if (ret < 0) { of_node_put(sync_provider); // Release on error return ret; } // Store sync_provider reference properly for cleanup // and ensure of_node_put() is called on probe failure or driver unbind return 0; }

影响范围

Linux kernel 5.15.x < 5.15.x特定提交版本
Linux kernel 6.1.x < 6.1.x特定提交版本
Linux kernel 6.6.x < 6.6.x特定提交版本
Linux kernel 6.12.x < 6.12.x特定提交版本
使用stm32 SAI驱动的嵌入式Linux系统

防御指南

临时缓解措施
在无法立即升级内核的情况下,可采取以下临时缓解措施:1) 评估系统是否实际使用stm32 SAI音频功能,如不使用可通过内核配置禁用CONFIG_SND_STM32_SAI;2) 限制非特权用户对设备节点的访问权限;3) 避免频繁的热插拔和驱动重新加载操作;4) 使用内核模块参数或sysfs接口防止驱动动态卸载和重新加载;5) 部署内核运行时完整性监控工具检测异常行为;6) 考虑使用容器或虚拟机隔离高风险服务。

参考链接

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