Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessGain adjacent or on-path network position
-
DeliveryObserve or trigger a pending DNS query
-
ExploitSend forged UDP response with matching transaction ID
-
ExecutionResolver accepts spoofed record without source check
-
ImpactRedirect hostname resolution for MITM, SSRF, or mail interception
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V6 - Authentication Origin validation
|
| Exploitation Conditions | No authentication is required (PR:N), but exploitation is constrained by network position and a guessing race, not by any product configuration toggle. The flaw is inherent to twisted.names.dns.DNSDatagramProtocol.datagramReceived, which accepts a UDP DNS response on transaction-ID match alone and never validates the datagram source address - affecting every consumer of the standard twisted.names.client.Resolver and createResolver, including twisted.mail MX resolution. Limiting factors per the advisory: against the standard client.Resolver, each query uses a fresh random source port, so an off-path attacker must guess ~32 bits (ephemeral port + transaction ID) within the query timeout window; an on-path attacker or one sharing a broadcast domain/NAT with the resolver or real server faces no barrier beyond the transaction ID. The single-barrier case is applications that directly construct and reuse one DNSDatagramProtocol instance across multiple queries (a supported pattern): after the first query the source port is fixed, so only the 16-bit transaction ID must be guessed. Affects Twisted <= 26.4.0; fixed in 26.10.0rc1. |
| Impact | This is a genuine but low-urgency defense-in-depth gap, not a high-priority emergency. The input CVSS 3.1 vector (AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N, base 3.1 Low) and the vuln.today Decision label 'monitor' are consistent: realistic exploitation requires a privileged network position and winning a probabilistic guessing race. The advisory itself quantifies the difficulty - against the standard twisted.names.client.Resolver, an off-path attacker must guess roughly 32 bits (a fresh random ephemeral source port plus the 16-bit transaction ID) within the query timeout, because the client cycles a new random source port per query; against code that reuses a single DNSDatagramProtocol instance across multiple queries, only the 16-bit transaction ID must be guessed after the first query. The AV:A (Adjacent) choice is well-supported because the advisory stresses that the real risk is for an on-path attacker or one sharing a broadcast domain or NAT, for whom source-address validation would be the stopping check and it is absent. No EPSS score was provided, so statistical exploitation-likelihood cannot be compared here. The vulnerability is NOT in CISA KEV (status not asserted in input) and there is no indication of active exploitation. A complete, demonstrated proof-of-concept is embedded in the vendor GHSA advisory (shown accepting a forged response), though the structured signals do not flag it as confirmed working exploit code. Net: a real correctness/best-practice flaw (missing RFC 5452 source-address validation) worth patching on a routine cycle, but the AC:H race condition and network-adjacency requirement keep real-world mass-exploitation risk low. |
| Exploit ScenarioDerived | An attacker on the same LAN, broadcast domain, or NAT as a host running a Twisted-based application delivers a forged UDP DNS response to the resolver's listening port with a matching 16-bit transaction ID (and, for the standard client, the correct ephemeral source port), before the legitimate server replies. Because twisted.names never checks the response's source address, the forged A/MX record is accepted, redirecting resolution to attacker-controlled infrastructure for mail interception, SSRF, or MITM. A working proof-of-concept demonstrating acceptance of a forged response from an unrelated local socket is published in the vendor's GHSA advisory. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 23, 2026
DNS response spoofing in Twisted's twisted.names client and resolver (all versions through 26.4.0) arises because twisted.names.dns.DNSDatagramProtocol accepts a UDP DNS answer solely on a matching 16-bit transaction ID and never verifies that the datagram originated from the server the query was sent to. Attackers who can deliver a UDP packet to the resolver's listening port with the right transaction ID can inject a forged answer and redirect hostname resolution, enabling mail interception via spoofed MX/A records, server-side request forgery, or man-in-the-middle positioning; on-path attackers or those sharing a broadcast domain/NAT with the resolver or the real DNS server face essentially no barrier, while the standard client.Resolver's per-query random source-port rotation raises off-path effort to roughly 32 bits of combined entropy within the query timeout. Applications that directly construct and reuse one DNSDatagramProtocol instance across multiple queries are limited to the 16-bit transaction-ID space after the first query, which is the weakest case; the advisory includes a public PoC reference (not verified as working exploit code), there is no KEV listing or active-exploitation signal, and the assessed severity is low (CVSS 3.1, AV:A/AC:H) with a monitor priority.
RemediationAI
Vendor-released patch: 26.10.0rc1, which contains the source-address validation change delivered via PR #12700 (commit b53e1c3) and is published at https://github.com/twisted/twisted/releases/tag/twisted-26.10.0rc1 - since this is a release candidate, track the advisory https://github.com/twisted/twisted/security/advisories/GHSA-jj36-9pvh-vj5r for the corresponding final stable release and upgrade to it as soon as it ships. For environments that cannot move immediately, the highest-value compensating action targets the weakest case in the advisory: stop reusing a single DNSDatagramProtocol instance across multiple queries, and instead resolve through twisted.names.client.Resolver/createResolver, which binds a fresh random ephemeral port per query and restores the ~32-bit combined entropy for off-path attackers; the trade-off is per-query socket churn (extra setup/teardown latency and file-descriptor use) and no benefit against on-path attackers or those sharing a broadcast domain or NAT with the resolver or the real DNS server. Where the resolver's listening port is reachable only from a restricted network segment, tightening that reachability reduces the population of hosts that can deliver forged datagrams at all, but it does not substitute for source-address validation against on-path adversaries. DNSSEC validation of answers, where the resolver stack supports it, limits the impact of a successfully injected record but does not close the acceptance gap itself.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in pypi
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Twisted is an event-driven Python networking framework, and twisted.names implements its DNS client on top of a UDP datagram protocol. The root cause is CWE-346 (origin validation error): DNSDatagramProtocol.datagramReceived in src/twisted/names/dns.py receives both the datagram and its source address, but the addr parameter is never compared to the address the pending query was sent to. Acceptance is gated only by 'm.id in self.liveMessages', a dictionary keyed by the 16-bit transaction ID chosen in DNSMixin.pickID(), and because the socket is created with a plain listenUDP(0, ...) that is not connected to the queried server, the kernel does not filter datagrams by source address either. Transaction IDs are generated with a secure random source, so they are not predictable, but 16 bits is only a 1-in-65536 space per attempt. RFC 5452 treats source-address validation as a defence independent of port and ID randomisation, and this implementation drops that backstop entirely; twisted.names.client.Resolver compensates partially by building a fresh DNSDatagramProtocol bound to a new random ephemeral port for every query and tearing it down afterwards, which is why the standard API path retains roughly 32 bits of combined entropy. The upstream fix (PR #12700, commit b53e1c3) reworks the related UDP/names plumbing and protocol typing alongside the validation change; the packaging metadata lists Twisted <= 26.4.0 as vulnerable and 26.10.0rc1 as fixed, and the CPE cpe:2.3:a:twisted:twisted:*:*:*:*:*:*:*:* reflects that the whole prior product line is affected rather than a single version.
Know when Twisted gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N
Realistic exploitation needs adjacent/on-path position (AV:A) and winning a port+transaction-ID guessing race in the timeout (AC:H); unauthenticated (PR:N); direct impact is forged resolution data (I:L), no inherent C/A loss.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
Twisted is an event-based framework for internet applications, supporting Python 3.6+. Prior to 26.10.0rc1, twisted.names.dns.DNSDatagramProtocol accepts a UDP DNS response for a pending query when its 16-bit transaction ID matches but does not verify that the response came from the queried host and port. An attacker able to deliver a packet to the resolver's listening port with the correct transaction ID can inject a forged answer. The standard twisted.names.client.Resolver uses a new random source port for each query, increasing off-path attack complexity, while applications that reuse a DNSDatagramProtocol instance expose only the transaction-ID search space after the first query. A successful forgery can redirect hostname resolution and enable mail interception, server-side request forgery, or man-in-the-middle positioning. This issue is fixed in version 26.10.0rc1.
Blast Radius
ecosystem impact- 5 pypi packages depend on twisted (5 direct, 0 indirect)
Ecosystem-wide dependent count for version 26.10.0rc1.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Server-Side Request Forgery exploits applications that fetch remote resources based on user-supplied URLs.
In Twisted Web through 19.10.0, there was an HTTP request splitting vulnerability. Rated critical severity (CVSS 9.8), t
In Twisted Web through 19.10.0, there was an HTTP request splitting vulnerability. Rated critical severity (CVSS 9.8), t
Twisted is an event-based framework for internet applications, supporting Python 3.6+. Rated high severity (CVSS 7.5), t
Twisted is an event-based framework for internet applications, supporting Python 3.6+. Rated medium severity (CVSS 6.1),
In Twisted before 19.2.1, twisted.web did not validate or sanitize URIs or HTTP methods, allowing an attacker to inject
Twisted is an event-based framework for internet applications. Rated medium severity (CVSS 5.4), this vulnerability is r
Twisted is an event-based framework for internet applications. Rated medium severity (CVSS 5.3), this vulnerability is r
Unauthenticated memory exhaustion in Twisted's twisted.words.xish.domish XML element stream allows a remote peer to keep
Twisted is an event-based framework for internet applications, supporting Python 3.6+. Rated high severity (CVSS 8.1), t
Unauthenticated remote memory exhaustion in Twisted's conch telnet transport lets any peer that can reach an exposed tel
Unauthenticated remote memory exhaustion in Twisted's IRC server (twisted.words) lets a single TCP connection that never
In words.protocols.jabber.xmlstream in Twisted through 19.2.1, XMPP support did not verify certificates when used with T
EUVD-2026-109152
GHSA-jj36-9pvh-vj5r
NVD
CVE.org
EPSS
Exploit-DB