CVE-2026-31768Linux内核中的iio: adc: ti-adc161s626驱动程序存在一个安全漏洞。该驱动程序在调用spi_read()时使用了栈内存作为缓冲区,而SPI传输要求缓冲区必须是DMA安全的。使用不安全的栈内存可能导致数据损坏或信息泄露。该漏洞已通过引入DMA安全的缓冲区(u8数组)并修改转换函数来解决,替代了原有栈上的__be16和__be32变量。
该漏洞的根本原因在于Linux内核驱动开发中对DMA缓冲区规则的违反。SPI控制器在进行数据传输时,如果启用了DMA功能,会直接对系统内存进行读写,绕过CPU。因此,传递给SPI API的缓冲区必须位于内核的DMA安全区域。ti-adc161s626驱动错误地在函数栈上分配了变量(如__be16类型),并将其地址传递给spi_read()。当SPI控制器尝试通过DMA向该栈地址写入数据时,由于栈内存可能不具备DMA一致性或映射属性,会导致内存数据被意外覆盖。这种栈破坏可以被精心构造的本地利用代码转化为控制流劫持,从而实现本地提权。攻击向量为本地(AV:L),需要低权限(PR:L)即可触发,无需用户交互。