{"id":30698,"date":"2026-09-30T04:31:04","date_gmt":"2026-09-29T20:31:04","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-102714"},"modified":"2026-09-30T04:31:04","modified_gmt":"2026-09-29T20:31:04","slug":"cve-2026-102714","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-102714","title":{"rendered":"CVE-2026-102714 &#8211; `_nx_icmpv6_validate_options()` scans the option area with `while (length &gt; 2)` (`common\/s"},"content":{"rendered":"<p>`_nx_icmpv6_validate_options()` scans the option area with `while (length &gt; 2)` (`common\/src\/nx_icmpv6_validate_options.c:79`). An area whose size leaves a one- or two-byte residue exits the loop with that tail unexamined; the residue is not negative, so the function returns `NX_SUCCESS`. Its zero-length rejection never sees those bytes.<\/p>\n<p>Every consumer then re-walks the same area, reading a two-byte option header at the residue and subtracting `nx_icmpv6_option_length &lt;&lt; 3` with no zero check and no remaining-length check. Three outcomes follow, selected by bytes the attacker controls.<\/p>\n<p>**Zero length byte.** The walker subtracts zero and advances zero. All four handlers loop forever \u2014 `_nx_icmpv6_process_ra` (`nx_icmpv6_process_ra.c:245, :528`), `_nx_icmpv6_process_ns` (`:251, :329`), `_nx_icmpv6_process_na` (`:147, :156`) and `_nx_icmpv6_process_redirect` (`:247, :350`). The walk runs in the IP thread, which is the highest-priority thread and does not yield inside the loop, so the system stops until a watchdog reset and the frame can be replayed after each one.<\/p>\n<p>**Non-zero length byte on a short residue.** The three unsigned counters underflow \u2014 `2 &#8211; 8` becomes `0xFFFFFFFA` \u2014 and the walk continues past the packet buffer, reading until it faults or meets a zero length byte and freezes. The Router Advertisement counter is signed and exits cleanly in this case.<\/p>\n<p>**One-byte residue.** The walker reads a two-byte option header, over-reading one byte.<\/p>\n<p>During a runaway walk, stray bytes parsing as a link-layer address option are copied into the neighbor cache (`nx_icmpv6_process_ns.c:280, :293`) and subsequently used as the destination MAC for frames to that neighbour, placing off-packet memory on the link. Confirmed by inspection, not reproduced.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>`_nx_icmpv6_validate_options()` scans the option area with `while (length &gt; 2)` (`common\/src\/nx_icmpv6_validate_options.c:79`). An area whose size leaves a one- or two-byte residue exits the loop with<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-30698","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/30698","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=30698"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=30698"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=30698"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}