<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://vulnerability.circl.lu</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Thu, 08 Oct 2026 07:46:59 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-106454</title>
      <link>https://vulnerability.circl.lu/vuln/fkie_cve-2026-106454</link>
      <description>&lt;p&gt;Twisted is an event-based framework for internet applications, supporting Python 3.6+. In 25.5.0 and earlier, wildcardToRegexp() in twisted/mail/imap4.py translates the IMAP asterisk and percent wildcards but passes all other characters from an authenticated client&amp;#39;s LIST or LSUB pattern directly to re.compile(), allowing nested or otherwise expensive regular expression constructs to cause catastrophic backtracking when matched against mailbox names. Because Twisted uses a cooperative single-threaded reactor, the blocking match suspends all server input and output for the duration of the match. No fixed release is available as of this review.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Twisted is an event-based framework for internet applications, supporting Python 3.6+. In 25.5.0 and earlier, wildcardToRegexp() in twisted/mail/imap4.py translates the IMAP asterisk and percent wildcards but passes all other characters from an authenticated client&amp;#39;s LIST or LSUB pattern directly to re.compile(), allowing nested or otherwise expensive regular expression constructs to cause catastrophic backtracking when matched against mailbox names. Because Twisted uses a cooperative single-threaded reactor, the blocking match suspends all server input and output for the duration of the match. No fixed release is available as of this review.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/fkie_cve-2026-106454</guid>
    </item>
    <item>
      <title>GHSA-8pqf-f4m5-798g — Twisted: IMAP wildcardToRegexp() ReDoS</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-8pqf-f4m5-798g</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: Twisted&lt;/p&gt;
&lt;p&gt;### Summary
`wildcardToRegexp()` in `twisted/mail/imap4.py` converts IMAP LIST/LSUB wildcard patterns to Python regular expressions.  It substitutes the two IMAP wildcards (`*` → `(?:.*?)` and `%` → `(?:(?:[^\\/])*?)`) but passes every other character through unchanged to `re.compile()`.  This means that an authenticated IMAP client can send a quoted pattern string containing arbitrary regex syntax - including catastrophic-backtracking constructs such as `(a+)+z`.&lt;/p&gt;
&lt;p&gt;Because Twisted runs a cooperative, single-threaded reactor, a blocking regex match freezes **all** I/O on the server for the duration of the match.&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;## Vulnerable Code&lt;/p&gt;
&lt;p&gt;### `twisted/mail/imap4.py`&lt;/p&gt;
&lt;p&gt;```python
# line 4595
def wildcardToRegexp(wildcard, delim=None):
    wildcard = wildcard.replace(&amp;#34;*&amp;#34;, &amp;#34;(?:.*?)&amp;#34;)
    if delim is None:
        wildcard = wildcard.replace(&amp;#34;%&amp;#34;, &amp;#34;(?:.*?)&amp;#34;)
    else:
        wildcard = wildcard.replace(&amp;#34;%&amp;#34;, &amp;#34;(?:(?:[^%s])*?)&amp;#34; % re.escape(delim))
    return re.compile(wildcard, re.I)   # ← user input compiled verbatim
```&lt;/p&gt;
&lt;p&gt;```python
# line 4993
class MemoryAccountWithoutNamespaces:
    def listMailboxes(self, ref, wildcard):
        ref = self._inferiorNames(_parseMbox(ref.upper()))
        wildcard = wildcardToRegexp(wildcard, &amp;#34;/&amp;#34;)   # ← user-supplied wildcard
        return [(i, self.mailboxes[i]) for i in ref if wildcard.match(i)]
```
---&lt;/p&gt;
&lt;p&gt;### Proof of Concept&lt;/p&gt;
&lt;p&gt;```python
from twisted.mail.imap4 import wildcardToRegexp
import time&lt;/p&gt;
&lt;p&gt;rx = wildcardToRegexp(&amp;#34;(a+)+z&amp;#34;, &amp;#34;/&amp;#34;)
for n in [20,…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: Twisted&lt;/p&gt;
&lt;p&gt;### Summary
`wildcardToRegexp()` in `twisted/mail/imap4.py` converts IMAP LIST/LSUB wildcard patterns to Python regular expressions.  It substitutes the two IMAP wildcards (`*` → `(?:.*?)` and `%` → `(?:(?:[^\\/])*?)`) but passes every other character through unchanged to `re.compile()`.  This means that an authenticated IMAP client can send a quoted pattern string containing arbitrary regex syntax - including catastrophic-backtracking constructs such as `(a+)+z`.&lt;/p&gt;
&lt;p&gt;Because Twisted runs a cooperative, single-threaded reactor, a blocking regex match freezes **all** I/O on the server for the duration of the match.&lt;/p&gt;
&lt;p&gt;---&lt;/p&gt;
&lt;p&gt;## Vulnerable Code&lt;/p&gt;
&lt;p&gt;### `twisted/mail/imap4.py`&lt;/p&gt;
&lt;p&gt;```python
# line 4595
def wildcardToRegexp(wildcard, delim=None):
    wildcard = wildcard.replace(&amp;#34;*&amp;#34;, &amp;#34;(?:.*?)&amp;#34;)
    if delim is None:
        wildcard = wildcard.replace(&amp;#34;%&amp;#34;, &amp;#34;(?:.*?)&amp;#34;)
    else:
        wildcard = wildcard.replace(&amp;#34;%&amp;#34;, &amp;#34;(?:(?:[^%s])*?)&amp;#34; % re.escape(delim))
    return re.compile(wildcard, re.I)   # ← user input compiled verbatim
```&lt;/p&gt;
&lt;p&gt;```python
# line 4993
class MemoryAccountWithoutNamespaces:
    def listMailboxes(self, ref, wildcard):
        ref = self._inferiorNames(_parseMbox(ref.upper()))
        wildcard = wildcardToRegexp(wildcard, &amp;#34;/&amp;#34;)   # ← user-supplied wildcard
        return [(i, self.mailboxes[i]) for i in ref if wildcard.match(i)]
```
---&lt;/p&gt;
&lt;p&gt;### Proof of Concept&lt;/p&gt;
&lt;p&gt;```python
from twisted.mail.imap4 import wildcardToRegexp
import time&lt;/p&gt;
&lt;p&gt;rx = wildcardToRegexp(&amp;#34;(a+)+z&amp;#34;, &amp;#34;/&amp;#34;)
for n in [20,…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-8pqf-f4m5-798g</guid>
    </item>
  </channel>
</rss>
