CVE-2026-79981
Last modified
CVE-2026-79981 is a medium-severity vulnerability rated 6.5/10 on the CVSS scale. The DNS stub resolver in subsys/net/lib/dns/resolve.c binds one UDP socket per configured server when the resolver context is initialised (dns_resolve_init_locked() -> register_dispatcher() -> dns_dispatcher_register()), with the local port left at 0 so the stack picks an ephemeral port exactly once. dns_write() then sends every subsequent query from that same socket without re-binding, so the source port is constant for the lifetime of the resolver context while only the 16-bit transaction identifier (ctx->queries[i].id, drawn with sys_rand16_get()) varies per query. EPSS estimates a 0.12% chance of exploitation in the next 30 days.
Description
The DNS stub resolver in subsys/net/lib/dns/resolve.c binds one UDP socket per configured server when the resolver context is initialised (dns_resolve_init_locked() -> register_dispatcher() -> dns_dispatcher_register()), with the local port left at 0 so the stack picks an ephemeral port exactly once. dns_write() then sends every subsequent query from that same socket without re-binding, so the source port is constant for the lifetime of the resolver context while only the 16-bit transaction identifier (ctx->queries[i].id, drawn with sys_rand16_get()) varies per query. RFC 5452 section 9.2 requires both to vary; with a fixed port, an off-path attacker has to guess only the identifier. The stable port is cheap to learn. Any single observed query reveals it permanently, and it can also be found by probing the ephemeral UDP range: subsys/net/ip/connection.c answers unmatched unicast UDP with an ICMP port-unreachable, so the resolver's socket is the one port in that range that stays silent. Acceptance of a reply is decided solely by get_slot_by_id() matching the transaction identifier and a CRC-16 of the queried name — the reply's source address is never checked (dispatcher_cb() does ARG_UNUSED(addr)), so forged answers need not even be spoofed to appear to come from the configured server; they only need to reach the resolver's port. An attacker with UDP reachability to the device (same LAN, Wi-Fi or mesh segment, or a globally routable device address) can therefore flood answers for a predictable query name across the 16-bit identifier space during a query window and race the legitimate server. A win makes the application resolve an attacker-chosen address, and with CONFIG_DNS_RESOLVER_CACHE enabled the forged record is retained for its attacker-chosen TTL. The attack still requires winning that race, and applications that validate TLS certificates for the resolved endpoint are largely protected. The fix draws a fresh local port before each query to a server that has nothing outstanding: dns_randomize_source_port() unregisters the dispatcher, closes and reopens the socket, and re-registers it bound to port 0 so the system selects a new port, raising the per-query guessing space from roughly 16 to roughly 31 bits. Multicast DNS and LLMNR are excluded because their ports are protocol-fixed. The behaviour is controlled by CONFIG_DNS_RESOLVER_RANDOMIZE_SOURCE_PORT (default y).
Metrics
Weakness Enumeration
Affected Software
Source: CNA advisory (CVE.org). NVD analysis pending.
| Vendor | Product | Versions |
|---|---|---|
| zephyrproject | zephyr | >= 1.8.0, < 4.5.0 |
References
Timeline
- Published
- Last Modified
- Status
- Awaiting Analysis
Frequently Asked Questions
What is CVE-2026-79981?
How severe is CVE-2026-79981?
How do I fix CVE-2026-79981?
How Strix Helps
- How Strix found a critical auth bypass in etcdStrix autonomously discovered a critical authentication bypass in etcd, later designated CVE-2026-33413.
- Autonomous PentestingAI agents that find and validate exploitable vulnerabilities like this one across your applications.
- PR ReviewsPentest every pull request so vulnerable code is caught before it ships to production.
- AI Penetration TestingHow AI-driven penetration testing continuously covers your attack surface.
Related CVEs from 2026
- CVE-2026-79976The MCTP-over-I2C+GPIO target binding in subsys/pmci/mctp/mc…7.1
- CVE-2026-79977The WireGuard VPN service in subsys/net/lib/wireguard/wg.c u…8.2
- CVE-2026-79978The RTIO streaming completion callback adxl345_process_fifo_…3.6
- CVE-2026-79979The arm64 MMU backend invalidates a single virtual address f…7.8
- CVE-2026-7998Insufficient validation of untrusted input in Dialog in Goog…5.4
- CVE-2026-79980The DHCPv4 client in subsys/net/lib/dhcpv4/dhcpv4.c maintain…5.6
- CVE-2026-79982The Bluetooth HCI USB transport class of the new USB device …8.8
- CVE-2026-79983Improper Limitation of a Pathname to a Restricted Directory …7.4
- CVE-2026-79984Improper Limitation of a Pathname to a Restricted Directory …7.4
- CVE-2026-79985Improper Limitation of a Pathname to a Restricted Directory …7.4
- CVE-2026-79986Improper Limitation of a Pathname to a Restricted Directory …7.4
- CVE-2026-79987A remote, authenticated, non-admin Craft CMS Control Panel u…8.8
Are you affected by CVE-2026-79981?
Run a free Strix scan to check your systems for this vulnerability.
Scan your code nowSource: NVD / NIST
