A consumer-grade plastic router whose admin panel can't parse its own form fields
CVE-2026-13519 is a classic *stack-based buffer overflow* in the fromNatStaticSetting handler at /goform/NatStaticSetting on the Tenda JD12L mesh router, firmware 16.03.53.23. The page query parameter is copied into a fixed-size stack buffer without bounds checking — overflow the buffer, smash the saved return address, and on a MIPS/ARM SoC with no ASLR and no stack canaries you get reliable code execution as the web daemon (typically root on these devices). A PoC is already public and this is one of a *cluster* of nearly identical bugs (CVE-2026-13515 through 13519) reported against the same firmware build.
Vendor severity is HIGH/8.8 with PR:L — meaning the CVSS author scored this assuming the attacker has already authenticated to the admin UI. That is the right call. The web UI binds to the LAN bridge by default; the WAN side does not expose /goform/* unless the owner turned on remote management. Calling this HIGH for an enterprise fleet overstates the risk because the typical deployment role is a SOHO/home-office device — but it understates it for the small slice of users who enabled cloud/remote admin. The honest enterprise verdict is MEDIUM: real bug, real PoC, real root, but the reachable population is tiny and the device class doesn't sit on the corporate trust path.
4 steps from start to impact.
Reach the web admin interface
- LAN adjacency, or WAN-side remote management enabled
- Device running firmware 16.03.53.23
- Default config does not expose admin UI to WAN
- ISP CGNAT hides most consumer units from direct Internet scanning
- Enterprise deployments rarely use Tenda SOHO gear — typical install base is home/SMB
Tenda HTTP server banner; GreyNoise tags Tenda exploit scanners but no JD12L-specific tag yetAuthenticate to the admin panel
PR:L tag says low privileges are required. In practice this means a valid session cookie for the admin UI — usually the default admin/admin credentials that owners never change, or a captured cookie. A standalone curl POST with the session cookie is enough.- Valid admin credentials, default creds, or session cookie
- Owners who changed the default password block this step entirely
- No public CSRF chain published yet — drive-by from a malicious webpage is not demonstrated
Send oversized page parameter to /goform/NatStaticSetting
/goform/NatStaticSetting with a page value longer than the fixed stack buffer (PoC uses ~500+ bytes). fromNatStaticSetting calls an unbounded strcpy/sprintf into a local buffer, overflowing the saved return address. Public PoC scripts (curl one-liner / Python) are circulating.- HTTP reachability + authenticated session from step 2
- MIPS/ARM payloads must be tailored per SoC variant
- Web daemon may simply crash and watchdog-restart on first attempt
Achieve code execution as root
- Working exploit binary for the device's CPU/ABI
- Persistence across reboot requires writing to the squashfs overlay, which not all variants support
- No documented enterprise lateral-movement chain from a SOHO Tenda to a corporate AD
The supporting signals.
| In-the-wild status | Not KEV-listed. No confirmed in-the-wild campaigns. Tenda routers are a recurring Mirai/Mozi botnet target class, so opportunistic scanning is expected once exploit kits absorb the PoC. |
|---|---|
| Public exploit | Yes — public PoC referenced in the original disclosure. One of a cluster (CVE-2026-13515–13519) all targeting /goform/* handlers in the same firmware build. |
| EPSS | Not yet scored by FIRST at disclosure (2026-06-29). Sibling Tenda goform bugs typically settle around the 5–20th percentile within 30 days — opportunistic but not headline. |
| KEV status | Not listed by CISA as of 2026-06-29. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H — network, low complexity, authenticated, no user interaction, root-on-device impact. |
| Affected versions | Tenda JD12L firmware 16.03.53.23. Other JD12L builds not confirmed; sibling SKUs (AC, MW, FH series) historically share the goform code path. |
| Fixed version | None. Tenda has not issued an advisory or patch. End-of-life behaviour is typical for this product line. |
| Exposure data | Shodan returns a few thousand Tenda HTTP banners globally but JD12L-specific fingerprint count is low. Default config does not expose admin UI to WAN — the externally reachable population is a small fraction of installed units. |
| Disclosure | Published 2026-06-29 via VulDB / CVE Numbering Authority. No vendor coordination evident. |
| Researcher | Disclosure credited via VulDB; no individual researcher named in the public record. |
noisgate verdict.
The single decisive factor is deployment role: the JD12L is a consumer/SOHO router that does not sit on any enterprise trust path — its blast radius stops at the LAN segment it serves, not at identity, hypervisor, or data tiers. Combined with PR:L (authenticated) and a default WAN-closed admin interface, the realistic exposed-and-exploitable population is a small minority of installed units.
Why this verdict
- Authentication gate (
PR:L): the CVSS author already accepted that valid admin credentials or a session cookie are required. That removes the unauth-RCE narrative the 8.8 score visually implies. - Default WAN-closed admin UI: the
/goform/*endpoints bind to the LAN bridge unless the owner explicitly enables remote/cloud management — externally reachable population is a small minority of installs. - Role multiplier — typical role (SOHO/home/branch router): chain succeeds and yields root on the device, but blast radius is the single LAN segment it serves. No domain, no IdP, no hypervisor, no backup plane downstream. This caps the floor at MEDIUM in enterprise terms.
- Role multiplier — low-value role (lab/test bench): chain succeeds, impact limited to the lab. Trivial.
- Role multiplier — high-value role: the JD12L is not deployed as a perimeter firewall, identity device, or hypervisor in any defensible enterprise architecture. There is no canonical high-value role for this SKU that would invoke the CRITICAL floor.
- Adversary economics: Mirai/Mozi families will fold the PoC in for opportunistic IoT recruitment, but that's botnet-scale nuisance, not targeted enterprise compromise.
Why not higher?
HIGH would require either an unauthenticated path, a default-on WAN exposure, or a deployment role that touches the corporate trust path. None of those conditions apply: the bug needs an admin session, the UI is LAN-only by default, and the JD12L is a consumer router that sits below any enterprise security boundary.
Why not lower?
LOW would imply the bug is non-exploitable or the device class is irrelevant. Neither is true — public PoC exists, root-on-device is real, and SOHO routers do show up in branch-office and work-from-home inventories where a compromised router enables DNS hijack and on-path TLS interception against remote workers.
What to do — in priority order.
- Inventory Tenda JD12L units across branch and WFH fleet — Use endpoint posture data (EDR seeing default gateway MAC OUI
C8:3A:35/ Tenda) and DHCP logs to identify any Tenda gear in scope. Complete within the noisgate MEDIUM remediation window (≤365 days) but treat WFH-router inventory as ongoing hygiene. - Disable remote/cloud management on every JD12L you find — Log into the admin UI, turn off WAN-side management and Tenda's cloud-app remote control. Eliminates the only path that turns this into an Internet-exploitable bug. No mitigation SLA at MEDIUM — do this as part of your standard router hardening pass.
- Rotate the admin password off vendor defaults —
PR:Lrequires a valid session. Defaultadmin/adminmakes that trivial. Force a strong password and document it in your password manager during the inventory step. - Replace JD12L units in any role touching corporate traffic — Tenda has a long history of unpatched goform CVEs and no advisory for this one. If a JD12L is the gateway for a remote worker who reaches production, swap it for a managed device (Meraki, Fortinet, Unifi) within the ≤365-day noisgate remediation window.
- Segment WFH router traffic with always-on VPN + ZTNA — Assume the home router is hostile. Tunnel corporate traffic through a managed client so a compromised JD12L cannot DNS-hijack or downgrade TLS to corporate destinations.
- Web application firewalls — the vulnerable endpoint is on the router itself, not behind an enterprise WAF.
- EDR/AV — the JD12L runs an embedded Linux on MIPS/ARM with no agent footprint; nothing to instrument.
- NVD/vendor patch monitoring alone — Tenda has not issued an advisory and may never do so for this SKU. Waiting for a patch is not a control.
- Network IDS at the corporate edge — exploitation happens between the attacker (often LAN-local) and the router; corporate IDS never sees it.
Crowdsourced verification payload.
Run from an auditor workstation on the same LAN as the router, or from a jump host with HTTP reachability to the admin interface. Requires curl and valid admin credentials. Invoke as ./check_jd12l.sh 192.168.0.1 admin yourpassword. The script fingerprints firmware and probes the vulnerable handler with a benign oversized parameter that *will not* trigger memory corruption.
#!/usr/bin/env bash
# noisgate verification: CVE-2026-13519 — Tenda JD12L NatStaticSetting stack overflow
# Usage: ./check_jd12l.sh <router_ip> <admin_user> <admin_pass>
# Exits: 0 PATCHED, 1 VULNERABLE, 2 UNKNOWN
set -u
TARGET="${1:-}"
USER="${2:-admin}"
PASS="${3:-admin}"
if [ -z "$TARGET" ]; then
echo "UNKNOWN: usage: $0 <ip> <user> <pass>" >&2
exit 2
fi
BASE="http://${TARGET}"
COOKIES="$(mktemp)"
trap 'rm -f "$COOKIES"' EXIT
# Step 1: fingerprint — pull login page, look for Tenda banner / JD12L model string
BANNER=$(curl -sk --max-time 5 "${BASE}/" | tr -d '\r' | head -c 4096)
if ! echo "$BANNER" | grep -qi 'tenda\|JD12L\|goform'; then
echo "UNKNOWN: target does not look like a Tenda admin interface"
exit 2
fi
# Step 2: authenticate (Tenda uses base64-encoded password POST to /login)
ENCPASS=$(printf '%s' "$PASS" | base64)
curl -sk --max-time 5 -c "$COOKIES" \
-d "username=${USER}&password=${ENCPASS}" \
"${BASE}/login/Auth" > /dev/null
# Step 3: read firmware build from sysinfo (path varies; try common ones)
FW=$(curl -sk --max-time 5 -b "$COOKIES" "${BASE}/goform/getSysInfo" | grep -oE '16\.03\.[0-9.]+' | head -1)
if [ -z "$FW" ]; then
FW=$(curl -sk --max-time 5 -b "$COOKIES" "${BASE}/system_status.asp" | grep -oE '16\.03\.[0-9.]+' | head -1)
fi
if [ -z "$FW" ]; then
echo "UNKNOWN: could not read firmware version (auth failed or path changed)"
exit 2
fi
echo "Detected firmware: $FW"
# Step 4: compare against known-vulnerable build
if [ "$FW" = "16.03.53.23" ]; then
echo "VULNERABLE: JD12L firmware 16.03.53.23 — CVE-2026-13519 applies. No vendor patch available."
exit 1
fi
# Step 5: if a newer build exists, flag for manual review (vendor has no advisory yet)
echo "PATCHED-OR-UNKNOWN: firmware $FW is not the explicitly listed vulnerable build, but Tenda has not published a fix. Verify against vendor advisory before clearing."
exit 0
If you remember one thing.
Sources
- OffSeq Threat Radar — CVE-2026-13519
- CIRCL Vulnerability-Lookup — CVE-2026-13519
- CIRCL Vulnerability-Lookup — GHSA-Q964-W32C-4CR5
- OffSeq — sibling CVE-2026-13518 (same firmware cluster)
- OffSeq — sibling CVE-2026-13517
- OpenCVE — Tenda vendor CVE history
- CISA Known Exploited Vulnerabilities Catalog
- FIRST EPSS Model
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.