Every CVE Search/ Get API key

CVE-2026-115774

Twisted: Denial of Service in the Twisted IMAP4 Server via a Negative Literal Size in SEARCH

4.9 MediumFix available

Twisted is an event-based framework for internet applications, supporting Python 3.6+. Prior to 26.10.0rc1, twisted.mail.imap4.IMAP4Server reaches twisted.mail.imap4.parseNestedParens with a negative literal size in an authenticated SEARCH command after the client enters the selected mailbox state. The negative size moves the parser cursor below zero, and Python's negative indexing prevents the synchronous scanning loop from terminating. The loop freezes the single-threaded reactor, stopping other IMAP connections and any SMTP or POP3 services hosted in the same process until restart. This issue is fixed in version 26.10.0rc1.

Attack profile

How easy it is to exploit

Attack vector
Network
Complexity
Low
Privileges needed
High
User interaction
None

What an attacker can affect

Confidentiality
None
Integrity
None
Availability
High

Exploit likelihood

0.52%Down 0.1 points since Oct 24, 2026
90%50%10%1%

What each source reports

CVE List Score used 4.9

Twisted: Denial of Service in the Twisted IMAP4 Server via a Negative Literal Size in SEARCH

Twisted is an event-based framework for internet applications, supporting Python 3.6+. Prior to 26.10.0rc1, twisted.mail.imap4.IMAP4Server reaches twisted.mail.imap4.parseNestedParens with a negative literal size in an authenticated SEARCH command after the client enters the selected mailbox state. The negative size moves the parser cursor below zero, and Python's negative indexing prevents the synchronous scanning loop from terminating. The loop freezes the single-threaded reactor, stopping other IMAP connections and any SMTP or POP3 services hosted in the same process until restart. This issue is fixed in version 26.10.0rc1.

Record
CVE-2026-115774
CVSS 3.1
4.9 MediumCVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-400, CWE-835
Updated
2026-11-02
EUVDEUVD-2026-109148 4.9

Twisted is an event-based framework for internet applications, supporting Python 3.6+. Prior to 26.10.0rc1, twisted.mail.imap4.IMAP4Server reaches twisted.mail.imap4.parseNestedParens with a negative literal size in an authenticated SEARCH command after the client enters the selected mailbox state. The negative size moves the parser cursor below zero, and Python's negative indexing prevents the synchronous scanning loop from terminating. The loop freezes the single-threaded reactor, stopping other IMAP connections and any SMTP or POP3 services hosted in the same process until restart. This issue is fixed in version 26.10.0rc1.

Record
EUVD-2026-109148
CVSS 3.1
4.9 MediumCVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:N/I:N/A:H
Updated
2026-11-02
GitHub AdvisoriesGHSA-2qrf-pqgx-qh9v 4.9

Twisted: Denial of Service in the Twisted IMAP4 Server via a Negative Literal Size in SEARCH

Summary

An infinite-loop vulnerability (CWE-835) in the Twisted IMAP4 server lets an authenticated client freeze the whole process with one small command. twisted.mail.imap4.parseNestedParens reads an IMAP literal size with int() and never rejects a negative value. A negative size such as {-100} drives the parser cursor negative, and because a negative Python index wraps around the end of the string instead of raising, the scanning loop never terminates. It runs synchronously on the single-threaded reactor, so one SEARCH command holds the reactor at full CPU forever and every other connection stops being served.

Details

Meeting an inline literal, parseNestedParens reads the size between the braces and advances the cursor past the body:

# twisted/mail/imap4.py  parseNestedParens
literalSize = int(s[i + 1 : end])          # no sign check
contentStack[-1].append((s[end + 3 : end + 3 + literalSize],))
i = end + 3 + literalSize                    # negative size -> i goes negative

int(b"-100") is -100, so i goes negative; the loop condition i < len(s) stays true and s[i : i + 1] on a negative index never raises, so the cursor cycles forever. The _literalStringLimit guard only covers the synchronizing-literal continuation path, not this inline branch. The call is reached from select_SEARCH through arg_searchkeys, dispatched only in the selected state, so a valid login and a selected mailbox (any low-privilege account) suffice. It runs in the reactor thread, and the connection timeout cannot fire because the reactor itself is frozen.

Affected product: Twisted (twisted.mail), the IMAP4 server twisted.mail.imap4.IMAP4Server Affected versions: 26.4.0 and earlier

PoC

Log in, select a mailbox, and send a SEARCH whose literal size is negative:

C: t1 LOGIN testuser password-test
C: t2 SELECT INBOX
C: t3 SEARCH {-100}zzzzzzzzzz

The server never responds and one core stays at 100 percent. In a measured run a health service co-hosted on the same reactor stopped answering the instant the command arrived, showing the freeze hits the whole process and not just the attacking connection. A valid {5}zzzzz completes normally and a non-numeric {abc} is rejected with a parse error, which isolates the cause to the missing negative-size check.

Impact

A remote denial of service. One command of about ten bytes freezes the single-threaded reactor, so it stops serving not only every other IMAP connection but every other service co-hosted in the same process (for example SMTP and POP3 under twistd mail), and no timeout can recover it until the process is restarted. It requires an authenticated session, so any account holder can trigger it; there is no confidentiality or integrity impact and no code execution.

Record
GHSA-2qrf-pqgx-qh9v
CVSS 3.1
4.9 MediumCVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-400, CWE-835
Updated
2026-11-02
NVD 4.9

Twisted is an event-based framework for internet applications, supporting Python 3.6+. Prior to 26.10.0rc1, twisted.mail.imap4.IMAP4Server reaches twisted.mail.imap4.parseNestedParens with a negative literal size in an authenticated SEARCH command after the client enters the selected mailbox state. The negative size moves the parser cursor below zero, and Python's negative indexing prevents the synchronous scanning loop from terminating. The loop freezes the single-threaded reactor, stopping other IMAP connections and any SMTP or POP3 services hosted in the same process until restart. This issue is fixed in version 26.10.0rc1.

Record
CVE-2026-115774
CVSS 3.1
4.9 MediumCVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-400, CWE-835
Updated
2026-11-02
OSV 4.9

Twisted: Denial of Service in the Twisted IMAP4 Server via a Negative Literal Size in SEARCH

Twisted is an event-based framework for internet applications, supporting Python 3.6+. Prior to 26.10.0rc1, twisted.mail.imap4.IMAP4Server reaches twisted.mail.imap4.parseNestedParens with a negative literal size in an authenticated SEARCH command after the client enters the selected mailbox state. The negative size moves the parser cursor below zero, and Python's negative indexing prevents the synchronous scanning loop from terminating. The loop freezes the single-threaded reactor, stopping other IMAP connections and any SMTP or POP3 services hosted in the same process until restart. This issue is fixed in version 26.10.0rc1.

Record
CVE-2026-115774
CVSS 3.1
4.9 MediumCVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-400, CWE-835
Updated
2026-11-02
OSVDEBIAN-CVE-2026-115774 4.9

Twisted is an event-based framework for internet applications, supporting Python 3.6+. Prior to 26.10.0rc1, twisted.mail.imap4.IMAP4Server reaches twisted.mail.imap4.parseNestedParens with a negative literal size in an authenticated SEARCH command after the client enters the selected mailbox state. The negative size moves the parser cursor below zero, and Python's negative indexing prevents the synchronous scanning loop from terminating. The loop freezes the single-threaded reactor, stopping other IMAP connections and any SMTP or POP3 services hosted in the same process until restart. This issue is fixed in version 26.10.0rc1.

Record
DEBIAN-CVE-2026-115774
CVSS 3.1
4.9 MediumCVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:N/I:N/A:H
Updated
2026-11-02
OSVGHSA-2qrf-pqgx-qh9v 4.9

Twisted: Denial of Service in the Twisted IMAP4 Server via a Negative Literal Size in SEARCH

Summary

An infinite-loop vulnerability (CWE-835) in the Twisted IMAP4 server lets an authenticated client freeze the whole process with one small command. twisted.mail.imap4.parseNestedParens reads an IMAP literal size with int() and never rejects a negative value. A negative size such as {-100} drives the parser cursor negative, and because a negative Python index wraps around the end of the string instead of raising, the scanning loop never terminates. It runs synchronously on the single-threaded reactor, so one SEARCH command holds the reactor at full CPU forever and every other connection stops being served.

Details

Meeting an inline literal, parseNestedParens reads the size between the braces and advances the cursor past the body:

# twisted/mail/imap4.py  parseNestedParens
literalSize = int(s[i + 1 : end])          # no sign check
contentStack[-1].append((s[end + 3 : end + 3 + literalSize],))
i = end + 3 + literalSize                    # negative size -> i goes negative

int(b"-100") is -100, so i goes negative; the loop condition i < len(s) stays true and s[i : i + 1] on a negative index never raises, so the cursor cycles forever. The _literalStringLimit guard only covers the synchronizing-literal continuation path, not this inline branch. The call is reached from select_SEARCH through arg_searchkeys, dispatched only in the selected state, so a valid login and a selected mailbox (any low-privilege account) suffice. It runs in the reactor thread, and the connection timeout cannot fire because the reactor itself is frozen.

Affected product: Twisted (twisted.mail), the IMAP4 server twisted.mail.imap4.IMAP4Server Affected versions: 26.4.0 and earlier

PoC

Log in, select a mailbox, and send a SEARCH whose literal size is negative:

C: t1 LOGIN testuser password-test
C: t2 SELECT INBOX
C: t3 SEARCH {-100}zzzzzzzzzz

The server never responds and one core stays at 100 percent. In a measured run a health service co-hosted on the same reactor stopped answering the instant the command arrived, showing the freeze hits the whole process and not just the attacking connection. A valid {5}zzzzz completes normally and a non-numeric {abc} is rejected with a parse error, which isolates the cause to the missing negative-size check.

Impact

A remote denial of service. One command of about ten bytes freezes the single-threaded reactor, so it stops serving not only every other IMAP connection but every other service co-hosted in the same process (for example SMTP and POP3 under twistd mail), and no timeout can recover it until the process is restarted. It requires an authenticated session, so any account holder can trigger it; there is no confidentiality or integrity impact and no code execution.

Record
GHSA-2qrf-pqgx-qh9v
CVSS 3.1
4.9 MediumCVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:N/I:N/A:H
Weakness
CWE-400, CWE-835
Updated
2026-11-02
OSVUBUNTU-CVE-2026-115774 4.9

Twisted is an event-based framework for internet applications, supporting Python 3.6+. Prior to 26.10.0rc1, twisted.mail.imap4.IMAP4Server reaches twisted.mail.imap4.parseNestedParens with a negative literal size in an authenticated SEARCH command after the client enters the selected mailbox state. The negative size moves the parser cursor below zero, and Python's negative indexing prevents the synchronous scanning loop from terminating. The loop freezes the single-threaded reactor, stopping other IMAP connections and any SMTP or POP3 services hosted in the same process until restart. This issue is fixed in version 26.10.0rc1.

Record
UBUNTU-CVE-2026-115774
CVSS 3.1
4.9 MediumCVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:N/I:N/A:H
Updated
2026-11-05
OSVAZL-111416 No score

CVE-2026-115774 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.mail.imap4.IMAP4Server reaches twisted.mail.imap4.parseNestedParens with a negative literal size in an authenticated SEARCH command after the client enters the selected mailbox state. The negative size moves the parser cursor below zero, and Python's negative indexing prevents the synchronous scanning loop from terminating. The loop freezes the single-threaded reactor, stopping other IMAP connections and any SMTP or POP3 services hosted in the same process until restart. This issue is fixed in version 26.10.0rc1.

Record
AZL-111416
Updated
2026-11-05

Affected products

Affected packages

Affected packages
PackageAffectedFixed
twisted
PyPI
through 26.4.0
26.10.0rc1
python-twisted
Azure Linux:3
through 22.10.0-7 None known
twisted
Debian: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 less
24.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
twisted
Debian: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 less
25.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
twisted
Debian: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 less
25.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
twisted
PyPI
before 26.10.0rc1, plus listed versions
1.0.11.0.31.0.41.0.51.0.6
Show 45 moreShow less
1.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
twisted
Ubuntu: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
twisted
Ubuntu: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 less
16.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
twisted
Ubuntu: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
twisted
Ubuntu: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 less
18.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
Show 4 moreShow less
Affected packages
PackageAffectedFixed
twisted
Ubuntu: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 less
22.1.0-2ubuntu2.422.1.0-2ubuntu2.522.1.0-2ubuntu2.622.1.0-2ubuntu2.722.1.0-2ubuntu2.8
None known
twisted
Ubuntu: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
twisted
Ubuntu:26.10
All versions, plus listed versions
25.5.0-526.4.0-426.4.0-4ubuntu0.1
None known
twisted
Ubuntu: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

History

History
RecordedChangedSources
affectedOSV
affected, factsOSV
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2026-115774 is a medium vulnerability (CVSS 4.9) 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.52%, the 44th percentile. Fixed in twisted 26.10.0rc1.

References

Show 5 moreShow less
This page doesn't list everything

Left out here: 61 versions. The JSON record has them.

MoveEnter Open