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.

来源

Do you want to use VulDB in your project?

Use the official API to access entries easily!