CVE-2025-39935CVE-2025-39935是Linux内核ASoC(ALSA System on Chip)子系统中sma1307音频编解码器驱动存在的一个高危内存损坏漏洞。该漏洞位于`sma1307_setting_loaded()`函数中,由于开发者在分配内存时混淆了元素数量与字节大小的概念,导致堆缓冲区溢出问题。具体而言,`sma1307->set.header_size`表示头部包含的整数个数(实际为8个),但代码错误地使用`devm_kzalloc()`分配了仅8字节的内存空间,而非8个整数所需的32字节(64位系统)或16字节(32位系统)。随后,代码通过`memcpy()`将`header_size * sizeof(int)`大小的数据复制到该缓冲区中,从而导致超出分配范围的内存写入,造成堆内存损坏。该漏洞的CVSS评分为7.8,属于高危级别,攻击者需要本地低权限访问即可利用,无需用户交互,成功利用后可对机密性、完整性和可用性造成高影响。该漏洞影响所有包含sma1307编解码器驱动的Linux内核版本,已在稳定内核分支中通过补丁修复。
该漏洞的根本原因在于`sma1307_setting_loaded()`函数中的内存分配逻辑错误。`sma1307->set.header_size`字段表示头部数据结构中包含的整数元素数量(值为8),但在分配内存时代码使用了`devm_kzalloc(dev, sma1307->set.header_size, GFP_KERNEL)`,这仅分配了8字节的内存空间。随后执行的`memcpy(sma1307->set.header, data, sma1307->set.header_size * sizeof(int))`操作会尝试复制`8 * sizeof(int)`即32字节(64位系统)的数据到仅8字节的缓冲区中,导致24字节的堆缓冲区溢出。攻击者可通过以下方式利用此漏洞:首先需要本地访问系统并具有低权限(PR:L),通过加载或触发sma1307编解码器驱动的设置加载流程(例如通过ALSA音频子系统交互或特定的设备配置操作),使内核执行`sma1307_setting_loaded()`函数。攻击者可以构造恶意的设置数据,使memcpy操作覆盖相邻的堆内存结构,可能导致内核崩溃(拒绝服务)、权限提升或任意代码执行。修复方案是将`devm_kzalloc()`替换为`devm_kmalloc_array()`,后者会根据元素数量自动计算正确的分配大小,同时由于memcpy会立即覆盖分配的内存,无需在分配时进行零初始化。