<?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>Wed, 30 Sep 2026 04:43:49 +0000</lastBuildDate>
    <item>
      <title>BREW-acronym-CVE-2026-81723 — NLTK: Quadratic CPU Exhaustion in `XMLCorpusView._read_xml_fragment()`</title>
      <link>https://vulnerability.circl.lu/vuln/brew-acronym-cve-2026-81723</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Homebrew: acronym&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;`XMLCorpusView._read_xml_fragment()` reads a corpus file in 1 KiB blocks, appending
each block to a growing `fragment` string, then calls `_VALID_XML_RE.match(fragment)`
on the full accumulated buffer every iteration. Because each iteration rescans the
entire accumulated fragment, the total amount of work grows quadratically with input
size.&lt;/p&gt;
&lt;p&gt;Commit `c9c332284` (CWE-1333) made each `match()` call linear. The quadratic behavior
is separate: the loop calls `match()` once per 1 KiB block, each time on a longer
buffer.&lt;/p&gt;
&lt;p&gt;On the test system, an 8 MiB malformed XML file consumed approximately 48 CPU-seconds
through the public `BNCCorpusReader.words()` API with no source modification. Absolute
timings vary by hardware. `_read_xml_fragment()` imposes no limit on fragment size or
iteration count.&lt;/p&gt;
&lt;p&gt;## Details&lt;/p&gt;
&lt;p&gt;**File:** `nltk/corpus/reader/xmldocs.py`  
**Function:** `XMLCorpusView._read_xml_fragment()`, lines 261–308&lt;/p&gt;
&lt;p&gt;The relevant loop:&lt;/p&gt;
&lt;p&gt;```python
fragment = &amp;#34;&amp;#34;
while True:
    fragment += stream.read(self._BLOCK_SIZE)      # grows by 1 KiB per iteration
    if self._VALID_XML_RE.match(fragment):         # rescans full buffer each time
        return fragment
    ...
    last_open_bracket = fragment.rfind(&amp;#34;&amp;lt;&amp;#34;)
    if last_open_bracket &amp;gt; 0:                      # False for single-&amp;#39;&amp;lt;&amp;#39; payload
        if self._VALID_XML_RE.match(fragment[:last_open_bracket]):
            return ...
    # loop continues
```&lt;/p&gt;
&lt;p&gt;For a payload of `b&amp;#39;&amp;lt;&amp;#39; + b&amp;#39;a&amp;#39; * (N-1)`:&lt;/p&gt;
&lt;p&gt;- For this malformed input, `…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Homebrew: acronym&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;`XMLCorpusView._read_xml_fragment()` reads a corpus file in 1 KiB blocks, appending
each block to a growing `fragment` string, then calls `_VALID_XML_RE.match(fragment)`
on the full accumulated buffer every iteration. Because each iteration rescans the
entire accumulated fragment, the total amount of work grows quadratically with input
size.&lt;/p&gt;
&lt;p&gt;Commit `c9c332284` (CWE-1333) made each `match()` call linear. The quadratic behavior
is separate: the loop calls `match()` once per 1 KiB block, each time on a longer
buffer.&lt;/p&gt;
&lt;p&gt;On the test system, an 8 MiB malformed XML file consumed approximately 48 CPU-seconds
through the public `BNCCorpusReader.words()` API with no source modification. Absolute
timings vary by hardware. `_read_xml_fragment()` imposes no limit on fragment size or
iteration count.&lt;/p&gt;
&lt;p&gt;## Details&lt;/p&gt;
&lt;p&gt;**File:** `nltk/corpus/reader/xmldocs.py`  
**Function:** `XMLCorpusView._read_xml_fragment()`, lines 261–308&lt;/p&gt;
&lt;p&gt;The relevant loop:&lt;/p&gt;
&lt;p&gt;```python
fragment = &amp;#34;&amp;#34;
while True:
    fragment += stream.read(self._BLOCK_SIZE)      # grows by 1 KiB per iteration
    if self._VALID_XML_RE.match(fragment):         # rescans full buffer each time
        return fragment
    ...
    last_open_bracket = fragment.rfind(&amp;#34;&amp;lt;&amp;#34;)
    if last_open_bracket &amp;gt; 0:                      # False for single-&amp;#39;&amp;lt;&amp;#39; payload
        if self._VALID_XML_RE.match(fragment[:last_open_bracket]):
            return ...
    # loop continues
```&lt;/p&gt;
&lt;p&gt;For a payload of `b&amp;#39;&amp;lt;&amp;#39; + b&amp;#39;a&amp;#39; * (N-1)`:&lt;/p&gt;
&lt;p&gt;- For this malformed input, `…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/brew-acronym-cve-2026-81723</guid>
    </item>
    <item>
      <title>fkie_cve-2026-81723</title>
      <link>https://vulnerability.circl.lu/vuln/fkie_cve-2026-81723</link>
      <description>&lt;p&gt;NLTK versions before 3.10.3 contain a quadratic CPU exhaustion vulnerability in XMLCorpusView._read_xml_fragment() that rescans accumulated XML fragments on every 1 KiB block read. Attackers can provide malformed XML corpus files to cause severe CPU consumption and denial of service through affected readers like BNCCorpusReader.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;NLTK versions before 3.10.3 contain a quadratic CPU exhaustion vulnerability in XMLCorpusView._read_xml_fragment() that rescans accumulated XML fragments on every 1 KiB block read. Attackers can provide malformed XML corpus files to cause severe CPU consumption and denial of service through affected readers like BNCCorpusReader.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/fkie_cve-2026-81723</guid>
    </item>
    <item>
      <title>Withdrawn: GHSA-hqv3-xm29-p9hq — Duplicate Advisory: Quadratic CPU Exhaustion in `XMLCorpusView._read_xml_fragment()`</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-hqv3-xm29-p9hq</link>
      <description>&lt;p&gt;&lt;strong&gt;Withdrawn by the publisher.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: nltk&lt;/p&gt;
&lt;p&gt;## Duplicate Advisory&lt;/p&gt;
&lt;p&gt;This advisory has been withdrawn because it is a duplicate of GHSA-vp2x-qp44-57v7. This link is maintained to preserve external references.&lt;/p&gt;
&lt;p&gt;## Original Description
NLTK versions before 3.10.3 contain a quadratic CPU exhaustion vulnerability in XMLCorpusView._read_xml_fragment() that rescans accumulated XML fragments on every 1 KiB block read. Attackers can provide malformed XML corpus files to cause severe CPU consumption and denial of service through affected readers like BNCCorpusReader.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Withdrawn by the publisher.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: nltk&lt;/p&gt;
&lt;p&gt;## Duplicate Advisory&lt;/p&gt;
&lt;p&gt;This advisory has been withdrawn because it is a duplicate of GHSA-vp2x-qp44-57v7. This link is maintained to preserve external references.&lt;/p&gt;
&lt;p&gt;## Original Description
NLTK versions before 3.10.3 contain a quadratic CPU exhaustion vulnerability in XMLCorpusView._read_xml_fragment() that rescans accumulated XML fragments on every 1 KiB block read. Attackers can provide malformed XML corpus files to cause severe CPU consumption and denial of service through affected readers like BNCCorpusReader.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-hqv3-xm29-p9hq</guid>
    </item>
    <item>
      <title>PYSEC-2026-3871 — NLTK: Quadratic CPU Exhaustion in `XMLCorpusView._read_xml_fragment()`</title>
      <link>https://vulnerability.circl.lu/vuln/pysec-2026-3871</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: nltk&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;`XMLCorpusView._read_xml_fragment()` reads a corpus file in 1 KiB blocks, appending
each block to a growing `fragment` string, then calls `_VALID_XML_RE.match(fragment)`
on the full accumulated buffer every iteration. Because each iteration rescans the
entire accumulated fragment, the total amount of work grows quadratically with input
size.&lt;/p&gt;
&lt;p&gt;Commit `c9c332284` (CWE-1333) made each `match()` call linear. The quadratic behavior
is separate: the loop calls `match()` once per 1 KiB block, each time on a longer
buffer.&lt;/p&gt;
&lt;p&gt;On the test system, an 8 MiB malformed XML file consumed approximately 48 CPU-seconds
through the public `BNCCorpusReader.words()` API with no source modification. Absolute
timings vary by hardware. `_read_xml_fragment()` imposes no limit on fragment size or
iteration count.&lt;/p&gt;
&lt;p&gt;## Details&lt;/p&gt;
&lt;p&gt;**File:** `nltk/corpus/reader/xmldocs.py`  
**Function:** `XMLCorpusView._read_xml_fragment()`, lines 261–308&lt;/p&gt;
&lt;p&gt;The relevant loop:&lt;/p&gt;
&lt;p&gt;```python
fragment = &amp;#34;&amp;#34;
while True:
    fragment += stream.read(self._BLOCK_SIZE)      # grows by 1 KiB per iteration
    if self._VALID_XML_RE.match(fragment):         # rescans full buffer each time
        return fragment
    ...
    last_open_bracket = fragment.rfind(&amp;#34;&amp;lt;&amp;#34;)
    if last_open_bracket &amp;gt; 0:                      # False for single-&amp;#39;&amp;lt;&amp;#39; payload
        if self._VALID_XML_RE.match(fragment[:last_open_bracket]):
            return ...
    # loop continues
```&lt;/p&gt;
&lt;p&gt;For a payload of `b&amp;#39;&amp;lt;&amp;#39; + b&amp;#39;a&amp;#39; * (N-1)`:&lt;/p&gt;
&lt;p&gt;- For this malformed input, `…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; PyPI: nltk&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;`XMLCorpusView._read_xml_fragment()` reads a corpus file in 1 KiB blocks, appending
each block to a growing `fragment` string, then calls `_VALID_XML_RE.match(fragment)`
on the full accumulated buffer every iteration. Because each iteration rescans the
entire accumulated fragment, the total amount of work grows quadratically with input
size.&lt;/p&gt;
&lt;p&gt;Commit `c9c332284` (CWE-1333) made each `match()` call linear. The quadratic behavior
is separate: the loop calls `match()` once per 1 KiB block, each time on a longer
buffer.&lt;/p&gt;
&lt;p&gt;On the test system, an 8 MiB malformed XML file consumed approximately 48 CPU-seconds
through the public `BNCCorpusReader.words()` API with no source modification. Absolute
timings vary by hardware. `_read_xml_fragment()` imposes no limit on fragment size or
iteration count.&lt;/p&gt;
&lt;p&gt;## Details&lt;/p&gt;
&lt;p&gt;**File:** `nltk/corpus/reader/xmldocs.py`  
**Function:** `XMLCorpusView._read_xml_fragment()`, lines 261–308&lt;/p&gt;
&lt;p&gt;The relevant loop:&lt;/p&gt;
&lt;p&gt;```python
fragment = &amp;#34;&amp;#34;
while True:
    fragment += stream.read(self._BLOCK_SIZE)      # grows by 1 KiB per iteration
    if self._VALID_XML_RE.match(fragment):         # rescans full buffer each time
        return fragment
    ...
    last_open_bracket = fragment.rfind(&amp;#34;&amp;lt;&amp;#34;)
    if last_open_bracket &amp;gt; 0:                      # False for single-&amp;#39;&amp;lt;&amp;#39; payload
        if self._VALID_XML_RE.match(fragment[:last_open_bracket]):
            return ...
    # loop continues
```&lt;/p&gt;
&lt;p&gt;For a payload of `b&amp;#39;&amp;lt;&amp;#39; + b&amp;#39;a&amp;#39; * (N-1)`:&lt;/p&gt;
&lt;p&gt;- For this malformed input, `…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/pysec-2026-3871</guid>
    </item>
    <item>
      <title>UBUNTU-CVE-2026-81723</title>
      <link>https://vulnerability.circl.lu/vuln/ubuntu-cve-2026-81723</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Ubuntu:Pro:14.04:LTS: nltk, Ubuntu:Pro:16.04:LTS: nltk, Ubuntu:Pro:18.04:LTS: nltk, Ubuntu:Pro:20.04:LTS: nltk, Ubuntu:Pro:22.04:LTS: nltk, Ubuntu:Pro:24.04:LTS: nltk, Ubuntu:Pro:26.04:LTS: nltk&lt;/p&gt;
&lt;p&gt;NLTK versions before 3.10.3 contain a quadratic CPU exhaustion vulnerability in XMLCorpusView._read_xml_fragment() that rescans accumulated XML fragments on every 1 KiB block read. Attackers can provide malformed XML corpus files to cause severe CPU consumption and denial of service through affected readers like BNCCorpusReader.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Ubuntu:Pro:14.04:LTS: nltk, Ubuntu:Pro:16.04:LTS: nltk, Ubuntu:Pro:18.04:LTS: nltk, Ubuntu:Pro:20.04:LTS: nltk, Ubuntu:Pro:22.04:LTS: nltk, Ubuntu:Pro:24.04:LTS: nltk, Ubuntu:Pro:26.04:LTS: nltk&lt;/p&gt;
&lt;p&gt;NLTK versions before 3.10.3 contain a quadratic CPU exhaustion vulnerability in XMLCorpusView._read_xml_fragment() that rescans accumulated XML fragments on every 1 KiB block read. Attackers can provide malformed XML corpus files to cause severe CPU consumption and denial of service through affected readers like BNCCorpusReader.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ubuntu-cve-2026-81723</guid>
    </item>
  </channel>
</rss>
