CVE-2026-80975 in Linux
摘要
由 VulDB • 2026-09-11
在 Linux 内核中,已修复以下漏洞:
mfd: qnap-mcu: 使回复缓冲区在命令超时后保持存活状态
qnap_mcu_exec() 将栈上分配的缓冲区发布到接收路径:
unsigned char rx[QNAP_MCU_RX_BUFFER_SIZE];
... reply->data = rx; reply->length = length;
而 qnap_mcu_receive_buf() 从 serdev 接收路径向其写入数据,该路径在 flush_to_ldisc() 结束后运行,且与 qnap_mcu_exec() 之间完全没有序列化。bus_lock 无法覆盖此情况,因为 qnap_mcu_exec() 在 wait_for_completion_timeout() 期间持有该互斥锁。
当发生超时时,qnap_mpu_exec() 返回时 reply->data 仍指向其自身的帧数据。随后到达的回复或来自 MCU 的非请求消息会被写入一个已退出的栈帧中,从而破坏在该栈上运行的后续代码。当 qnap_mcu_write() 失败时也适用相同的情况,因为该路径在不触碰回复状态的情况下返回。
将接收缓冲区移至 struct qnap_mcu 结构中。它大小为 37 字节,且结构体通过 devm_kzalloc() 分配,因此其生命周期与驱动程序一致,后续写入会落在仍然有效的内存中,并由下一个命令重新初始化。bus_lock 可防止多个命令共享该缓冲区。
此处故意不清除超时路径中的 reply->data 或 reply->length。这样做会与 qnap_mcu_receive_buf() 产生竞争条件,后者在其检查 if (!reply->length) return size; 之后读取这两个字段:清除 reply->data 会导致空指针解引用(NULL dereference),而仅清除 reply->length 会移除 reply->received == reply->length 的退出条件,导致复制循环一直运行直到消耗完 uart 块并发生缓冲区溢出。保留两者设置可使写入操作受限于 reply->length,该值已由 qnap_mcu_exec() 针对 sizeof(mcu->rx) 进行过检查。
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.