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



GHSA-58Q2-9X27-H2JM

Death by Data URI: Solspace Freeform's Memory Meltdown

Alon Barad
Alon Barad
Software Engineer

Feb 18, 2026·5 min read·28 visits

Executive Summary (TL;DR)

Freeform <= 4.1.29 uses a version of Axios vulnerable to Uncontrolled Resource Consumption (CVE-2025-58754). Attackers can send a massive `data:` URI (e.g., 2GB of base64) which Axios attempts to load entirely into RAM, causing a fatal crash. Fix: Update to 4.1.30.

Solspace Freeform, a popular form-building plugin for Craft CMS, suffers from a Denial of Service (DoS) vulnerability due to an insecure implementation of the Axios HTTP client. By submitting a crafted 'data:' URI to an endpoint that processes external URLs, an attacker can trigger a synchronous decoding process that exhausts the Node.js heap memory, crashing the application process instantly.

The Hook: Supply Chain Sabotage

Modern web development is like building a skyscraper out of LEGO bricks you found on the sidewalk. You grab a framework (Craft CMS), slap on a plugin (Solspace Freeform), and assume the structural integrity holds. But deep inside the dependency tree of that plugin lives axios—the ubiquitous HTTP client that powers half the internet.

Here is the catch: Solspace Freeform relies on Axios to handle external integrations and URL fetching. In versions prior to 4.1.30, it pinned a version of Axios that treats data: URIs like a trusted friend rather than a hostile input. This vulnerability isn't a complex buffer overflow in C; it's a logic flaw in how JavaScript handles memory allocation for massive strings.

When a Node.js application attempts to process a string larger than its heap limit (usually around 2GB on 64-bit systems, but effectively less depending on fragmentation), the V8 engine doesn't just throw an error and move on. It panics. It throws a fatal ERR_STRING_TOO_LONG or Heap out of memory error and kills the entire process. If you are running a single-threaded Node instance, your site just went dark.

The Flaw: A synchronous suicidal tendency

The root cause lies upstream in Axios (CVE-2025-58754). Most developers think of Axios as a tool for making network requests—sending bytes over a wire. However, Axios also supports the data: scheme (RFC 2397), which allows you to embed small files directly inline.

The problem is that the vulnerable version of the Axios http adapter treats data: URIs differently than network streams. Instead of streaming the data or checking its length against a configured maxContentLength, it synchronously decodes the entire payload into a Buffer before doing anything else.

Imagine you tell a bouncer (Axios), "Only let people in if they weigh less than 200lbs." But the bouncer's logic for data: URIs was: "Let the person in, put them on a scale inside the club, and then check." If the person weighs 4,000lbs, the floor collapses before the scale is even read. By the time Axios realizes the payload is too big, the memory has already been allocated, and the Node process has already crashed.

The Code: The Smoking Gun

Let's look at the fix in Axios which Solspace pulled in. The issue was that the length check happened after the decoding. The fix introduces a predictive check using estimateDataURLDecodedBytes.

Here is the logic flow in the vulnerable versions:

// OLD (Vulnerable) Logic Concept
if (protocol === 'data:') {
  // 1. Parse the massive string immediately
  // 2. Allocate a Buffer for the whole thing
  const data = parseDataURI(config.url);
  // 3. CRASH happens here during allocation, before any length check
}

And here is the patch implemented in Axios (commit 945435fc51467303768202250debb8d4ae892593) which saves the day:

// NEW (Patched) Logic
if (protocol === 'data:') {
  if (config.maxContentLength > -1) {
    // Check the size BEFORE allocation
    const estimated = estimateDataURLDecodedBytes(dataUrl);
 
    if (estimated > config.maxContentLength) {
       // Reject gracefully
       return reject(new AxiosError(
        'maxContentLength exceeded',
        AxiosError.ERR_BAD_RESPONSE
      ));
    }
  }
}

Solspace Freeform patched this by bumping their dependency requirements in commit e7402a1d1ce9f28ecb6ce659885ac66391d3a040. If you look at the composer.lock or package.json diffs, you won't see code changes in Freeform itself—just the silent upgrade of the underlying library that was holding the knife.

The Exploit: Death by Base64

Exploiting this does not require shellcode or complex ROP chains. It requires the ability to copy and paste. The attacker needs to find any input field or API parameter in Freeform that is passed to Axios as a URL.

Once the input vector is identified (e.g., a webhook URL configuration or a form field that fetches external resources), the attacker generates a payload:

  1. Header: data:text/plain;base64,
  2. Body: A repeating sequence of characters (e.g., A) repeated enough times to exceed the server's available heap.
# Conceptual Exploit Generation
# Generate 2GB of 'A's
PAYLOAD="data:text/plain;base64,$(python3 -c "print('A' * 1024 * 1024 * 2048)")"
 
# Send to vulnerable endpoint
curl -X POST https://target-craft-site.com/actions/freeform/some-endpoint \
  -d "target_url=$PAYLOAD"

Upon receipt, the server receives the POST request (which Nginx/Apache might accept if the body limit isn't huge, but the data: URI is often processed internally). If the URI string is passed to Axios, the Event Loop halts while it tries to allocate 2GB of RAM. The process dies. If the process is managed by a supervisor (like PM2), it restarts, but a persistent attacker can simply loop the request, keeping the service permanently offline.

The Impact: Why you should care

This is a classic Denial of Service, but with high reliability. Unlike network floods that require bandwidth, this attack is asymmetrical. A single HTTP request with a long string string triggers a resource exhaustion event on the server.

For Craft CMS sites running Freeform, this usually means the PHP process (if Axios is invoked via a Node sidecar) or the Node service itself crashes. In containerized environments (Docker/Kubernetes), this OOM event will kill the pod. If the attack is sustained, it leads to CrashLoopBackOff, rendering the site accessible.

Furthermore, because this exploits the JavaScript heap limit, it bypasses many standard network-layer DDoS protections. A WAF might see a long string, but unless it is specifically configured to block data: schemes in POST bodies, it looks like just another piece of user input.

Official Patches

SolspaceFreeform 4.1.30 Release Notes
AxiosAxios Fix Commit

Fix Analysis (2)

Technical Appendix

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

Affected Systems

Solspace Freeform <= 4.1.29Craft CMS (via plugin)Node.js environments using Axios < 1.7.7

Affected Versions Detail

Product
Affected Versions
Fixed Version
Solspace Freeform
Solspace
<= 4.1.294.1.30
Axios
Axios
0.28.0 - 0.30.2, 1.0.0 - 1.12.01.12.0
AttributeDetail
CWE IDCWE-770
Attack VectorNetwork
CVSS Score7.5 (High)
ImpactDenial of Service (OOM)
Root CauseUnbounded Resource Allocation
Exploit StatusPoC Available

MITRE ATT&CK Mapping

T1499Endpoint Denial of Service
Impact
T1499.003Application or System Exploitation
Impact
CWE-770
Allocation of Resources Without Limits or Throttling

Allocation of Resources Without Limits or Throttling

Known Exploits & Detection

GitHub AdvisoryUpstream advisory detailing the data URI vector

Vulnerability Timeline

Axios fix commit authored
2025-09-10
CVE-2025-58754 and Upstream GHSA published
2025-09-12
Solspace Freeform patches (v4.1.30) and GHSA published
2026-01-15

References & Sources

  • [1]GHSA-58Q2-9X27-H2JM
  • [2]NVD CVE-2025-58754
Related Vulnerabilities
CVE-2025-58754

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

•1 day ago•GHSA-G72G-R7M4-9X4G
6.3

GHSA-G72G-R7M4-9X4G: Insufficient Session Expiration of OAuth Tokens in NocoDB

NocoDB is subject to an insufficient session expiration vulnerability where OAuth access and refresh tokens are not invalidated or revoked during security-sensitive actions such as password changes, forgot-password requests, or password resets. This allows an attacker possessing an active OAuth token to maintain unauthorized persistence.

Amit Schendel
Amit Schendel
8 views•6 min read
•2 days ago•GHSA-FGMC-2HQJ-86V4
6.9

GHSA-FGMC-2HQJ-86V4: Default Administrative Credentials in vantage6-server

A vulnerability in the vantage6 federated learning framework allows unauthenticated remote attackers to gain administrative control of the server via hardcoded default credentials (root/root) when deployed under default configurations in versions 4.2.3 and below.

Amit Schendel
Amit Schendel
8 views•5 min read
•2 days ago•GHSA-X9F6-9RVM-MMRG
6.9

GHSA-X9F6-9RVM-MMRG: Improper Access Control and Volume Mount Isolation Bypass in vantage6 Node

An improper access control vulnerability in the vantage6 node component allows concurrently running algorithm containers to read and modify sensitive input and output files of other tasks. The lack of strict workspace directory isolation exposes a significant attack surface in multi-tenant or federated environments where untrusted algorithms are executed.

Amit Schendel
Amit Schendel
3 views•4 min read
•2 days ago•CVE-2026-47760
8.7

CVE-2026-47760: Cross-Site Scripting (XSS) via SVG Namespace Sanitizer Bypass in TinyMCE

TinyMCE versions 6.8.0 through 7.0.1 contain a high-severity Cross-Site Scripting (XSS) vulnerability. The flaw exists in the custom HTML parser and sanitizer module, which incorrectly manages SVG namespace scopes when parsing nested elements. A low-privileged or unauthenticated attacker can submit a crafted HTML payload containing nested SVG structures to bypass sanitization filters, leading to arbitrary JavaScript execution in the context of the victim's browser session.

Alon Barad
Alon Barad
14 views•7 min read
•2 days ago•CVE-2026-47759
8.7

CVE-2026-47759: Stored Cross-Site Scripting (XSS) via Unsanitized data-mce-* Serialization Bypass in TinyMCE

CVE-2026-47759 is a critical stored Cross-Site Scripting (XSS) vulnerability affecting multiple active branches of the TinyMCE rich text editor. The flaw resides in the editor's handling of user-controlled, prefixed internal attributes, such as data-mce-href, data-mce-src, and data-mce-style. When processing raw HTML inputs, TinyMCE's internal validation schema neglects to inspect these custom prefixed attributes. During HTML serialization, the editor's engine extracts these unsanitized values and copies them back into standard executable attributes, overwriting any previously sanitized standard values and leading to execution of arbitrary code.

Amit Schendel
Amit Schendel
9 views•7 min read
•2 days ago•CVE-2026-47762
8.7

CVE-2026-47762: Stored Cross-Site Scripting (XSS) in TinyMCE Protect Pattern Restoration

A high-severity stored Cross-Site Scripting (XSS) vulnerability was identified in the TinyMCE rich text editor. The flaw exists in the handling of the 'protect' configuration option, where forged placeholder comments containing malicious payloads bypass the editor's sanitization routines and execute arbitrary JavaScript during serialization and content restoration.

Amit Schendel
Amit Schendel
7 views•8 min read