CVE-2026-115776
Twisted: Unauthenticated Remote Denial of Service in the Twisted IRC Server via an Unbounded Line Buffer
Twisted is an event-based framework for internet applications, supporting Python 3.6+. Prior to 26.10.0rc1, twisted.words.protocols.irc.IRC.dataReceived retains all bytes received without a line feed in its per-connection buffer and applies no maximum line length. The twisted.words.service.IRCUser server subclass inherits this behavior, and buffering occurs before PASS, NICK, or USER authentication commands. An unauthenticated connection can continuously grow the buffer until the shared server process runs out of memory and drops all users. This issue is fixed in version 26.10.0rc1.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- None
- Availability
- High
Exploit likelihood
What each source reports
CVE List Score used
7.5
Twisted: Unauthenticated Remote Denial of Service in the Twisted IRC Server via an Unbounded Line Buffer
Twisted is an event-based framework for internet applications, supporting Python 3.6+. Prior to 26.10.0rc1, twisted.words.protocols.irc.IRC.dataReceived retains all bytes received without a line feed in its per-connection buffer and applies no maximum line length. The twisted.words.service.IRCUser server subclass inherits this behavior, and buffering occurs before PASS, NICK, or USER authentication commands. An unauthenticated connection can continuously grow the buffer until the shared server process runs out of memory and drops all users. This issue is fixed in version 26.10.0rc1.
- Record
CVE-2026-115776- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-400, CWE-770
- Updated
- 2026-11-02
EUVDEUVD-2026-109150
7.5
Twisted is an event-based framework for internet applications, supporting Python 3.6+. Prior to 26.10.0rc1, twisted.words.protocols.irc.IRC.dataReceived retains all bytes received without a line feed in its per-connection buffer and applies no maximum line length. The twisted.words.service.IRCUser server subclass inherits this behavior, and buffering occurs before PASS, NICK, or USER authentication commands. An unauthenticated connection can continuously grow the buffer until the shared server process runs out of memory and drops all users. This issue is fixed in version 26.10.0rc1.
- Record
EUVD-2026-109150- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-53xc-49m8-p798
7.5
Twisted: Unauthenticated Remote Denial of Service in the Twisted IRC Server via an Unbounded Line Buffer
Summary
An unbounded-buffer vulnerability (CWE-770) in the Twisted words IRC server lets any unauthenticated remote client exhaust server memory. twisted.words.protocols.irc.IRC.dataReceived appends every received byte to a per-connection buffer and only removes data at a line feed, with no maximum length. Because IRC is a plain Protocol and not a LineReceiver, one connection that streams bytes without a line feed grows the buffer without bound and drives the whole single-threaded process to out-of-memory, dropping every user at once. The twistd words server inherits the method unchanged through IRCUser, and the data is buffered before any authentication.
Details
IRC.dataReceived keeps everything up to the last line feed in self.buffer:
# twisted/words/protocols/irc.py
class IRC(protocol.Protocol): # not a LineReceiver, so no MAX_LENGTH
buffer = ""
def dataReceived(self, data):
if isinstance(data, bytes):
data = data.decode("utf-8")
lines = (self.buffer + data).split(LF)
self.buffer = lines.pop() # no 3line feed -> whole input stays buffered
...
With no line feed in the data, lines.pop() returns the entire accumulated content to self.buffer, so it grows by every chunk and is never bounded; IRC defines no MAX_LENGTH, no lineLengthExceeded, and no timeout, so the connection is never closed. The twistd words server protocol IRCUser subclasses IRC without overriding dataReceived, and the buffer is filled before any PASS, NICK, or USER, so no credentials are required.
Affected product: Twisted (twisted.words), twisted.words.protocols.irc.IRC and its subclass twisted.words.service.IRCUser
Affected versions: 26.4.0 and earlier
PoC
On a standard Twisted words IRC server (the server twistd words runs, using IRCUser), an unauthenticated client opens a single TCP connection and continuously sends data that contains no line feed, never completing a line. Every chunk is appended to the connection's line buffer, and because no complete line is ever formed none of it is consumed, so the buffer grows by the full volume sent.
In a measured run against a real IRCFactory server, one unauthenticated connection sending 60 MB of line-feed-free data raised the server process resident memory from about 47 MB to 2966 MB (roughly 49 MB per MB sent) with the connection still open and no limit triggered. Sending the same volume as normal line-feed-terminated commands leaves memory flat, which isolates the cause to the missing line-length bound.
Impact
An unauthenticated remote denial of service from allocation without limits (CWE-770) leading to uncontrolled resource consumption (CWE-400). A single credential-free connection exhausts the memory of the whole twistd words process, and because one process serves every user, the crash drops all connections at once and the service stays down until it is restarted. The quadratic buffer copy reaches the same effect faster. There is no confidentiality or integrity impact and no code execution.
- Record
GHSA-53xc-49m8-p798- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-400, CWE-770
- Updated
- 2026-11-02
NVD
7.5
Twisted is an event-based framework for internet applications, supporting Python 3.6+. Prior to 26.10.0rc1, twisted.words.protocols.irc.IRC.dataReceived retains all bytes received without a line feed in its per-connection buffer and applies no maximum line length. The twisted.words.service.IRCUser server subclass inherits this behavior, and buffering occurs before PASS, NICK, or USER authentication commands. An unauthenticated connection can continuously grow the buffer until the shared server process runs out of memory and drops all users. This issue is fixed in version 26.10.0rc1.
- Record
CVE-2026-115776- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-400, CWE-770
- Updated
- 2026-11-02
OSV
7.5
Twisted: Unauthenticated Remote Denial of Service in the Twisted IRC Server via an Unbounded Line Buffer
Twisted is an event-based framework for internet applications, supporting Python 3.6+. Prior to 26.10.0rc1, twisted.words.protocols.irc.IRC.dataReceived retains all bytes received without a line feed in its per-connection buffer and applies no maximum line length. The twisted.words.service.IRCUser server subclass inherits this behavior, and buffering occurs before PASS, NICK, or USER authentication commands. An unauthenticated connection can continuously grow the buffer until the shared server process runs out of memory and drops all users. This issue is fixed in version 26.10.0rc1.
- Record
CVE-2026-115776- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-400, CWE-770
- Updated
- 2026-11-02
OSVDEBIAN-CVE-2026-115776
7.5
Twisted is an event-based framework for internet applications, supporting Python 3.6+. Prior to 26.10.0rc1, twisted.words.protocols.irc.IRC.dataReceived retains all bytes received without a line feed in its per-connection buffer and applies no maximum line length. The twisted.words.service.IRCUser server subclass inherits this behavior, and buffering occurs before PASS, NICK, or USER authentication commands. An unauthenticated connection can continuously grow the buffer until the shared server process runs out of memory and drops all users. This issue is fixed in version 26.10.0rc1.
- Record
DEBIAN-CVE-2026-115776- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-02
Show 5 moreShow less
OSVGHSA-53xc-49m8-p798
7.5
Twisted: Unauthenticated Remote Denial of Service in the Twisted IRC Server via an Unbounded Line Buffer
Summary
An unbounded-buffer vulnerability (CWE-770) in the Twisted words IRC server lets any unauthenticated remote client exhaust server memory. twisted.words.protocols.irc.IRC.dataReceived appends every received byte to a per-connection buffer and only removes data at a line feed, with no maximum length. Because IRC is a plain Protocol and not a LineReceiver, one connection that streams bytes without a line feed grows the buffer without bound and drives the whole single-threaded process to out-of-memory, dropping every user at once. The twistd words server inherits the method unchanged through IRCUser, and the data is buffered before any authentication.
Details
IRC.dataReceived keeps everything up to the last line feed in self.buffer:
# twisted/words/protocols/irc.py
class IRC(protocol.Protocol): # not a LineReceiver, so no MAX_LENGTH
buffer = ""
def dataReceived(self, data):
if isinstance(data, bytes):
data = data.decode("utf-8")
lines = (self.buffer + data).split(LF)
self.buffer = lines.pop() # no 3line feed -> whole input stays buffered
...
With no line feed in the data, lines.pop() returns the entire accumulated content to self.buffer, so it grows by every chunk and is never bounded; IRC defines no MAX_LENGTH, no lineLengthExceeded, and no timeout, so the connection is never closed. The twistd words server protocol IRCUser subclasses IRC without overriding dataReceived, and the buffer is filled before any PASS, NICK, or USER, so no credentials are required.
Affected product: Twisted (twisted.words), twisted.words.protocols.irc.IRC and its subclass twisted.words.service.IRCUser
Affected versions: 26.4.0 and earlier
PoC
On a standard Twisted words IRC server (the server twistd words runs, using IRCUser), an unauthenticated client opens a single TCP connection and continuously sends data that contains no line feed, never completing a line. Every chunk is appended to the connection's line buffer, and because no complete line is ever formed none of it is consumed, so the buffer grows by the full volume sent.
In a measured run against a real IRCFactory server, one unauthenticated connection sending 60 MB of line-feed-free data raised the server process resident memory from about 47 MB to 2966 MB (roughly 49 MB per MB sent) with the connection still open and no limit triggered. Sending the same volume as normal line-feed-terminated commands leaves memory flat, which isolates the cause to the missing line-length bound.
Impact
An unauthenticated remote denial of service from allocation without limits (CWE-770) leading to uncontrolled resource consumption (CWE-400). A single credential-free connection exhausts the memory of the whole twistd words process, and because one process serves every user, the crash drops all connections at once and the service stays down until it is restarted. The quadratic buffer copy reaches the same effect faster. There is no confidentiality or integrity impact and no code execution.
- Record
GHSA-53xc-49m8-p798- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Weakness
- CWE-400, CWE-770
- Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-115776
7.5
Twisted is an event-based framework for internet applications, supporting Python 3.6+. Prior to 26.10.0rc1, twisted.words.protocols.irc.IRC.dataReceived retains all bytes received without a line feed in its per-connection buffer and applies no maximum line length. The twisted.words.service.IRCUser server subclass inherits this behavior, and buffering occurs before PASS, NICK, or USER authentication commands. An unauthenticated connection can continuously grow the buffer until the shared server process runs out of memory and drops all users. This issue is fixed in version 26.10.0rc1.
- Record
UBUNTU-CVE-2026-115776- CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H - Updated
- 2026-11-05
OSVAZL-111410 No score
CVE-2026-115776 affecting package python-twisted 22.10.0-7
Twisted is an event-based framework for internet applications, supporting Python 3.6+. Prior to 26.10.0rc1, twisted.words.protocols.irc.IRC.dataReceived retains all bytes received without a line feed in its per-connection buffer and applies no maximum line length. The twisted.words.service.IRCUser server subclass inherits this behavior, and buffering occurs before PASS, NICK, or USER authentication commands. An unauthenticated connection can continuously grow the buffer until the shared server process runs out of memory and drops all users. This issue is fixed in version 26.10.0rc1.
- Record
AZL-111410- Updated
- 2026-11-05
OSVCLSA-2026-1793013013 No score
TuxCare security update for twisted (4 CVEs)
TuxCare rebuilt twisted to address 4 CVEs. Fixed in 20.3.0.post7+tuxcare.
- Record
CLSA-2026-1793013013- Updated
- 2026-11-02
OSVopenSUSE-SU-2026:12381-1 No score
python-Twisted-doc-26.10.0-1.1 on GA media
These are all security issues fixed in the python-Twisted-doc-26.10.0-1.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2026:12381-1- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
twistedPyPI |
through 26.4.0 | 26.10.0rc1 |
python-twistedAzure Linux:3 |
through 22.10.0-7 | None known |
twistedTuxCare:PyPI From an advisory covering 4 CVEs |
20.3.0 up to 20.3.0.post7+tuxcare, plus listed versions 20.3.0.post4+tuxcare20.3.0.post5+tuxcare20.3.0.post6+tuxcare |
20.3.0.post7+tuxcare |
twistedDebian:12 |
All versions, plus listed versions 22.4.0-422.4.0-4+deb12u123.10.0-123.10.0-224.10.0-1 Show 20 moreShow less24.10.0-224.11.0-124.3.0-124.3.0-224.3.0-324.7.0-124.7.0-224.7.0-325.5.0-125.5.0-225.5.0-325.5.0-425.5.0-526.10.0-126.4.0-126.4.0-226.4.0-326.4.0-426.4.0-526.4.0-6 |
None known |
twistedDebian:13 |
All versions, plus listed versions 24.11.0-125.5.0-125.5.0-225.5.0-325.5.0-4 Show 8 moreShow less25.5.0-526.10.0-126.4.0-126.4.0-226.4.0-326.4.0-426.4.0-526.4.0-6 |
None known |
twistedDebian:14 |
before 26.10.0-1, plus listed versions 24.11.0-125.5.0-125.5.0-225.5.0-325.5.0-4 Show 7 moreShow less25.5.0-526.4.0-126.4.0-226.4.0-326.4.0-426.4.0-526.4.0-6 |
26.10.0-1 |
twistedPyPI |
before 26.10.0rc1, plus listed versions 1.0.11.0.31.0.41.0.51.0.6 Show 45 moreShow less1.0.71.1.01.1.11.2.010.0.010.1.010.2.011.0.011.1.012.0.012.1.012.2.012.3.013.0.013.1.013.2.014.0.014.0.114.0.215.0.015.1.015.2.015.2.115.3.015.4.015.5.016.0.016.1.016.1.116.2.016.3.016.3.116.3.216.4.016.4.116.5.016.5.0rc116.5.0rc216.6.016.6.0rc116.7.0rc116.7.0rc217.1.017.1.0rc117.5.0 |
26.10.0rc1 |
twistedUbuntu:Pro:14.04:LTS |
All versions, plus listed versions 13.0.0-1ubuntu113.2.0-1ubuntu113.2.0-1ubuntu1.213.2.0-1ubuntu1.2+esm113.2.0-1ubuntu1.2+esm213.2.0-1ubuntu1.2+esm3 |
None known |
twistedUbuntu:Pro:16.04:LTS |
All versions, plus listed versions 15.2.1-1ubuntu215.5.0-115.5.0-215.5.0-2ubuntu115.5.0-4 Show 9 moreShow less16.0.0~pre1-116.0.0~pre1-1ubuntu116.0.0~pre1-2ubuntu116.0.0~pre1-316.0.0-116.0.0-1ubuntu0.216.0.0-1ubuntu0.416.0.0-1ubuntu0.4+esm116.0.0-1ubuntu0.4+esm2 |
None known |
twistedUbuntu:Pro:18.04:LTS |
All versions, plus listed versions 16.6.0-2ubuntu317.9.0-117.9.0-217.9.0-2ubuntu0.117.9.0-2ubuntu0.317.9.0-2ubuntu0.3+esm117.9.0-2ubuntu0.3+esm2 |
None known |
Show 6 moreShow less
| Package | Affected | Fixed |
|---|---|---|
twistedUbuntu:20.04:LTS |
All versions, plus listed versions 18.9.0-3ubuntu118.9.0-518.9.0-618.9.0-6build118.9.0-6ubuntu1 Show 7 moreShow less18.9.0-818.9.0-1118.9.0-11ubuntu0.20.04.118.9.0-11ubuntu0.20.04.218.9.0-11ubuntu0.20.04.318.9.0-11ubuntu0.20.04.418.9.0-11ubuntu0.20.04.5 |
None known |
twistedUbuntu:22.04:LTS |
All versions, plus listed versions 20.3.0-7ubuntu120.3.0-7ubuntu322.1.0-2ubuntu222.1.0-2ubuntu2.122.1.0-2ubuntu2.3 Show 5 moreShow less22.1.0-2ubuntu2.422.1.0-2ubuntu2.522.1.0-2ubuntu2.622.1.0-2ubuntu2.722.1.0-2ubuntu2.8 |
None known |
twistedUbuntu:24.04:LTS |
All versions, plus listed versions 22.4.0-422.4.0-4ubuntu123.10.0-224.3.0-124.3.0-1ubuntu0.124.3.0-1ubuntu0.224.3.0-1ubuntu0.3 |
None known |
twistedUbuntu:26.10 |
All versions, plus listed versions 25.5.0-526.4.0-426.4.0-4ubuntu0.1 |
None known |
twistedUbuntu:26.04:LTS |
All versions, plus listed versions 24.11.0-125.5.0-425.5.0-525.5.0-5ubuntu0.125.5.0-5ubuntu0.2 |
None known |
python-TwistedopenSUSE:Tumbleweed From an advisory covering 4 CVEs |
before 26.10.0-1.1 | 26.10.0-1.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected | ||
| affected | OSV | |
| affected, facts | OSV | |
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-115776 is a high vulnerability (CVSS 7.5) in Twisted, published October 23, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.50%, the 43rd percentile. Fixed in twisted 26.10.0rc1.
References
github.com/twisted/twisted/security/advisories/GHSA-53xc-49m8-p798
github.com/twisted/twisted/pull/12771
github.com/twisted/twisted/commit/01f8cff7753c1edac132380b2ea939fa6bdbab30
github.com/twisted/twisted/commit/ac90fb7b0ab73688a581fcd9a7c0577ec8ca3059
github.com/twisted/twisted/releases/tag/twisted-26.10.0rc1
github.com/advisories/GHSA-53xc-49m8-p798
Show 10 moreShow less
nvd.nist.gov/vuln/detail/CVE-2026-115776
github.com/CVEProject/cvelistV5/tree/main/cves/2026/115xxx/CVE-2026-115776.json
security-tracker.debian.org/tracker/CVE-2026-115776
github.com/twisted/twisted
ubuntu.com/security/CVE-2026-115776
cve.org/CVERecord?id=CVE-2026-115776
suse.com/security/cve/CVE-2026-115776
suse.com/security/cve/CVE-2026-115778
suse.com/security/cve/CVE-2026-115877
suse.com/security/cve/CVE-2026-83813
Left out here: 61 versions. The JSON record has them.