GitHub Advisoryadvisory · PyPI

GHSA-8mpw-7fpc-4gqj NLTK: Pl196xCorpusReader has quadratic ReDoS on malformed TEI blocks

MEDIUM Published 2026-09-08 Modified 2026-09-08 Official page ↗
Aliases
CVE-2026-81725
Ecosystem
PyPI
Packages
nltk
Severity
Moderate
CVSS vector
CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
Weaknesses
CWE-1333, CWE-400
Reviewed
2026-09-08

Affected packages

• PyPI nltk: < 3.10.3 → fixed in 3.10.3

Description

Summary `Pl196xCorpusReader` still parses whole TEI blocks with multiple lazy regexes over attacker-controlled text. A malformed file with many opening tags and no matching closing tags forces repeated rescans and produces quadratic CPU growth in public reader APIs. Details • Vulnerability type: Regular-expression denial of service • Affected component: `nltk.corpus.reader.pl196x.TEICorpusView.read_block` and `Pl196xCorpusReader` public methods • Affected versions: Published `3.9.4` and current source `v3.10.0-rc2` both reproduced. • Patched versions: Not yet patched • Root cause: Lazy `.*?` whole-block regexes rescan untrusted XML-like blocks from each opening-tag position. The parser uses regexes for paragraphs, sentences, and word tags across the whole `` block. When the attacker supplies many unmatched opening tags, each attempt scans toward the end of the block and fails, then restarts from the next opening tag. There is near four-times runtime growth each time the number of malformed `` tags doubled, through normal public calls such as `words()` and `tagged_words()`. PoC Preconditions • The application parses attacker-influenced PL196X or TEI-like corpus files through public reader APIs. Steps 1. Create a corpus file with a valid header followed by a `` block that contains many opening tags and no matching closing tags. 2. Instantiate `Pl196xCorpusReader` on that corpus. 3. Call `words()` or `tagged_words()` and measure elapsed time as the malformed tag count doubles. 4. Observe near quadratic growth instead of near-linear behavior. Minimal reproducible excerpt ```text size=1000 0.014s size=2000 0.057s size=4000 0.231s size=8000 0.927s ``` Impact A consumer that accepts attacker-influenced corpus files can be forced into heavy CPU use and parser-thread stalling before the application concludes the input contains no valid content. Remediation Replace the whole-block lazy-regex parser with a linear parser or bounded tokenizer, and add regression tests that assert near-linear behavior on malformed inputs with many unmatched tags.

Related

Alias · CVE (1)

  • CVE-2026-81725 NLTK before 3.10.3 contains a regular expression denial of service vulnerability in Pl196xCorpusReader that allows attackers to cause… vulnerability

Weakness · CWE (2)

  • CWE-1333 Inefficient Regular Expression Complexity weakness
  • CWE-400 Uncontrolled Resource Consumption weakness

References