CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-126295

CVE-2026-126295: Path Traversal and Unconfined File Access in NLTK BllipParser

Amit Schendel
Amit Schendel
Senior Security Researcher

Nov 14, 2026·11 min read·1 visit

Executive Summary (TL;DR)

NLTK versions 3.10.0 through 3.10.3 fail to validate model paths in BllipParser against the nltk.pathsec security subsystem. Passing untrusted paths to BllipParser or BllipParser.from_unified_model_dir() allows arbitrary file reads, error-based information disclosure, and denial of service via the native bllipparser C extension. Upgrade to NLTK 3.10.4 to resolve this issue.

CVE-2026-126295 (also tracked as GHSA-fg9w-wfp5-j933) is a path confinement bypass vulnerability in the Natural Language Toolkit (NLTK) affecting versions 3.10.0 prior to 3.10.4. The flaw resides in nltk/parse/bllip.py within the BllipParser class and its factory method BllipParser.from_unified_model_dir(). Unlike sibling tool wrappers in NLTK that enforce data-root confinement via the nltk.pathsec module, BllipParser passes caller-supplied filesystem paths directly into the third-party bllipparser native C extension without validation. When an application passes untrusted input as model paths or directories to BllipParser, an attacker can force the native extension to open arbitrary files on the local filesystem. This leads to information disclosure through parser diagnostic oracles, local model tampering via shared directories, and denial of service by hanging worker threads on blocking special files (such as FIFOs or device nodes) or exhausting memory via oversized files.

Vulnerability Overview

The Natural Language Toolkit (NLTK) provides Python interfaces to various natural language processing models and external native libraries. Starting in NLTK 3.10.0, the library introduced a centralized path security subsystem (nltk.pathsec) designed to confine all file-backed resources and external tool models within configured NLTK data directories (nltk_data). This security boundary prevents applications that pass dynamically resolved or user-influenced model identifiers to NLTK wrappers from accessing arbitrary files on the host operating system.

CVE-2026-126295 (GHSA-fg9w-wfp5-j933) stems from an incomplete implementation of this path confinement architecture in nltk/parse/bllip.py. The BllipParser class serves as NLTK's wrapper around the Charniak-Johnson reranking syntactic parser, implemented via the bllipparser native C/C++ extension (RerankingParser). During the security hardening introduced in version 3.10.0, sibling wrappers such as CRFTagger, HunposTagger, StanfordTagger, and MaltParser were updated to validate all model paths using nltk.pathsec functions before invoking native code or external binaries. However, nltk/parse/bllip.py was omitted from this refactoring.

Because BllipParser performs no path validation, any filesystem path passed to the BllipParser.__init__() constructor (parser_model, reranker_features, reranker_weights) or the BllipParser.from_unified_model_dir() class method (model_dir) is forwarded directly to the underlying C extension. The native extension subsequently executes OS-level open() and read() system calls on the unvalidated paths without confinement checks, ownership verification, file type restrictions, or size limits.

This vulnerability is classified primarily under CWE-22 (Improper Limitation of a Pathname to a Restricted Directory), alongside CWE-73 (External Control of File Name or Path) and CWE-400 (Uncontrolled Resource Consumption). In applications where caller-influenced arguments reach BllipParser, an attacker can bypass nltk_data confinement to read arbitrary files, leak file contents or existence metadata via parser error diagnostics, hang application processes by targeting blocking special files (such as named pipes or device nodes), or trigger out-of-memory conditions by loading oversized files.

Root Cause Analysis

To understand the root cause of CVE-2026-126295, it is necessary to examine how NLTK enforces path security across native extensions. Standard Python file operations inside NLTK can be intercepted or wrapped using nltk.pathsec.open(). However, third-party C extensions and external command-line binaries accept file path strings and perform their own file descriptor operations directly through operating system syscalls. To secure these interfaces, nltk.pathsec exposes validate_tool_path() and validate_tool_dir().

These validation helpers enforce several critical security invariants before returning a canonicalized string path to be passed to native code:

  • Data-Root Confinement: The target path must resolve within one of the trusted nltk.data.path root directories, rejecting path traversal sequences (..), absolute paths outside the roots, URLs, and command-line option patterns.
  • Ownership and Permission Verification (require_private=True): The target file or directory must not reside in world-writable or shared locations (such as /tmp) where another local user could plant or replace a model file.
  • File Type Enforcement: For file loaders, validate_tool_path() verifies that the target is a regular, single-linked file (utilizing O_NOFOLLOW semantics), explicitly rejecting symbolic links, directories, sockets, device nodes, and named pipes (FIFOs).
  • Resource Bounding (max_bytes=MAX_TOOL_MODEL_BYTES): The file size is checked against a strict upper bound prior to loading, preventing native buffers from allocating excessive memory.

In NLTK versions 3.10.0 through 3.10.3, nltk/parse/bllip.py failed to import any symbols from nltk.pathsec. In BllipParser.__init__(), the parameters parser_model, reranker_features, and reranker_weights were passed directly into self.rrp.load_parser_model() and self.rrp.load_reranker_model(). Similarly, in BllipParser.from_unified_model_dir(), the model_dir parameter was passed directly into bllipparser.Model.get_unified_model_parameters(model_dir), a third-party helper that constructs sub-paths under model_dir without checking NLTK data roots, and then passes those sub-paths into BllipParser.__init__().

Furthermore, passing unvalidated os.PathLike objects directly to multiple downstream consumers introduces a Time-of-Check to Time-of-Use (TOCTOU) risk at the Python object layer. If a custom PathLike object implements a stateful __fspath__() method that returns a benign path on its first invocation and a malicious path on subsequent invocations, validating the object without capturing and passing the resulting canonical str allows the object to swap the underlying path when the C extension later resolves it.

Code Analysis

A structural comparison between nltk/parse/bllip.py and other native wrappers in NLTK prior to version 3.10.4 highlights the omission. While nltk/tag/crf.py, nltk/tag/hunpos.py, nltk/tag/stanford.py, and nltk/parse/malt.py all invoked validate_tool_path(), nltk/parse/bllip.py contained no references to nltk.pathsec.

In the vulnerable versions (3.10.0 through 3.10.3), BllipParser.__init__() and from_unified_model_dir() were implemented as follows:

# Vulnerable implementation in nltk/parse/bllip.py (NLTK 3.10.0 - 3.10.3)
from nltk.parse.api import ParserI
from nltk.termsec import safe_print
from nltk.tree import Tree
 
class BllipParser(ParserI):
    def __init__(
        self,
        parser_model=None,
        reranker_features=None,
        reranker_weights=None,
        parser_options=None,
        reranker_options=None,
    ):
        _ensure_bllip_import_or_error()
 
        parser_options = parser_options or {}
        reranker_options = reranker_options or {}
 
        # VULNERABILITY: Paths are passed directly to the native C extension
        # without confinement, file type, ownership, or size validation.
        self.rrp = RerankingParser()
        self.rrp.load_parser_model(parser_model, **parser_options)
        if reranker_features and reranker_weights:
            self.rrp.load_reranker_model(
                features_filename=reranker_features,
                weights_filename=reranker_weights,
                **reranker_options,
            )
 
    @classmethod
    def from_unified_model_dir(
        cls,
        model_dir,
        parser_options=None,
        reranker_options=None,
        parsing_options=None,
    ):
        _ensure_bllip_import_or_error()
        # VULNERABILITY: model_dir is not validated before deriving sub-paths.
        (
            parser_model_dir,
            reranker_features_filename,
            reranker_weights_filename,
        ) = get_unified_model_parameters(model_dir)
        return cls(
            parser_model_dir,
            reranker_features_filename,
            reranker_weights_filename,
            parser_options,
            reranker_options,
        )

In commit fdde6d9ebf5fd612e817b49ec7fecd752802c268, the maintainers resolved the vulnerability by importing MAX_TOOL_MODEL_BYTES, validate_tool_dir, and validate_tool_path from nltk.pathsec and applying strict validation to all path arguments before they reach the C extension:

# Patched implementation in nltk/parse/bllip.py (NLTK 3.10.4)
from nltk.parse.api import ParserI
from nltk.pathsec import (
    MAX_TOOL_MODEL_BYTES,
    validate_tool_dir,
    validate_tool_path,
)
from nltk.termsec import safe_print
from nltk.tree import Tree
 
# Inside BllipParser.__init__():
        if parser_model is not None:
            # parser_model designates a directory containing model files.
            # validate_tool_dir enforces data-root confinement and require_private=True
            # prevents local attackers from planting models in shared directories.
            parser_model = validate_tool_dir(
                parser_model,
                context="BllipParser parser model",
                require_private=True,
            )
        if reranker_features and reranker_weights:
            # Reranker features and weights are individual files read into memory.
            # validate_tool_path enforces confinement, regular file status, ownership,
            # and bounds file size to MAX_TOOL_MODEL_BYTES.
            reranker_features = validate_tool_path(
                reranker_features,
                context="BllipParser reranker features",
                max_bytes=MAX_TOOL_MODEL_BYTES,
                require_private=True,
            )
            reranker_weights = validate_tool_path(
                reranker_weights,
                context="BllipParser reranker weights",
                max_bytes=MAX_TOOL_MODEL_BYTES,
                require_private=True,
            )
 
        self.rrp = RerankingParser()
        # The C extension is invoked using the validated string variables returned
        # by pathsec, preventing stateful PathLike __fspath__ swapping.
        self.rrp.load_parser_model(parser_model, **parser_options)
        if reranker_features and reranker_weights:
            self.rrp.load_reranker_model(
                features_filename=reranker_features,
                weights_filename=reranker_weights,
                **reranker_options,
            )
 
# Inside BllipParser.from_unified_model_dir():
        # Validate model_dir up front before the third-party helper derives sub-paths.
        model_dir = validate_tool_dir(
            model_dir,
            context="BllipParser unified model directory",
            require_private=True,
        )
        (
            parser_model_dir,
            reranker_features_filename,
            reranker_weights_filename,
        ) = get_unified_model_parameters(model_dir)

The fix is comprehensive and addresses both direct constructor invocations and factory method calls. By validating model_dir in from_unified_model_dir() prior to calling get_unified_model_parameters(model_dir) and subsequently re-validating the derived parser_model_dir, reranker_features_filename, and reranker_weights_filename inside __init__(), the patch implements defense-in-depth. Furthermore, rebinding the parameter names (parser_model, reranker_features, reranker_weights, and model_dir) to the str values returned by the validation functions ensures that any custom PathLike object cannot alter its path representation between validation and native open() execution.

Exploitation

Exploiting CVE-2026-126295 requires two primary prerequisites: the target environment must have the optional bllipparser native extension installed (pip install bllipparser), and the target application must pass attacker-controlled or externally influenced strings as model path arguments to BllipParser() or BllipParser.from_unified_model_dir(). If bllipparser is not installed, calling these methods immediately raises an ImportError via _ensure_bllip_import_or_error() before any filesystem interaction occurs.

When these prerequisites are met, an attacker can exploit the missing boundary checks through three primary vectors:

  1. Arbitrary File Read and Diagnostic Oracle Disclosure: By supplying a path to a sensitive file or directory outside the NLTK data roots (such as /etc/passwd, application configuration files, or private keys) via parser_model, reranker_features, or reranker_weights, the attacker forces the C extension to open and parse the target file. When the target file does not conform to the expected Charniak-Johnson parser or reranker model format, the native parser throws exceptions or emits error diagnostics. If the host application returns or logs these exceptions, an attacker can differentiate between non-existent paths, unreadable paths, and valid files, or extract fragments of file contents tokenized within parser syntax error messages.

  2. Denial of Service via Blocking Special Files: Because BllipParser does not verify that the target path is a regular file prior to opening it, an attacker can point reranker_features or parser_model sub-files at blocking special files on Unix-like systems, such as an empty named pipe (FIFO) created in /tmp, /dev/random, or /dev/zero. When the C extension calls open() or read() on a blocking FIFO with no writer, the underlying OS thread blocks indefinitely inside the native C call, bypassing Python-level timeouts and hanging the application worker process.

  3. Denial of Service via Memory Exhaustion and Local Tampering: By supplying a path to an arbitrarily large file (or an infinite stream device such as /dev/urandom), the attacker bypasses the MAX_TOOL_MODEL_BYTES check, causing the native loader to allocate unbounded memory until the process terminates via an Out-Of-Memory (OOM) crash. Additionally, in multi-user local environments, the absence of require_private=True allows a local attacker to place crafted or corrupted model files in world-writable directories (such as /tmp or /var/tmp) and induce the target process to load them.

# Proof of Concept: Demonstrating Unconfined File Access and Blocking DoS
# Prerequisites: nltk >= 3.10.0, < 3.10.4 and bllipparser installed
 
import os
from nltk.parse.bllip import BllipParser
 
# Vector 1: Arbitrary file access / Error oracle outside nltk_data roots
untrusted_path = "/etc/passwd"
try:
    # In vulnerable versions, this bypasses nltk.pathsec and invokes OS open() directly
    parser = BllipParser(parser_model="/etc", reranker_features=untrusted_path, reranker_weights=untrusted_path)
except Exception as exc:
    # In a patched version (3.10.4+), nltk.pathsec raises a security exception before touching the OS.
    # In vulnerable versions (3.10.0-3.10.3), the native C extension opens the file and fails during parsing.
    print(f"Exception raised: {type(exc).__name__}: {exc}")
 
# Vector 2: Denial of Service via Named Pipe (FIFO)
fifo_path = "/tmp/blocking_model_fifo"
if not os.path.exists(fifo_path):
    os.mkfifo(fifo_path)
 
# Calling BllipParser on a FIFO with no writer hangs the native C extension indefinitely:
# BllipParser(parser_model="/tmp", reranker_features=fifo_path, reranker_weights=fifo_path)

Impact Assessment

The severity of CVE-2026-126295 is rated as High, with a CVSS v3.1 base score of 7.1 (CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:L) according to the GitHub Security Advisory, and a CVSS v4.0 base score of 7.0 (CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:L/SC:N/SI:N/SA:N) assigned by VulnCheck.

A breakdown of the CVSS vector components reflects the technical constraints and consequences of the vulnerability:

  • Attack Vector (AV:L): The attack vector is classified as Local because path traversal and local file manipulation rely on accessing the local filesystem or supplying paths in local/CLI execution contexts, though web applications that expose model selection parameters over a network interface would experience remote reachability.
  • Attack Complexity (AC:L) & Privileges Required (PR:N): Triggering the unconfined file access requires no special privileges or complex race conditions once an input path reaches BllipParser.
  • Confidentiality Impact (C:H / VC:H): High confidentiality impact reflects the ability to bypass nltk.pathsec confinement and read arbitrary files accessible to the application process permissions.
  • Integrity Impact (I:N / VI:N): The vulnerability does not grant direct file write capabilities.
  • Availability Impact (A:L / VA:L): Low availability impact accounts for worker thread hangs on special files and memory exhaustion from unbounded file reads.

From a threat intelligence perspective, CVE-2026-126295 is not listed in CISA's Known Exploited Vulnerabilities (KEV) catalog. The Exploit Prediction Scoring System (EPSS) assigns this vulnerability a score of 0.00197 (approximately 0.20% probability of exploitation within 30 days), placing it in the 9.56th percentile of all tracked CVEs. The low likelihood of widespread opportunistic exploitation is primarily due to two limiting factors: bllipparser is an optional dependency that is not installed by default with nltk, and most production NLP pipelines hardcode static model paths rather than exposing BllipParser path initialization to untrusted user input.

Remediation

The primary remediation for CVE-2026-126295 is to upgrade the nltk package to version 3.10.4 or later. Version 3.10.4 incorporates commit fdde6d9ebf5fd612e817b49ec7fecd752802c268, which enforces validate_tool_dir() and validate_tool_path() across all BllipParser initialization routines.

pip install --upgrade "nltk>=3.10.4"

After upgrading, ensure that all legitimate BLLIP parser models used by the application are stored inside configured nltk_data directories (or directories explicitly added to nltk.data.path) and are owned by a trusted user account without world-writable permissions. Because require_private=True is enforced in version 3.10.4+, attempting to load models from shared temporary directories such as /tmp will be rejected by nltk.pathsec.

> [!NOTE] > If an immediate upgrade to NLTK 3.10.4 is not feasible, development teams must implement strict application-level input validation before instantiating BllipParser.

For environments where upgrading cannot be performed immediately, apply the following defense-in-depth measures:

  1. Avoid Passing Raw Paths: Never pass user-supplied strings, HTTP request parameters, or unverified configuration values directly into BllipParser() or BllipParser.from_unified_model_dir().
  2. Use Strict Allowlists: Map user-facing model selection identifiers against a hardcoded dictionary of known, static filesystem paths pointing strictly inside dedicated model directories.
  3. Pre-Validate with nltk.pathsec: In NLTK 3.10.0 through 3.10.3, the nltk.pathsec module is already present in the library even though bllip.py does not call it. Applications can manually invoke nltk.pathsec.validate_tool_dir() and nltk.pathsec.validate_tool_path() on any model paths prior to passing the returned strings to BllipParser.

Official Patches

NLTKGitHub commit bounding BllipParser model paths to nltk.pathsec data roots
NLTKNLTK v3.10.4 Release Notes
GitHub Security AdvisoryOfficial GitHub Security Advisory GHSA-fg9w-wfp5-j933

Fix Analysis (1)

Technical Appendix

CVSS Score
7.1/ 10
CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:L
EPSS Probability
0.20%
Top 90% most exploited

Affected Systems

NLTK (Natural Language Toolkit) Python Library (PyPI: nltk)

Affected Versions Detail

Product
Affected Versions
Fixed Version
nltk
NLTK Project
>= 3.10.0, < 3.10.43.10.4
AttributeDetail
CVE / Advisory IDCVE-2026-126295 / GHSA-fg9w-wfp5-j933
Primary CWECWE-22 (Path Traversal) / CWE-73 / CWE-400
Affected Componentnltk.parse.bllip.BllipParser (NLTK >= 3.10.0, < 3.10.4)
Attack VectorLocal / Application-level untrusted path input
CVSS Score7.1 High (CVSS v3.1) / 7.0 High (CVSS v4.0)
EPSS Score0.20% (9.56th percentile)
ImpactArbitrary file read, error oracle disclosure, and Denial of Service (FIFO hang / OOM)
CISA KEV StatusNot Listed

MITRE ATT&CK Mapping

T1083File and Directory Discovery
Discovery
T1005Data from Local System
Collection
CWE-22
Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')

The software uses external input to construct a pathname that is intended to identify a file or directory that is located underneath a restricted parent directory, but the software does not properly neutralize special elements within the pathname that can cause the pathname to resolve to a location that is outside of the restricted directory.

Vulnerability Timeline

Security fix commit fdde6d9ebf5fd612e817b49ec7fecd752802c268 authored and merged into the nltk/nltk repository.
2026-10-10
CVE-2026-126295 published by CNA VulnCheck.
2026-11-13
GitHub Security Advisory GHSA-fg9w-wfp5-j933 published.
2026-11-13

References & Sources

  • [1]GitHub Security Advisory: GHSA-fg9w-wfp5-j933
  • [2]NLTK Fix Commit: Bound BllipParser model paths to the pathsec data roots
  • [3]NLTK Release v3.10.4
  • [4]VulnCheck Advisory: NLTK 3.10.0 before 3.10.4 Arbitrary File Read via BllipParser Model Paths
  • [5]CVE.org Record: CVE-2026-126295
  • [6]NVD Vulnerability Detail: CVE-2026-126295

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 1 hour ago•CVE-2026-126300
5.3

CVE-2026-126300: Algorithmic Complexity Denial of Service in NLTK TreebankWordTokenizer.span_tokenize

CVE-2026-126300 (GHSA-ffr9-mgrr-wcvr) is an inefficient algorithmic complexity vulnerability (CWE-407) in the Natural Language Toolkit (NLTK) Python library affecting versions 3.2.5 prior to 3.10.4. The flaw resides in the quote-restoration routine of TreebankWordTokenizer.span_tokenize and NLTKWordTokenizer.span_tokenize, where repeated calls to list.pop(0) over matched quote tokens introduce quadratic O(n^2) time complexity. An unauthenticated remote attacker who supplies input containing long sequences of double-quote characters can exhaust CPU resources and degrade service availability.

Amit Schendel
Amit Schendel
3 views•10 min read
•about 2 hours ago•GHSA-GPWC-27CW-RH9R
5.3

CVE-2026-126301: Quadratic CPU Exhaustion in NLTK LegalitySyllableTokenizer

The Natural Language Toolkit (NLTK) versions 3.6 through 3.10.3 contain an algorithmic complexity vulnerability in the LegalitySyllableTokenizer.tokenize method. When processing tokens composed of continuous runs of vowels, an unguarded string reversal and set membership lookup loop executes in quadratic time relative to the input token length. Remote attackers capable of submitting arbitrary text to applications utilizing this tokenizer can trigger sustained single-core CPU exhaustion and application-level denial of service.

Amit Schendel
Amit Schendel
4 views•10 min read
•about 3 hours ago•CVE-2026-126304
8.7

CVE-2026-126304: Symlink Path Traversal in NLTK YCOECorpusReader

CVE-2026-126304 is a symlink path traversal vulnerability (CWE-59) in the Natural Language Toolkit (NLTK) versions 3.10.0 prior to 3.10.4. The YCOECorpusReader class constructs internal sub-readers for the 'psd' and 'pos' subdirectories using FileSystemPathPointer.join(), which relies exclusively on lexical string-prefix validation rather than canonical path resolution. An attacker who supplies a crafted YCOE corpus containing symbolic links in place of the 'psd' or 'pos' subdirectories can bypass directory confinement and read arbitrary files from sibling corpora or sensitive directories within the NLTK data sandbox.

Amit Schendel
Amit Schendel
5 views•9 min read
•about 4 hours ago•CVE-2026-128077
6.5

CVE-2026-128077: Authorization Bypass via Request Path Desynchronization in Nuxt and @nuxt/nitro-server

CVE-2026-128077 (GHSA-r99w-jh2x-3mg9) is an authorization bypass and interpretation conflict vulnerability affecting Nuxt and its underlying @nuxt/nitro-server package in versions 4.6.0 through 4.6.3. When an incoming HTTP request path begins with a double forward slash (e.g., //x/admin), the WHATWG URL parser within the Nuxt server-side page renderer interprets the initial segment as a network host/authority and resolves the remaining path (/admin) against the application's page router. Because Nitro server middleware, route-scoped serverHandlers, and Nitro routeRules evaluate the unparsed request path (//x/admin), path-based access controls, redirects, and security header policies configured for /admin fail to match and are bypassed.

Amit Schendel
Amit Schendel
5 views•10 min read
•about 5 hours ago•CVE-2026-128084
4.8

CVE-2026-128084: Integer Truncation and SQL Query Truncation in sqlite3-ruby

Prior to version 2.10.2, the sqlite3-ruby gem explicitly cast 64-bit Ruby string lengths (long) to 32-bit signed integers (int) when invoking the underlying SQLite C API. On 64-bit platforms, providing a string of 4 GiB (2^32 bytes) or larger causes integer truncation, instructing SQLite to process only a prefix of the string. This flaw affects SQL query preparation, bound parameter values, and return values from custom Ruby-defined SQL functions and aggregates, allowing trailing SQL clauses such as WHERE restrictions to be silently dropped under specific conditions.

Alon Barad
Alon Barad
5 views•11 min read
•about 6 hours ago•CVE-2026-128068
5.3

CVE-2026-128068: Regular Expression Denial of Service in rails-html-sanitizer

CVE-2026-128068 (GHSA-cpgf-5mjf-73p7) is a Regular Expression Denial of Service (ReDoS) vulnerability in the rails-html-sanitizer Ruby gem affecting versions 1.0.3 through 1.7.1. The flaw resides in the Rails::HTML::PermitScrubber#scrub_attribute method, which uses the multiline regular expression /^\s*[^#\s].*/m to enforce local-only URI fragment references on SVG elements. On Ruby runtimes prior to version 3.2 (CRuby <= 3.1 and JRuby), evaluating an attribute value composed of repeated newline and whitespace characters without a hash character triggers quadratic backtracking O(n^2). Applications are only vulnerable if their sanitization allowlist is explicitly configured to permit SVG reference elements such as <use> alongside href or xlink:href attributes.

Alon Barad
Alon Barad
6 views•9 min read