{"id":30697,"date":"2026-09-30T04:31:04","date_gmt":"2026-09-29T20:31:04","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-102713"},"modified":"2026-09-30T04:31:04","modified_gmt":"2026-09-29T20:31:04","slug":"cve-2026-102713","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-102713","title":{"rendered":"CVE-2026-102713 &#8211; The TFTP server accepts a DATA datagram of any size. The dispatcher rejects datagrams shor"},"content":{"rendered":"<p>The TFTP server accepts a DATA datagram of any size. The dispatcher rejects datagrams shorter than<\/p>\n<p>four bytes (nxd_tftp_server.c:1037) and nothing anywhere checks an upper bound, in particular not<\/p>\n<p>against the protocol maximum of 4 + NX_TFTP_FILE_TRANSFER_MAX. Two things follow from that one<\/p>\n<p>missing check, both reachable before any authentication because TFTP has none.<\/p>\n<p>The handler passes `nx_packet_length &#8211; 4` straight to FileX:<\/p>\n<p>&#8220;`c<\/p>\n<p>\/* addons\/tftp\/nxd_tftp_server.c:1863, 1889 *\/<\/p>\n<p>status = nx_packet_copy(packet_ptr, &amp;temp_ptr,<\/p>\n<p>                        server_ptr -&gt; nx_tftp_server_packet_pool_ptr, NX_WAIT_FOREVER);<\/p>\n<p>&#8230;<\/p>\n<p>fx_file_write(&amp;(client_request_ptr -&gt; nx_tftp_client_request_file),<\/p>\n<p>              packet_ptr -&gt; nx_packet_prepend_ptr + 4,<br \/>\n              packet_ptr -&gt; nx_packet_length &#8211; 4);<\/p>\n<p>&#8220;`<\/p>\n<p>`nx_packet_length` is the length of a chain, not of one contiguous buffer, so FileX copies past the<\/p>\n<p>end of the first packet:<\/p>\n<p>&#8220;`<\/p>\n<p>ERROR: AddressSanitizer: heap-buffer-overflow<\/p>\n<p>READ of size 1280 at 0x621000001108 thread T5<\/p>\n<p>    #0 __interceptor_memcpy<br \/>\n    #1 _fx_utility_memory_copy  filex\/common\/src\/fx_utility_memory_copy.c:78<\/p>\n<p>0x621000001108 is 0 bytes to the right of 4104-byte region<\/p>\n<p>&#8220;`<\/p>\n<p>Those bytes are written into the file the attacker is uploading, and a TFTP read request hands them<\/p>\n<p>back, so this is a memory disclosure with a convenient retrieval channel.<\/p>\n<p>The same datagram also wedges the server. `nx_packet_copy` at :1863 needs<\/p>\n<p>ceil(nx_packet_length \/ pool_payload) packets and asks for them with NX_WAIT_FOREVER, so when the<\/p>\n<p>attacker sizes the datagram beyond what the pool holds, the server thread suspends and never<\/p>\n<p>returns. A liveness probe after one such datagram times out with the pool at 0 of 12 packets and<\/p>\n<p>the server thread suspended, and no later client is served.<\/p>\n<p>Reject `nx_packet_length &gt; 4 + NX_TFTP_FILE_TRANSFER_MAX` in the DATA branch before either call,<\/p>\n<p>and use a bounded wait rather than NX_WAIT_FOREVER for the copy.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The TFTP server accepts a DATA datagram of any size. The dispatcher rejects datagrams shorter than<\/p>\n<p>four bytes (nxd_tftp_server.c:1037) and nothing anywhere checks an upper bound, in particular not<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-30697","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/30697","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=30697"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=30697"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=30697"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}