MiniUPnPd and UPnP vulnerabilities in embedded firmware fall into three classes: memory-safety bugs in SSDP and SOAP parsing, abuse of the protocol itself through SSDP reflection and CallStranger (CVE-2020-12695, published 8 June 2020), and flaws in vendor UPnP daemons, three of which CISA lists as exploited. To triage a router or IoT image, find which stack ships (MiniUPnPd, libupnp, also called pupnp, or a vendor daemon), read its version from the binary, match it against that project's fix history, and confirm that UPnP answers only on the LAN. Then upgrade or backport, and keep UPnP off WAN.
Key takeaways
- Because UPnP was designed for a trusted LAN and has no authentication, but it runs on the device that sits between the LAN and the Internet.
- The MiniUPnP home page describes the daemon as using "only ONE process and no additional thread" and no system() or exec() call, which is one reason it suits low-memory routers.
- Group findings by class first, because the class tells you where the bug is reachable from and which mitigation works.
- MiniUPnPd. There is no separate advisory page.
Why is UPnP such a common weak point in embedded firmware?
Because UPnP was designed for a trusted LAN and has no authentication, but it runs on the device that sits between the LAN and the Internet. The CERT/CC note on CallStranger puts it plainly: the protocol "is designed to be used in a trusted local area network (LAN) and the protocol does not implement any form of authentication or verification." On a router, the UPnP Internet Gateway Device (IGD) service exists to open port forwards in the firewall on request, so any LAN client, or any web page a LAN client visits, can ask for one.
Two kinds of exposure follow. The first is a parser problem: SSDP listens on UDP port 1900 and the control and eventing endpoints take HTTP and SOAP from the network, so a memory-safety bug in either is remotely reachable without credentials. The second is a deployment problem. CERT/CC's older VU#357851 describes routers that "incorrectly accept UPnP requests over the WAN interface", where AddPortMapping and DeletePortMapping let a remote attacker reach internal hosts or proxy traffic through the device. The MiniUPnP project's own home page names the same mistake: "A common problem is to let SSDP or HTTP/SOAP ports open to the internet : they should be only reachable from the LAN."
Which UPnP stacks ship in router and IoT firmware?
Three families cover most images:
| Stack | What it is | Typical devices | Where fixes are published |
|---|---|---|---|
| MiniUPnPd | Small IGD daemon with NAT-PMP and PCP, for Linux netfilter or nftables and BSD pf | Home routers, OpenWrt, pfSense | MiniUPnPd Changelog on GitHub; release tarballs on miniupnp.free.fr |
| libupnp (pupnp, Portable SDK for UPnP Devices) | General UPnP device and control point library | Media servers and renderers, IP cameras, other network devices | pupnp releases and GitHub security advisories |
| Vendor or SDK stacks | IGD code inside a chipset SDK or a vendor firmware tree | Consumer routers built on SoC vendor SDKs | The device or SDK vendor's own advisories |
The MiniUPnP home page describes the daemon as using "only ONE process and no additional thread" and no system() or exec() call, which is one reason it suits low-memory routers. libupnp has a different lineage: CERT/CC's VU#922681 traces it to Intel's Linux SDK for UPnP Devices and notes that "many different vendors produce UPnP-enabled devices that use libupnp." Vendor stacks are the hardest case, because their version strings rarely map to any public changelog.
Which UPnP CVE classes matter?
Group findings by class first, because the class tells you where the bug is reachable from and which mitigation works.
| CVE(s) | Stack | Class | NVD score | Fixed in |
|---|---|---|---|---|
| CVE-2012-5958 to CVE-2012-5965 | libupnp | Stack overflows in SSDP unique_service_name() |
CVSS 2.0: 10.0 | 1.6.18 |
| CVE-2013-0229 | MiniUPnPd | SSDP ProcessSSDPRequest() over-read (denial of service) |
CVSS 2.0: 7.8 | 1.4 |
| CVE-2013-0230 | MiniUPnPd 1.0 | Stack overflow in SOAP ExecuteSoapAction() |
CVSS 2.0: 10.0 | Later releases |
| CVE-2016-8863 | libupnp | Heap overflow in SUBSCRIBE CALLBACK parsing |
CVSS 3.0: 9.8 | 1.6.21 |
| CVE-2019-12107 to CVE-2019-12111 | MiniUPnPd through 2.1 | Heap info leak in eventing, NULL dereferences in SOAP and PCP | CVSS 3.x: 7.5 | Later releases |
| CVE-2020-12695 (CallStranger) | UPnP specification | SUBSCRIBE to arbitrary delivery URL | CVSS 3.1: 7.5 | UPnP Device Architecture 2.0, 17 April 2020 |
| CVE-2021-29462 | libupnp | DNS rebinding (no Host header check) |
CVSS 3.1: 9.8 | 1.14.6 |
| CVE-2026-107159 | MiniUPnPd through 2.3.11 built with --strict |
Divide by zero on SSDP MX: 0 |
Secondary only: 6.5 (3.1) | Source fix of 3 October 2026 |
| CVE-2014-8361 | Realtek SDK miniigd | Command execution via SOAP NewInternalClient |
CVSS 3.1: 9.8 | Vendor firmware |
| CVE-2019-17621 | D-Link DIR-859 | Command execution via SUBSCRIBE to gena.cgi |
CVSS 3.1: 9.8 | Vendor firmware |
| CVE-2021-27137 | DD-WRT | strcpy overflow in SSDP M-SEARCH handling |
Secondary only: 8.1 (3.1) | DD-WRT changeset 45724 |
"Secondary only" means NVD lists a score from the CVE source but has published no Primary score of its own. Scores were read from NVD on 2026-11-13.
SSDP parsing and SSDP reflection. SSDP is the most exposed surface, because it is UDP and needs no session. The 2012 libupnp set was found by Rapid7 during a scan of Internet-facing UPnP devices; VU#922681 says Portable SDK versions 1.2.1a to 1.8.0 carry "at least three remotely exploitable buffer overflows in the unique_service_name() function, which is called to process incoming SSDP requests on UDP port 1900", and that 1.6.18 fixes them. Even a correct SSDP responder is a problem when it answers the Internet: it becomes a reflector. In its analysis of a 100 Gbps SSDP attack, Cloudflare measured "7x packet number amplification" and "20x bandwidth amplification" for an ssdp:all M-SEARCH, and put the open reflectors down to a firewall misconfiguration: "port 1900 UDP open to the world". No CVE covers that: it is a configuration defect, and the fix is to never answer M-SEARCH from WAN.
CallStranger and SUBSCRIBE abuse. UPnP eventing lets a control point send SUBSCRIBE with a CALLBACK header naming where event messages go. Before 2020, the specification did not require that address to be local, so, per CERT/CC, an attacker could "send large amounts of data to arbitrary destinations accessible over the Internet", for DDoS or data exfiltration. The Open Connectivity Foundation's UPnP Device Architecture 2.0 revision of 17 April 2020 now states that "the subscription request containing a delivery URL not on the same network segment as the fully qualified event subscription URL shall not be accepted." The SUBSCRIBE handler is also a code path in its own right: CVE-2016-8863 is a heap overflow in libupnp's CALLBACK parser, and the KEV-listed CVE-2019-17621 is command execution through a SUBSCRIBE request to D-Link's gena.cgi. Our hostapd and wpa_supplicant guide covers the CallStranger fix in hostapd's WPS UPnP code, a fourth UPnP stack that many access points carry.
SOAP and HTTP parsing. Control actions such as AddPortMapping arrive as SOAP over HTTP. CVE-2013-0230 is a stack overflow in MiniUPnPd 1.0 from "a long quoted method" in the SOAPAction header, and the vendor CVE-2014-8361 lets a crafted NewInternalClient value reach a shell in Realtek's miniigd. The second is exploited: CISA added it to KEV on 2023-09-18, and the NVD description says it was "exploited in the wild through 2023." For the code-level fixes behind these classes, see our guides on fixing memory corruption and fixing command injection in embedded firmware.
Where does each project publish security fixes?
MiniUPnPd. There is no separate advisory page. Fixes appear as dated entries in the MiniUPnPd Changelog, grouped under each release, and release tarballs are listed on miniupnp.free.fr. The latest release on 2026-11-13 is 2.3.11, of 12 August 2026. Entries made after it include "MX: 0 in SSDP is invalid. fixes CVE-2026-107159" (3 October 2026) and "enforce Content-Length / header limit on HTTP receive" (29 August 2026), so a device that needs those fixes must take the commits from the source tree until the next tagged release. Read the dated entries, not only the version headings: 2.3.4 enabled secure mode by default and disabled the DeviceProtection service by default, and 2.3.11 fixed a heap overflow in PinholeVerification(). The MiniUPnP home page adds that "several vulnerabilities have been found in MiniUPnPd, so it is very important to update your code to the last version."
libupnp (pupnp). The project publishes GitHub security advisories with an affected range and a patched version each, and lists the fixes in release notes. Activity in 2026 has been heavy: release 22.2.2 of 9 November 2026 is the latest, and the advisory list shows more than 25 advisories published between April and November 2026, many of them for pre-authentication denial of service and out-of-bounds reads in SSDP, GENA, HTTP and XML parsing. Only some carry CVE numbers, such as CVE-2026-57487 (chunked bodies bypassing the content-length limit, fixed in 2.0.2), so a CVE-only feed under-reports them. The security policy marks only the current release line as supported. Older lines receive occasional fixes, for example 1.14.31 in April 2026 for CVE-2026-41682, but a device on 1.6.x or 1.8.x should be treated as unsupported.
Vendor stacks. Fixes come from the SoC or device vendor only. For CVE-2014-8361, CISA's KEV entry points to a D-Link advisory rather than a Realtek one, which shows how far the fix trail can be from the code's origin. If your SDK supplier ships an IGD daemon, ask for its version history and fix list in writing.
How do you identify the UPnP stack and version in a firmware image?
Work from the binary out to the configuration:
Unpack the imageExtract the root file system with binwalk, unblob or the vendor's tooling. If parts are encrypted or packed, our firmware entropy analysis guide covers how to tell. Find UPnP candidatesLook for binaries named miniupnpd,upnpd,miniigdorigd, for shared libraries namedlibupnp,libixmlandlibthreadutil, and for any binary that containsurn:schemas-upnp-org:service:WANIPConnectionorM-SEARCH.Read the SERVER stringEvery UPnP stack identifies itself in SSDP and HTTP responses. MiniUPnPd builds its SERVER header as OS version, UPnP version and MiniUPnPd/followed by its version. Current libupnp sendslibupnp/and its version; older releases such as 1.6.18 and 1.14.0 sentPortable SDK for UPnP devices/and the version instead. These tokens can be found withstringswithout running the binary.Read build optionsSince 2.3.4, miniupnpd --versionprints a short list of build-time options, which tells you, for example, whether--strictmode (the condition for CVE-2026-107159) and IPv6 pinholes were compiled in. In an emulated run you can read it directly; on a static image, look for the same option names near the version string.Check the package recordOn OpenWrt-based images, the opkg database lists miniupnpd-iptablesorminiupnpd-nftableswith the version. OpenWrt's package feed carried 2.3.11 on 2026-11-13.Read the runtime configurationIn miniupnpd.conf, or OpenWrt's UCI file forupnpd, recordext_ifname,listening_ip,secure_mode,enable_upnp,enable_pcp_pmpand theallowanddenypermission rules. The upstream example configuration says secure mode means "UPnP clients can only add mappings to their own IP" and recommends allowing only ports at or above 1024 and ending withdeny 0-65535 0.0.0.0/0 0-65535.Check what listens whereIn an emulated or bench run, confirm which interfaces UDP 1900 and the UPnP HTTP port bind to, and test from the WAN side. A version match says nothing about exposure; a WAN-side M-SEARCH that gets an answer does. Look for backportsThe version string is the upstream base. Vendor SDKs often carry patches, so check the GPL source release or build tree for patch files before you mark a version-matched CVE as affected.
Our Yocto and Buildroot SBOM guide shows how to record the same facts at build time, where they are exact.
How should you prioritise UPnP CVEs?
Rank by exposure first: is the daemon reachable from WAN, from the LAN only, or not running? Then by exploitation data, then by CVSS. Data as of 2026-11-12 (CISA KEV catalog version 2026.11.10, FIRST EPSS scores dated 2026-11-12):
| CVE(s) | In KEV | EPSS (percentile) | Typical priority |
|---|---|---|---|
| CVE-2014-8361 (Realtek miniigd) | Yes, added 2023-09-18 | 0.9997 (99.98th) | Critical on any device carrying the Realtek SDK IGD daemon |
| CVE-2019-17621 (D-Link gena.cgi) | Yes, added 2023-06-29 | 0.906 (99.8th) | Critical on affected D-Link firmware; a pattern to test for in any vendor GENA handler |
| CVE-2021-27137 (DD-WRT SSDP) | Yes, added 2026-07-21 | 0.040 (90.7th) | High on DD-WRT-based builds with UPnP enabled |
| CVE-2012-5958 to CVE-2012-5965 (libupnp) | No | 0.326 to 0.832 (98.4th and above) | High on any libupnp below 1.6.18 |
| CVE-2013-0229, CVE-2013-0230 (MiniUPnPd) | No | 0.764, 0.692 (99.4th and above) | High on very old MiniUPnPd builds |
| CVE-2020-12695 (CallStranger) | No | 0.152 (96.8th) | High if UPnP eventing is reachable from WAN, medium on LAN only |
| CVE-2019-12107 to CVE-2019-12111 (MiniUPnPd) | No | 0.026 to 0.034 (85th to 89th) | Medium: LAN-side denial of service and info leak on 2.1 and older |
| CVE-2021-29462 (libupnp DNS rebinding) | No | 0.006 (51st) | Medium: reachable through a LAN browser |
CVE-2026-107159 (MiniUPnPd MX: 0) |
No | 0.005 (40th) | Low to medium: LAN-side crash, only with --strict builds |
Two things stand out. The KEV-listed UPnP flaws are all in vendor stacks, not in MiniUPnPd or libupnp, so a component list that only shows open-source packages can miss the most exploited code on the device. And the EPSS scores for old libupnp and MiniUPnPd CVEs stay high a decade on, because those versions remain on the Internet. Our KEV and EPSS prioritisation guide explains how the two signals combine.
How do you patch or disable UPnP on WAN?
Upgrade or backport, close the WAN side, tighten the LAN side, then rebuild and prove it.
Upgrade or backport. Move MiniUPnPd to 2.3.11 and apply the later source fixes you need, such as the CVE-2026-107159 commit if you build with --strict. Move libupnp to the current pupnp release; from 1.6.x or 1.8.x that is a large API jump, so budget for it. For a vendor daemon, get the fixed build from the supplier or replace the daemon with a maintained one.
Close the WAN side. Each of these removes a whole class from Internet reach:
| Setting | Effect |
|---|---|
Bind to LAN only (listening_ip set to LAN interfaces, ext_ifname set to the WAN interface) |
The daemon never listens on WAN; MiniUPnPd has filtered WAN-sourced SSDP and HTTP since 1.8 |
| Default firewall drops UDP 1900 and the UPnP HTTP port on WAN | Removes SSDP reflection and WAN-side parser bugs, even if the daemon misbinds |
| Ship UPnP off by default | Users who do not need port mapping never run the code |
Reject non-local CALLBACK URLs |
Closes CallStranger; current MiniUPnPd source accepts a callback only on the requesting client's own address |
CERT/CC's CallStranger note asks device makers to "disable the UPnP SUBSCRIBE capability in their default configuration" and to require users to enable it explicitly for the trusted LAN. OpenWrt's default miniupnpd configuration is a good reference: enabled is 0, secure_mode is 1, and the permission rules allow only ports 1024 to 65535 and end with a default deny. Zyxel's statement in the CERT/CC note gives the WAN-side argument: its affected product had a default firewall rule blocking UPnP from WAN, so the risk arose only if users disabled the firewall.
Tighten the LAN side. Keep secure mode on, so a client can map ports only to its own address. Restrict permission rules to ports 1024 and above. Leave the DeviceProtection service and IPv6 pinholes off unless the product uses them.
Rebuild, re-scan, release. Regenerate the firmware SBOM, compare it with the previous release using firmware diffing, and run a WAN-side SSDP and HTTP test against the new build. Publish the fix with affected versions, fixed version and the CVE list; where a CVE does not apply because UPnP is not compiled in or never listens on WAN, record that in a VEX statement as our CSAF and VEX for device makers guide shows. The same image usually also ships dnsmasq, BusyBox and Dropbear; see our guides on dnsmasq vulnerabilities, BusyBox vulnerabilities and Dropbear SSH vulnerabilities.
AI-assisted analysis: what SoftWSP actually runs
SoftWSP's automated scan unpacks a firmware image, catalogs the software components in the extracted file system, and records each one with its version, so a miniupnpd or libupnp package recorded in the opkg or other package database appears in the component list. It then matches component versions against CVE records, CISA's KEV catalog and FIRST's EPSS scores. This is deterministic code: the code scores, and AI narrates.
AI's part is the written explanation on top of that matching. It summarises which UPnP-related CVEs matched, which are KEV-listed or have a high EPSS score, and what version evidence supports each match, and every sentence cites the component, version and record it relies on. An engineer reviews every finding before the report is delivered. Several judgements in this guide stay with that engineer: recognising a vendor daemon such as miniigd from its strings when no package record names it, confirming that a component maps to the right NVD product, reading the build options and configuration, and testing whether UPnP answers on WAN. Those are the steps that turn a version match into an "affected" or "not affected" decision.
For where UPnP review fits in a full assessment, see the OWASP Firmware Security Testing Methodology guide, or device & firmware security services to have a specific image reviewed.
This guide draws on the MiniUPnPd Changelog, example configuration and source code, the MiniUPnP home page, pupnp's release notes, security advisories and security policy, CERT/CC notes VU#339275, VU#922681 and VU#357851, the Open Connectivity Foundation's UPnP Device Architecture 2.0, Cloudflare's SSDP measurement, OpenWrt's miniupnpd package, NVD, CISA's KEV catalog (version 2026.11.10) and FIRST EPSS data dated 2026-11-12, all read directly on 2026-11-13.
Put this guide to work
Frequently asked questions
Which UPnP vulnerabilities matter most for routers and IoT devices?
Three classes. Memory-safety bugs in SSDP and SOAP parsing, such as the 2012 libupnp unique_service_name() overflows (CVE-2012-5958 to CVE-2012-5965, fixed in 1.6.18) and the MiniUPnPd ExecuteSoapAction() overflow CVE-2013-0230. Abuse of the protocol itself: SSDP reflection on UDP port 1900 and CallStranger (CVE-2020-12695), where a SUBSCRIBE request makes the device send event traffic to an arbitrary address. And bugs in vendor UPnP daemons, three of which are in CISA's KEV catalog: Realtek SDK miniigd (CVE-2014-8361), D-Link DIR-859 gena.cgi (CVE-2019-17621) and DD-WRT's SSDP code (CVE-2021-27137). All three classes get worse when UPnP answers on the WAN interface.
How do I tell whether a firmware image ships MiniUPnPd, libupnp or a vendor UPnP stack?
Extract the root file system and search binaries for the SERVER string the stack sends in SSDP and HTTP responses. MiniUPnPd builds it as OS version, UPnP version and "MiniUPnPd/" plus its version. Current libupnp (pupnp) sends "libupnp/" plus its version, while older releases such as 1.6.18 and 1.14.0 sent "Portable SDK for UPnP devices/" plus the version. A daemon with neither token, such as Realtek's miniigd, is a vendor stack and needs the vendor's own fix history. On OpenWrt-based images the opkg database also names the miniupnpd package and version.
Is CallStranger (CVE-2020-12695) fixed in MiniUPnPd and libupnp?
CVE-2020-12695 is a flaw in the UPnP specification, not in one code base. The Open Connectivity Foundation fixed it in the UPnP Device Architecture 2.0 revision of 17 April 2020, which says a subscription whose delivery URL is not on the same network segment shall not be accepted. Current MiniUPnPd source goes further and accepts a CALLBACK URL only if its host is the address of the client that sent the SUBSCRIBE. For libupnp and vendor stacks, check how the CALLBACK header is validated in the version you ship, and keep the UPnP HTTP port closed on WAN either way.
Should a device maker disable UPnP on the WAN interface?
Yes. The MiniUPnP project's own site says SSDP and the HTTP/SOAP ports "should be only reachable from the LAN", and CERT/CC's CallStranger note tells users to disable UPnP on Internet-accessible interfaces. Bind the daemon to LAN interfaces only, block UDP 1900 and the UPnP HTTP port on WAN in the default firewall, and ship UPnP switched off unless the product needs it. OpenWrt's default miniupnpd configuration does this: the service is disabled and secure mode is on.
Does SoftWSP check UPnP components in my firmware?
SoftWSP's automated scan lists the software components it finds in the unpacked firmware file system, including miniupnpd or libupnp where package metadata records them, and matches component versions against CVE records, CISA's KEV catalog and FIRST EPSS scores. AI then writes a plain-language summary that cites the component, version and record behind each finding, and an engineer reviews it. Identifying a vendor UPnP daemon from its strings, confirming the NVD product mapping and checking whether UPnP listens on WAN are part of that engineer review.
Sources
- MiniUPnP project: MiniUPnPd Changelog (versions 1.4 to 2.3.11 and later source fixes)
- MiniUPnP Project HomePage (security section)
- MiniUPnPd example configuration file miniupnpd.conf (secure_mode, listening_ip, permission rules)
- OpenWrt packages: miniupnpd default UCI configuration (upnpd.config)
- pupnp (Portable SDK for UPnP Devices): releases
- pupnp: GitHub security advisories
- pupnp: Security Policy (SECURITY.md)
- CERT/CC Vulnerability Note VU#339275: UPnP SUBSCRIBE can be used for traffic amplification and data exfiltration (CallStranger)
- CERT/CC Vulnerability Note VU#922681: Portable SDK for UPnP Devices (libupnp) contains multiple buffer overflows in SSDP
- CERT/CC Vulnerability Note VU#357851: UPnP requests accepted over router WAN interfaces
- Open Connectivity Foundation: UPnP Device Architecture 2.0 (revision of 17 April 2020)
- Open Connectivity Foundation: UPnP Standards & Architecture
- Cloudflare: Stupidly Simple DDoS Protocol (SSDP) generates 100 Gbps DDoS (28 June 2017)
- NIST NVD: CVE-2020-12695
- NIST NVD: CVE-2026-107159 (MiniUPnPd MX: 0 divide-by-zero)
- NIST NVD: CVE-2021-27137 (DD-WRT UPnP ssdp_msearch overflow)
- CISA: Known Exploited Vulnerabilities (KEV) Catalog
About this guide
SoftWSP Firmware Security Desk
Covers the Firmware vulnerabilities & fixes cluster: 114 guides.

In this cluster
Questions about this page?
