GHSA-4v2w-w6g6-f8f8: Active Storage: Possible DoS vulnerability in Active Storage proxy mode via storage errors during streaming

Published Nov 10, 2026
·
Updated

Impact When Active Storage serves a file through its proxy controllers, ActiveStorage::Streaming#sendblobstream 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).

Affected Software

2 affected componentsFixes available
rubygems/activestorage>=8.0.0.beta1<8.0.5.2
8.0.5.2
rubygems/activestorage>=8.1.0.beta1<8.1.4.1
8.1.4.1

Remediation

Recommended actions to resolve this vulnerability, in priority order.

  1. Upgrade

    Upgrade rubygems/activestorage to a version that resolves this vulnerability.

    Fixed in 8.0.5.2
  2. Upgrade

    Upgrade rubygems/activestorage to a version that resolves this vulnerability.

    Fixed in 8.1.4.1
  3. Upgrade

    Upgrade rails/rails to a version that resolves this vulnerability.

    Fixed in 8.0
  4. Upgrade

    Upgrade rails/rails to a version that resolves this vulnerability.

    Fixed in 8.1

Event History

Nov 10, 2026
Advisory Published
via GitHub·09:24 PM
Data Sourced
via GitHub·09:24 PM
DescriptionSeverityWeaknessAffected Software

Frequently Asked Questions

1

Which applications are exposed to this issue?

Applications are affected when they use Active Storage with a service that streams downloads in multiple requests, such as Amazon S3, an S3-compatible service, or Google Cloud Storage, and have Active Storage's default routes drawn. The proxy routes are drawn whether or not proxy mode is the application's default.

2

What conditions trigger the server thread blockage?

A storage error must occur after the first chunk of a proxied download has been written and the response has been committed. One example is a file being deleted while it is served; other storage errors partway through a download can also trigger it.

3

What is the operational impact of repeated triggering?

The request-handling thread blocks until the process restarts because the original ActionController::Live buffer is not closed. Repeated failed downloads can exhaust available server threads and result in denial of service.

4

Do storage errors always cause a blocked thread?

No. A storage error raised before the response is committed produces a 404 or 500 response; the blocking condition occurs only when the error happens after the first chunk has been written.

Contact

SecAlerts Pty Ltd.
132 Wickham Terrace
Fortitude Valley,
QLD 4006, Australia
info@secalerts.co
By using SecAlerts services, you agree to our services end-user license agreement. This website is safeguarded by reCAPTCHA and governed by the Google Privacy Policy and Terms of Service. All names, logos, and brands of products are owned by their respective owners, and any usage of these names, logos, and brands for identification purposes only does not imply endorsement. If you possess any content that requires removal, please get in touch with us.
© 2026 SecAlerts Pty Ltd.
ABN: 70 645 966 203, ACN: 645 966 203