CVE-2026-126071: Rails Active Storage: thread exhaustion DoS via streaming

GHSA-4v2w-w6g6-f8f8MEDIUM
Published November 10, 2026
CISO Take

A flaw in Rails Active Storage lets a storage error that occurs mid-download leave the server thread blocked until the process restarts. Repeated failed downloads could exhaust the thread pool and cause a denial of service. The rating is medium (CVSS 5.3, high attack complexity, low privileges required). There is no KEV listing, no public exploit and no Nuclei template, so near-term exploitation risk is low. The blast radius is wide, though, with about 6,440 downstream dependents, and the package has 98 other CVEs. It is only loosely tied to AI, so it matters mainly for ML apps, model portals or dataset/artifact services built on Rails that serve files from S3 or GCS. Upgrade to activestorage 8.1.4.1 (or 8.0.5.2 on the 8.0 line), or apply the vendor patches. Watch for stuck threads and truncated downloads in the meantime.

Sources:NVDGitHub AdvisoryATLAS

What is the risk?

Medium. The attack needs low privileges over the network and only affects availability. Exploitation requires triggering a storage error partway through a streamed download, for example by deleting a file while it is being served, which is why complexity is high. There is no known active exploitation and no EPSS data. Exposure grows for apps on S3, S3-compatible storage or Google Cloud Storage that expose the default Active Storage routes. The proxy routes are drawn whether or not proxy mode is the default.

How does the attack unfold?

Initial Access
An attacker with low privileges requests files through the default Active Storage proxy routes backed by S3 or GCS.
AML.T0049
Exploitation
A storage error (such as a file deleted mid-download) occurs after the first chunk is written, so `head` replaces the body and the live buffer never closes.
Impact
Repeated failures block server threads until the pool is exhausted, taking down the application and any AI/ML service that depends on it.
AML.T0029

What systems are affected?

PackageEcosystemVulnerable RangePatched
Anthropic Pythonrubygems>= 8.1.0.beta1, < 8.1.4.18.1.4.1
4.1K6.4K dependentsPushed 8d ago94% patched~11d to patchFull package profile →

Do you use Anthropic Python? You're affected.

How severe is it?

CVSS 3.1
5.3 / 10
EPSS
0.4%
chance of exploitation in 30 days
Higher than 39% of all CVEs
Exploitation Status
No known exploitation
Sophistication
Moderate

What is the attack surface?

AVACPRUISCIA
AVNetwork
ACHigh
PRLow
UINone
SUnchanged
CNone
INone
AHigh

What should I do?

1 step
  1. 1) Upgrade activestorage/Rails to 8.1.4.1 (8.1 line) or 8.0.5.2 (8.0 line). 2) If you cannot upgrade right away, apply the vendor patches (commits 3c67a69 for 8.1 and 655b444 for 8.0). 3) Consider restricting or disabling the default Active Storage proxy routes if they are not needed. 4) Monitor for stuck or long-running request threads, rising worker saturation and truncated download responses. 5) Set request timeouts and an automatic worker-restart policy as a stopgap. 6) After patching, confirm storage exceptions reach error reporting, because the fix re-raises them.

How is it classified?

Which compliance frameworks are affected?

This CVE is relevant to:

ISO 42001
A.6.2.6-AI system operation and monitoring
NIST AI RMF
MANAGE 2.3-Responding to previously unknown risks and resource/availability issues

Frequently Asked Questions

What is CVE-2026-126071?

A flaw in Rails Active Storage lets a storage error that occurs mid-download leave the server thread blocked until the process restarts. Repeated failed downloads could exhaust the thread pool and cause a denial of service. The rating is medium (CVSS 5.3, high attack complexity, low privileges required). There is no KEV listing, no public exploit and no Nuclei template, so near-term exploitation risk is low. The blast radius is wide, though, with about 6,440 downstream dependents, and the package has 98 other CVEs. It is only loosely tied to AI, so it matters mainly for ML apps, model portals or dataset/artifact services built on Rails that serve files from S3 or GCS. Upgrade to activestorage 8.1.4.1 (or 8.0.5.2 on the 8.0 line), or apply the vendor patches. Watch for stuck threads and truncated downloads in the meantime.

Is CVE-2026-126071 actively exploited?

No confirmed active exploitation of CVE-2026-126071 has been reported, but organizations should still patch proactively.

How to fix CVE-2026-126071?

1) Upgrade activestorage/Rails to 8.1.4.1 (8.1 line) or 8.0.5.2 (8.0 line). 2) If you cannot upgrade right away, apply the vendor patches (commits 3c67a69 for 8.1 and 655b444 for 8.0). 3) Consider restricting or disabling the default Active Storage proxy routes if they are not needed. 4) Monitor for stuck or long-running request threads, rising worker saturation and truncated download responses. 5) Set request timeouts and an automatic worker-restart policy as a stopgap. 6) After patching, confirm storage exceptions reach error reporting, because the fix re-raises them.

What systems are affected by CVE-2026-126071?

This vulnerability affects the following AI/ML architecture patterns: Rails-based ML/data portals, model and artifact download services, MLOps web dashboards, dataset hosting on S3/GCS.

What is the CVSS score for CVE-2026-126071?

CVE-2026-126071 has a CVSS v3.1 base score of 5.3 (MEDIUM). The EPSS exploitation probability is 0.44%.

What is the AI security impact?

Affected AI Architectures

Rails-based ML/data portalsmodel and artifact download servicesMLOps web dashboardsdataset hosting on S3/GCS

MITRE ATLAS Techniques

AML.T0029Denial of AI Service

Compliance Controls Affected

ISO 42001: A.6.2.6
NIST AI RMF: MANAGE 2.3

What are the technical details?

Original Advisory

### Impact When Active Storage serves a file through its proxy controllers, `ActiveStorage::Streaming#send_blob_stream` handles an error from the storage service by calling `head` to send a 404 or 500 response. If the error occurs after the first chunk has been written, the response is already committed, and `head` replaces the response body while the server is still reading the original `ActionController::Live` buffer. That buffer is never closed, so the server thread handling the request blocks until the process restarts. Repeated failed downloads could exhaust the server's threads, possibly resulting in a DoS vulnerability. Applications are affected when they store files on a service that streams a download in several requests, such as Amazon S3, an S3-compatible service or Google Cloud Storage, and draw Active Storage's default routes. The proxy routes are drawn whether or not proxy mode is the default for the application. A file deleted while it is being served, or any other storage error partway through a download, triggers the condition. ### Details A storage error raised before the response is committed still produces a 404 or 500 response. After the fix, a storage error raised after the response is committed is re-raised instead, so the server closes the streamed response and releases the thread; the client receives a truncated body, and the exception reaches the application's error reporting. ### Releases The fixed releases are available at the normal locations. Patches for those who cannot upgrade at once: - 8.1: https://github.com/rails/rails/commit/3c67a693fb21870ecb1222e3da59d5c491a62009.patch - 8.0: https://github.com/rails/rails/commit/655b4442de136a3701334607f634d698bf9d5b82.patch ### Credit This issue was found by the Anthropic OSS Scanner (ANT-2026-FMPUMYTB).

Exploitation Scenario

An authenticated low-privilege user (or an attacker who can influence file lifecycle) repeatedly requests large files served through the proxy route from S3 or GCS. While each streamed download is in progress, the file is deleted or the storage service returns an error. After the first chunk has been written, the error handler calls `head`, the stream buffer is never closed and the server thread blocks. Repeating this exhausts the thread pool and the application, including any ML data or model portal behind it, stops responding until restart.

Weaknesses (CWE)

CWE-772 — Missing Release of Resource after Effective Lifetime: The product does not release a resource after its effective lifetime has ended, i.e., after the resource is no longer needed.

  • [Requirements] Use a language that does not allow this weakness to occur or provides constructs that make this weakness easier to avoid. For example, languages such as Java, Ruby, and Lisp perform automatic garbage collection that releases memory for objects that have been deallocated.
  • [Implementation] It is good practice to be responsible for freeing all resources you allocate and to be consistent with how and where you free resources in a function. If you allocate resources that you intend to free upon completion of the function, you must be sure to free the resources at all exit points for that function including error conditions.

Source: MITRE CWE corpus.

CVSS Vector

CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:H

Timeline

Published
November 10, 2026
Last Modified
November 13, 2026
First Seen
November 11, 2026

Related Vulnerabilities