{"id":21308,"date":"2026-09-12T04:31:00","date_gmt":"2026-09-11T20:31:00","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-80975"},"modified":"2026-09-12T04:31:00","modified_gmt":"2026-09-11T20:31:00","slug":"cve-2026-80975","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-80975","title":{"rendered":"CVE-2026-80975 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nmfd: qnap-mcu: keep t"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>mfd: qnap-mcu: keep the reply buffer alive past a command timeout<\/p>\n<p>qnap_mcu_exec() publishes an on-stack buffer to the receive path:<\/p>\n<p>\tunsigned char rx[QNAP_MCU_RX_BUFFER_SIZE];<br \/>\n\t&#8230;<br \/>\n\treply-&gt;data = rx;<br \/>\n\treply-&gt;length = length;<\/p>\n<p>and qnap_mcu_receive_buf() writes into it from the serdev receive path,<br \/>\nwhich runs out of flush_to_ldisc() and is not serialized against<br \/>\nqnap_mcu_exec() at all. bus_lock cannot cover it, because qnap_mcu_exec()<br \/>\nholds that mutex across wait_for_completion_timeout().<\/p>\n<p>On a timeout qnap_mcu_exec() returns with reply-&gt;data still pointing at<br \/>\nits own frame. A reply that arrives late, or an unsolicited message from<br \/>\nthe MCU, is then written into a stack frame that has been left, corrupting<br \/>\nwhatever runs next on that stack. The same applies when qnap_mcu_write()<br \/>\nfails, since that path returns without touching the reply state either.<\/p>\n<p>Move the receive buffer into struct qnap_mcu. It is 37 bytes and the<br \/>\nstructure is devm_kzalloc()ed, so it lives as long as the driver, and a<br \/>\nlate write lands in memory that is still valid and is reinitialized by the<br \/>\nnext command. bus_lock keeps commands from sharing it.<\/p>\n<p>This deliberately does not clear reply-&gt;data or reply-&gt;length on the<br \/>\ntimeout path. Doing so races with qnap_mcu_receive_buf(), which reads both<br \/>\nafter its<\/p>\n<p>\tif (!reply-&gt;length)<br \/>\n\t\treturn size;<\/p>\n<p>check: clearing reply-&gt;data gives a NULL dereference, and clearing<br \/>\nreply-&gt;length alone removes the reply-&gt;received == reply-&gt;length exit<br \/>\ncondition, so the copy loop runs until the uart chunk is consumed and<br \/>\noverruns the buffer. Leaving both set keeps the write bounded by<br \/>\nreply-&gt;length, which qnap_mcu_exec() has already checked against<br \/>\nsizeof(mcu-&gt;rx).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>mfd: qnap-mcu: keep the reply buffer alive past a command timeout<\/p>\n<p>qnap_mcu_exec() publishes an on-stack buffer to the receive path<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-21308","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/21308","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=21308"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21308"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21308"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}