← Back to Feed CACHED · 2026-07-30 09:03:34 · CACHE_KEY CVE-2026-53921
CVE-2026-53921 · CWE-121 · Disclosed 2026-07-28

OpenWrt odhcpd DHCPv6 IA Reply Serialization Stack Buffer Overflow

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

A single poisoned DHCPv6 packet lets anyone on your LAN steal the keys to the entire building

CVE-2026-53921 is a stack-based buffer overflow (CWE-121) in odhcpd, the default DHCPv6/RA/NDP daemon shipped with every OpenWrt installation. Two independent overflow sites exist in the DHCPv6 IA reply serialization path: one in build_ia() at dhcpv6-ia.c:594 where a 6-byte status sub-option writes past a 16-byte guard, and a second at dhcpv6-ia.c:1246 where a 36-byte RECONF_ACCEPT authentication record is written unconditionally without bounds checking. Both overflow a fixed 512-byte stack buffer (pdbuf). An unauthenticated attacker on the LAN sends a crafted DHCPv6 REQUEST to UDP/547 — no credentials, no user interaction. Because odhcpd runs as root and OpenWrt's embedded MIPS/ARM targets typically ship without stack canaries or ASLR, the path from stack smash to arbitrary code execution is essentially unguarded. All odhcpd versions through master commit e432dd6 are vulnerable. Patched in OpenWrt 24.10.8 and 25.12.5.

The CNA (OpenWrt/GitHub) assigned CVSS 9.8 — and for the raw technical mechanics, that score is fair. AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H accurately describes the attack surface *within the reachable network*. The only friction is that the DHCPv6 server listens on the LAN interface by design, not the WAN — so an internet-remote attacker cannot reach it directly. In practice, though, this friction is thinner than it looks: any compromised endpoint, rogue IoT device, or guest-WiFi client on the same segment can fire the exploit. For a router — the single device that sees all traffic and controls all routing — the blast radius of root compromise is network-wide: MitM, DNS hijack, credential harvesting, and a silent lateral-movement pivot. We assess this at CRITICAL 9.0, slightly below the raw CVSS to account for LAN-only reachability and the absence of confirmed in-the-wild exploitation, but we hold the CRITICAL floor because OpenWrt *is* the network edge appliance.

"Unauthenticated root RCE on your LAN router via a single DHCPv6 packet — public PoC is live."
02 · The Attack Path

5 steps from start to impact.

STEP 01

Attacker gains LAN presence

The attacker obtains any foothold on the same Layer 2 segment as the OpenWrt device's LAN interface. This can be a compromised workstation, a rogue IoT device, a guest WiFi client, or physical access to an Ethernet port. No credentials on the OpenWrt device are needed — only Layer 2/3 reachability to UDP port 547.
Conditions required:
  • Layer 2 adjacency or routed reachability to the OpenWrt LAN interface
  • IPv6 and DHCPv6 enabled on the target network segment (default in most OpenWrt configurations)
Where this breaks in practice:
  • Attacker must already be inside the network perimeter — this is post-initial-access
  • Some enterprise segments may have DHCPv6 disabled or use a different DHCP server
Detection/coverage: NAC/802.1X enrollment logs; rogue device detection via DHCP fingerprinting or ARP monitoring
STEP 02

Craft and send DHCPv6 SOLICIT (Site 1 path)

For the build_ia() overflow path, the attacker first sends a relay-forwarded DHCPv6 SOLICIT containing multiple IA_NA options to create server-side bindings. The PoC (pov_site1_verify.py) creates 5 IA_NA bindings. This is normal DHCPv6 behavior and generates no alerts.
Conditions required:
  • odhcpd is running and serving DHCPv6 on the target interface
  • IPv6 prefix delegation or address assignment is configured
Where this breaks in practice:
  • If odhcpd is configured in relay-only mode (no server), this path may not be reachable
  • Some hardened deployments limit IA allocations per client
Detection/coverage: DHCPv6 logs showing unusual numbers of IA_NA bindings from a single DUID; most deployments do not monitor DHCPv6 at this granularity
STEP 03

Send overflow-triggering REQUEST

The attacker sends a crafted DHCPv6 REQUEST containing a mix of valid and invalid IA_NA/IA_PD options designed to exhaust the 512-byte pdbuf stack buffer. Site 1: 5 valid + 7 invalid IA_NAs cause repeated 22-byte status sub-option writes past the guard. Site 2 (alternative, via pov_site2_verify.py): 22 unassignable IA_PD options + RECONF_ACCEPT flag causes 484 bytes of status responses followed by an unconditional 36-byte authentication write with an unsigned integer underflow. Either path overwrites the stack.
Conditions required:
  • Successful SOLICIT phase (Site 1) or simply a single REQUEST (Site 2)
  • odhcpd version prior to fix commits d329a15 / 0320032 / 03dacc2
Where this breaks in practice:
  • Precise IA option counts may need minor tuning per target's configuration (pool size, prefix length)
  • The two public PoCs are ASan-instrumented test harnesses — weaponization for arbitrary code execution requires payload development, though the lack of canaries/ASLR makes this straightforward
Detection/coverage: Crash logs in syslog (odhcpd segfault); IDS rules matching malformed DHCPv6 IA option counts (no known Snort/Suricata SID as of 2026-07-30)
STEP 04

Achieve root code execution on the router

Because odhcpd runs as root and typical OpenWrt targets (MIPS, ARM embedded SoCs) lack stack canaries and ASLR, the stack buffer overflow directly yields arbitrary code execution with full system privileges. The attacker now controls the router's operating system, routing tables, firewall rules, DNS forwarding, and all transit traffic.
Conditions required:
  • Successful stack overflow from Step 3
  • Target device lacks exploit mitigations (default for most OpenWrt hardware)
Where this breaks in practice:
  • Devices with modern ARM64 SoCs and recent musl builds *may* have partial ASLR, raising exploitation difficulty slightly
  • A handful of custom builds enable SSP (stack smashing protector), which would terminate the process instead of granting execution
Detection/coverage: Process crash and restart (watchdog); unexpected outbound connections from the router's management IP; modified firewall rules or DNS config
STEP 05

Network-wide impact: MitM, pivot, persist

With root on the router, the attacker can: intercept and modify all LAN↔WAN traffic (MitM), inject DNS responses to redirect users to credential-harvesting pages, install a persistent backdoor (surviving reboots via /etc/rc.local or modified firmware), pivot to attack other devices on the LAN using the router as a jump host, and exfiltrate data through the router's WAN uplink without triggering east-west IDS. The router becomes an invisible command-and-control relay.
Conditions required:
  • Root shell on the OpenWrt device from Step 4
Where this breaks in practice:
  • Persistence may be limited on read-only squashfs root partitions (overlay fs can be modified)
  • Encrypted traffic (TLS 1.3) limits passive interception, though DNS and unencrypted protocols remain fully exposed
Detection/coverage: Firmware integrity checks (if baseline exists); unexpected DNS resolution changes; anomalous traffic volume from the router's WAN IP; out-of-band management comparison showing config drift
03 · Intelligence Metadata

The supporting signals.

In-the-Wild ExploitationNot observed. No confirmed exploitation as of 2026-07-30. Not listed in CISA KEV catalog.
Proof-of-ConceptPublic — two independent PoCs. pov_site1_verify.py (relay-forwarded SOLICIT + REQUEST, 5+7 IA_NAs) and pov_site2_verify.py (single REQUEST, 22 IA_PDs + RECONF_ACCEPT). Both included in the GHSA-7fwx-hhrg-3496 advisory by researcher dyingc (@dyingc).
EPSS ScoreNot yet scored — CVE disclosed 2026-07-28, EPSS data typically lags 7–14 days for new entries.
KEV StatusNot listed in CISA Known Exploited Vulnerabilities catalog as of 2026-07-30.
CVSS VectorCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H (CNA score: 9.8). Network-adjacent in practice — DHCPv6 server binds to LAN interface, not WAN. The AV:N rating is technically correct (UDP/547 is a network service) but overstates internet reachability.
Affected VersionsAll odhcpd versions through master commit e432dd6 containing dhcpv6_ia_handle_IAs() and build_ia(). Affects OpenWrt 24.10.0–24.10.7 and 25.12.0–25.12.4. Third-party products embedding OpenWrt are also affected.
Fixed VersionsOpenWrt 24.10.8 (stable) and 25.12.5 (development). Fix commits: d329a15, 0320032, 03dacc2 (master); backports d168c27, 6634b7a, 2a42d34 (25.12 branch).
Scanning / Exposure DataShodan shows ~31,850 internet-exposed OpenWrt LuCI instances (mid-2026), ~5,000 flagged as honeypots. However, the vulnerable service (DHCPv6/UDP 547) is LAN-facing only — internet scan counts are not directly relevant. Real exposure = every OpenWrt LAN segment with DHCPv6 enabled.
Disclosure TimelineAdvisory published in GHSA-7fwx-hhrg-3496. Patches released 2026-07-28 in OpenWrt 24.10.8 and 25.12.5. News coverage same day via The Hacker News, SC Media, heise.
Reporterdyingc (@dyingc on GitHub). Also reported related CVE-2026-62948 (DHCPv6 hostname injection / stored XSS in LuCI, CVSS 9.6).
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to CRITICAL (9.0/10)

OpenWrt is *canonically* a network edge appliance — 100% of installations serve as routers, gateways, or firewalls — and root compromise of the device yields network-wide MitM, DNS hijack, and lateral-movement pivot across every host behind it, making the blast radius fleet-scale by definition. The single most decisive factor is the role multiplier: the affected component IS the perimeter, and unauthenticated root RCE with public PoC on hardware lacking exploit mitigations means the chain reliably ends in full network control.

HIGH Vulnerability existence and exploitability (two independent overflow paths, public PoC, ASan-confirmed crashes)
HIGH Blast radius on successful exploitation (root on router = network-wide impact)
MEDIUM Exploit reliability across hardware variants (PoCs are ASan harnesses; weaponized RCE payload not publicly demonstrated on all SoCs)
LOW EPSS and threat-actor adoption timeline (too new for EPSS scoring; no in-the-wild activity yet)

Why this verdict

  • Unauthenticated, zero-click attack surface. The trigger is a single DHCPv6 REQUEST packet to UDP/547 — no credentials, no user interaction, no prior session. Any device on the LAN segment can fire it. This is the lowest possible friction for a network-reachable vulnerability.
  • Exploit mitigations are absent on the target platform. OpenWrt's embedded MIPS and ARM targets typically ship without stack canaries (SSP) and without ASLR. The advisory explicitly calls this out. A stack buffer overflow on these platforms is essentially a guaranteed code execution primitive, not a probabilistic crash.
  • Public PoC lowers the weaponization bar. Two complete Python PoC scripts (~120 lines each) are included directly in the GitHub Security Advisory. While they are ASan test harnesses rather than full exploit chains, they provide the exact packet structures, IA option counts, and triggering sequences. Converting to a weaponized exploit requires only shellcode/ROP payload development — trivial given the no-ASLR/no-canary environment.
  • Role multiplier: canonical network edge appliance — chain ends in network-wide compromise. OpenWrt devices are routers, gateways, and firewalls by definition. Root on the router means: (a) full traffic interception and modification (MitM on all LAN↔WAN flows), (b) DNS poisoning affecting every client, (c) firewall rule manipulation opening the network to external attack, (d) silent lateral-movement pivot to all LAN hosts, (e) persistent backdoor surviving service restarts. This is fleet-scale impact for every network segment behind the compromised device. The blast radius is not 'one host' — it is 'every host on that network segment plus the WAN uplink.' Because ≥10% (in fact 100%) of OpenWrt installations occupy the high-value network-edge role, the verdict floor is CRITICAL per noisgate methodology.
  • LAN-only reachability is real friction but does not break the CRITICAL floor. The DHCPv6 server binds to the LAN interface, not WAN. An internet-remote attacker cannot reach it directly. However, this requires only that the attacker have *any* presence on the LAN — a compromised endpoint, a rogue IoT device, a guest WiFi client. In enterprise branch-office and retail deployments, this is a realistic post-initial-access position. Per noisgate rules, a generic 'requires internal access' statement is not sufficient to break below the CRITICAL floor for a canonical network-edge component.

Why not higher?

The CNA score is 9.8; we assess at 9.0. The 0.8-point reduction reflects that DHCPv6 is LAN-facing only (not internet-reachable), exploitation requires IPv6 and DHCPv6 to be active on the target segment, and there is no confirmed in-the-wild exploitation or KEV listing yet. The public PoCs are ASan instrumentation harnesses rather than weaponized remote shells, adding a small (but surmountable) gap to operational exploitation.

Why not lower?

Downgrading to HIGH would require evidence that the network-edge blast radius is contained — but it is not. Root on the router IS the network. The LAN-only requirement is the sole friction point, and it is a single hop from any compromised endpoint. The absence of exploit mitigations (no ASLR, no canaries) on target hardware makes exploitation reliability exceptionally high. Two independent overflow paths mean a defender cannot partially patch. Public PoC code removes the discovery barrier. For any enterprise running OpenWrt in branch offices, retail, or OT segments, this is a CRITICAL-class threat.

05 · Compensating Control

What to do — in priority order.

  1. Disable DHCPv6 server mode on all OpenWrt devices immediately — If your network segments do not require DHCPv6 (many enterprise LANs are IPv4-only or use SLAAC without stateful DHCPv6), set option dhcpv6 disabled in /etc/config/dhcp for each interface and restart odhcpd. This eliminates the attack surface entirely. Deploy within 3 days per noisgate mitigation SLA for CRITICAL.
  2. Restrict DHCPv6 to trusted VLANs via firewall rules — If DHCPv6 cannot be disabled, add iptables/nftables rules on the OpenWrt device to drop DHCPv6 traffic (UDP/547) from untrusted VLANs, guest networks, and IoT segments. Only allow DHCPv6 from managed infrastructure VLANs. This limits the attack surface to segments where all clients are enterprise-managed.
  3. Enable stack smashing protector (SSP) in custom builds — If you build OpenWrt from source, enable -fstack-protector-strong in the toolchain configuration. This adds stack canaries that will terminate odhcpd on overflow rather than allowing code execution. Note: this requires a firmware rebuild and reflash — it is a build-time mitigation, not a runtime config change.
  4. Monitor syslog for odhcpd crashes — Configure syslog forwarding from all OpenWrt devices to your SIEM. Alert on odhcpd segfault or unexpected restart events, which would indicate exploitation attempts. This is detection, not prevention, but provides early warning.
  5. Upgrade to OpenWrt 24.10.8 or 25.12.5 — The definitive fix. Plan firmware upgrades within the 90-day noisgate remediation SLA for CRITICAL. Prioritize devices on segments with untrusted clients (guest WiFi, IoT, retail floor).
What doesn't work
  • WAN-side firewall rules — The vulnerable service listens on the LAN interface, not WAN. Blocking inbound traffic on the WAN does nothing to protect against LAN-side exploitation.
  • IDS/IPS signatures — No known Snort or Suricata signatures exist for this specific DHCPv6 overflow as of 2026-07-30. Generic DHCPv6 anomaly detection may flag unusual IA counts but is unlikely to be deployed or tuned in most environments.
  • Network segmentation alone — While segmentation limits which devices can reach the router's LAN interface, the router by definition must be reachable from its own LAN segment. Every device on that segment is a potential attacker. Segmentation helps only if you can isolate untrusted devices onto segments served by a *different* (non-OpenWrt) DHCP server.
  • Rate limiting DHCPv6 — The exploit requires only a small number of packets (one SOLICIT + one REQUEST for Site 1, or a single REQUEST for Site 2). Rate limiting will not prevent exploitation.
06 · Verification

Crowdsourced verification payload.

Run this script on each OpenWrt device via SSH (as root). It checks the installed odhcpd package version and the OpenWrt release version against known-patched releases. Invoke with: ssh root@<router-ip> 'sh -s' < check_cve_2026_53921.sh

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/bin/sh
# check_cve_2026_53921.sh
# Checks whether the running OpenWrt device is vulnerable to CVE-2026-53921
# (odhcpd DHCPv6 stack buffer overflow)
# Run as root on the OpenWrt device.
# Exit codes: 1 = VULNERABLE, 0 = PATCHED, 2 = UNKNOWN

RESULT="UNKNOWN"

# Check if odhcpd is installed
if ! opkg list-installed 2>/dev/null | grep -q '^odhcpd'; then
  echo "[*] odhcpd is not installed on this device."
  echo "PATCHED (not affected — odhcpd not present)"
  exit 0
fi

# Check if DHCPv6 server is active
DHCPV6_ACTIVE=$(uci show dhcp 2>/dev/null | grep "dhcpv6='server'" | head -1)
if [ -z "$DHCPV6_ACTIVE" ]; then
  echo "[*] DHCPv6 server mode is not enabled (attack surface not exposed)."
  echo "[*] Still checking version for completeness..."
fi

# Get OpenWrt release version
if [ -f /etc/openwrt_release ]; then
  . /etc/openwrt_release
  RELEASE="$DISTRIB_RELEASE"
  echo "[*] OpenWrt release: $RELEASE"
else
  echo "[!] Cannot determine OpenWrt release version."
  echo "UNKNOWN"
  exit 2
fi

# Parse major.minor.patch
MAJOR=$(echo "$RELEASE" | cut -d. -f1)
MINOR=$(echo "$RELEASE" | cut -d. -f2)
PATCH=$(echo "$RELEASE" | cut -d. -f3 | cut -d- -f1)

# Vulnerable ranges:
# 24.10.0 - 24.10.7  (fixed in 24.10.8)
# 25.12.0 - 25.12.4  (fixed in 25.12.5)
# Anything older than 24.10 is also vulnerable if odhcpd is present

if [ "$MAJOR" -eq 24 ] && [ "$MINOR" -eq 10 ]; then
  if [ "$PATCH" -ge 8 ]; then
    RESULT="PATCHED"
  else
    RESULT="VULNERABLE"
  fi
elif [ "$MAJOR" -eq 25 ] && [ "$MINOR" -eq 12 ]; then
  if [ "$PATCH" -ge 5 ]; then
    RESULT="PATCHED"
  else
    RESULT="VULNERABLE"
  fi
elif [ "$MAJOR" -gt 25 ] || ([ "$MAJOR" -eq 25 ] && [ "$MINOR" -gt 12 ]); then
  RESULT="PATCHED"
elif [ "$MAJOR" -lt 24 ] || ([ "$MAJOR" -eq 24 ] && [ "$MINOR" -lt 10 ]); then
  # Older branches — likely vulnerable if odhcpd has the affected functions
  RESULT="VULNERABLE"
else
  RESULT="UNKNOWN"
fi

if [ "$RESULT" = "VULNERABLE" ]; then
  echo "[!] CVE-2026-53921: VULNERABLE"
  echo "[!] OpenWrt $RELEASE contains a vulnerable odhcpd version."
  echo "[!] Upgrade to 24.10.8 or 25.12.5 immediately."
  if [ -n "$DHCPV6_ACTIVE" ]; then
    echo "[!] WARNING: DHCPv6 server mode is ACTIVE — attack surface is exposed."
  fi
  echo "VULNERABLE"
  exit 1
elif [ "$RESULT" = "PATCHED" ]; then
  echo "[+] CVE-2026-53921: PATCHED"
  echo "[+] OpenWrt $RELEASE includes the fix."
  echo "PATCHED"
  exit 0
else
  echo "[?] CVE-2026-53921: UNKNOWN"
  echo "[?] Could not determine patch status for OpenWrt $RELEASE."
  echo "UNKNOWN"
  exit 2
fi
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning: inventory every OpenWrt device in your fleet and disable DHCPv6 server mode on all of them within 3 days. This is a CRITICAL-class unauthenticated root RCE on your network edge with public PoC code — the noisgate mitigation SLA gives you 3 days to deploy compensating controls. Run uci set dhcp.lan.dhcpv6='disabled' && uci commit dhcp && /etc/init.d/odhcpd restart on every device, or push the config via your automation tooling. If DHCPv6 is operationally required, restrict it to trusted management VLANs via firewall rules. Begin firmware upgrade planning to OpenWrt 24.10.8 (stable) or 25.12.5 (dev) immediately — the noisgate remediation SLA for CRITICAL is 90 days, targeting completion by late October 2026. Prioritize branch-office routers, retail-floor gateways, and any segment hosting IoT or guest WiFi, where untrusted devices share the LAN with the router. Don't forget third-party appliances that embed OpenWrt — check with your vendors for patched firmware. This is not a drill: the PoC is public, the exploit mitigations on target hardware are nonexistent, and any compromised endpoint on your LAN is one UDP packet away from owning your router.

Sources

  1. GitHub Security Advisory GHSA-7fwx-hhrg-3496
  2. The Hacker News — Critical OpenWrt DHCPv6 Flaw Coverage
  3. Field Effect — Critical OpenWrt DHCPv6 Flaw Analysis
  4. SC Media — OpenWrt Security Updates
  5. heise online — OpenWrt Updates Close Critical Vulnerabilities
  6. Forescout — Analyzing Active Exploitation of OpenWRT LuCI
  7. OpenWrt odhcpd GitHub Repository
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.