Back to Articles
critical CVE-2026-53921

CRITICAL: OpenWrt DHCPv6 Flaw CVE-2026-53921 Gives Root Without Auth

OpenWrt disclosed CVE-2026-53921, a pair of stack buffer overflows in the odhcpd DHCPv6 daemon that let an unauthenticated attacker reach code execution as root on affected devices. It scores CVSS 9.8 and is fixed in OpenWrt 24.10.8 and 25.12.5. No exploitation has been reported yet, but public proof of concept code already exists.

By Danny Mercer, CISSP — Lead Security Analyst Jul 29, 2026
Is your business exposed? Our McKinney-based security team can assess your risk for free.
Share:

Pour one out for the humble router, which has spent another year being the least loved and most exposed device on the network. On July 28, the OpenWrt project disclosed CVE-2026-53921, a pair of stack buffer overflows in odhcpd, the DHCPv6 and router advertisement daemon that ships enabled by default on effectively every OpenWrt build. It carries a CVSS 3.1 score of 9.8 with the vector AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H, which is the scoring system's polite way of saying an attacker needs no credentials, no user interaction, and no prior foothold on the box. The daemon runs as root. On the kind of hardware OpenWrt usually lives on, that is very close to game over.

This one deserves the drop everything and patch this now treatment, with a caveat about reachability that we will get to, because honest threat modeling is more useful than panic.

The bug lives in the code path that builds DHCPv6 identity association replies. When odhcpd answers a client REQUEST, it assembles the response inside a fixed 512 byte stack buffer called pdbuf, and the advisory documents two independent places where the code writes past the end of it. The first sits in build_ia(), which checks that it has room for sixteen bytes and then proceeds to write twenty two, because the six byte status sub-option was never counted in the space check. Six bytes does not sound like much until you remember that stack layout is unforgiving and that an attacker gets to decide how many identity associations to stuff into a single request.

The second site is the more interesting of the pair. When odhcpd processes the first assigned identity association in a REQUEST and the reconfigure accept option is in play, it unconditionally writes thirty six bytes, a four byte option header followed by a thirty two byte reconfigure authentication record, without validating that the space exists. Worse, the size tracking uses an unsigned subtraction that underflows, so after the first overwrite the code believes it has an enormous amount of room remaining and cheerfully keeps writing. That is the classic shape of a bug that goes from crash to controlled corruption in the hands of someone patient.

Both overflow sites are reachable through crafted DHCPv6 REQUEST packets sent to UDP port 547, including relay forwarded packets, with no authentication anywhere in the chain. The affected code is odhcpd master at commit e432dd6 and everything before it, meaning any build carrying the dhcpv6_ia_handle_IAs() and build_ia() functions in their pre-fix form. In release terms that translates to the OpenWrt 24.10 branch before 24.10.8 and the 25.12 branch before 25.12.5. The upstream advisory is tracked as GHSA-7fwx-hhrg-3496, and credit goes to the researcher known as dyingc.

The exploitability question is where this gets genuinely uncomfortable rather than merely bad. On a general purpose Linux server, a stack overflow in 2026 runs into stack canaries, address space layout randomization, and a hardened allocator, and the realistic outcome is a denial of service while the attacker burns weeks looking for a bypass. Consumer and small business router firmware is a different world. Builds are trimmed for flash and RAM, hardening flags get dropped to save space, and plenty of shipping images have no meaningful canary or ASLR coverage at all. The advisory says code execution is a realistic outcome on typical devices, and that assessment is fair rather than alarmist. The process you would be executing code inside of is running as root, on the device that terminates your client's internet connection, sees all of their traffic, and holds their DNS and firewall configuration.

Now the caveat that separates this from a genuine internet-wide emergency. A DHCPv6 server normally listens on the LAN facing interfaces, and UDP 547 traffic is usually link-local scoped, which means the average OpenWrt router is not sitting there waiting to be overflowed by the entire internet. The realistic attack scenarios are an adversary who is already on the local network, a hostile device on a guest or IoT segment that was never properly isolated, a compromised endpoint looking for somewhere quiet to establish persistence, or a deployment where relay forwarded DHCPv6 crosses segment boundaries and widens the blast radius considerably. Anyone running OpenWrt on WAN facing DHCPv6, and there are more of those than you would like, has a much shorter runway.

That reachability profile makes this a lateral movement and persistence problem more than an initial access problem, and lateral movement problems are exactly the ones that turn a contained laptop infection into a three week incident response engagement. A router is the perfect place to hide. Nobody images it, nobody runs EDR on it, and nobody notices when it reboots at two in the morning.

As of July 28, 2026, there is no confirmed exploitation in the wild, and CVE-2026-53921 does not appear in CISA's Known Exploited Vulnerabilities catalog as of the 2026.07.27 revision. That is the good news and it has a shelf life. Public Python proof of concept code already exists, the bug class is well understood, and embedded targets with no exploit mitigations are the friendliest possible environment for weaponization. The gap between public proof of concept and opportunistic scanning on a bug this cheap to trigger has historically been measured in days.

The fix is straightforward, which is a nice change of pace. Move to OpenWrt 24.10.8 or later on the 24.10 branch, or 25.12.5 or later on the 25.12 branch, both of which are available now through the OpenWrt Firmware Selector and the usual sysupgrade path. The patched code adds proper bounds checks before writing the status option and the authentication record, and validates remaining capacity before any write that could exceed it. While you are in there, note that the 24.10 branch is projected to reach end of life around September 2026, so if you are patching a fleet anyway, the smarter move is to spend the maintenance window jumping to 25.12.5 rather than doing this dance again in eight weeks.

If you have devices you genuinely cannot flash this week, there are real mitigations. Disable the DHCPv6 server on any interface that does not need it, which for a surprising number of small business deployments running IPv4 only is all of them, by setting the dhcpv6 option to disabled in the relevant section of /etc/config/dhcp. Turn off reconfigure accept where it is not required, since one of the two overflow sites depends on it. Firewall UDP 547 so it is only reachable from trusted segments, and take the opportunity to confirm that your guest and IoT VLANs actually cannot talk to the router's service ports, because a distressing number of them can.

For detection, the signal is easier to catch than most. Watch for malformed or oversized DHCPv6 REQUEST packets on UDP 547 carrying unusual stacks of identity association options, which is not a shape that legitimate clients produce. On the device itself, odhcpd crashing and being respawned by procd is the loudest available tell, so pull logread output centrally and alert on repeated odhcpd restarts. If you are already shipping router syslog to a collector, this costs you one alert rule. If you are not shipping router syslog anywhere, that is the actual finding from today's article, and it is worth more than the patch.

There is a business conversation buried in here for anyone running an MSP. Most clients have no idea how many network devices they own, what firmware those devices run, or when any of it was last updated, and the honest answer is usually that a contractor flashed it once during the office move and nobody has touched it since. A network device inventory and firmware lifecycle service, priced as a recurring line item rather than a one time project, is an easy sell in the week a CVSS 9.8 unauthenticated root bug hits the exact category of gear they have been ignoring. Pair it with edge device log collection so the odhcpd restart alert above actually lands somewhere a human will see it, and you have converted a patch notification into a managed service with a renewal date attached.

References

Concerned about this threat?

Our security team can assess your exposure and recommend immediate actions.

Get a Free Assessment →