Dennis Paagman · Paagman.dev · October 27, 2026 (updated October 28, 2026)
When I tried to update an app to Ruby 4.0.9 last Friday, the official Docker community image wasn’t available yet. The release fixed vulnerabilities GitLab had found, but I had to wait before I could deploy.
A few months ago, a government Rails site was hit by an ActiveStorage vulnerability eight hours after the patch went out. Last week, PHP2Shell was being exploited before it was announced.1 Waiting for a Docker image can eat up the time you have to respond.
When Ruby 4.0.9 became available
I took every installer and version manager listed on the official installation page on ruby-lang.org, then added container images, CI providers and hosting platforms I could think of. For each, I checked when 4.0.9 became available.2
All times start when the Ruby 4.0.9 source tarball became available, on Friday 23 October 2026, 04:04 UTC.3
Installers and version managers
| Resource | Available after |
|---|---|
| ruby-build (rbenv, and mise when compiling) | 43 m |
| ruby/ruby-builder binaries | 48 m |
| Homebrew ruby-build | 1 h 10 m |
| asdf | 2 h 43 m |
| jdx/ruby binaries (mise’s precompiled Rubies) | 8 h 15 m |
| RubyInstaller (Windows, also RVM 4 Windows) | ⚠️ 16 h 35 m |
| RVM | ⚠️ 18 h 34 m |
| rv | ⚠️ 21 h 40 m |
| ruby-install | ⚠️ 5 d 10 h 46 m4 |
| chruby | Depends on the installer used5 |
| rbenv for Windows | ❌ last updated to 4.0.1 in March |
Container images
| Resource | Available after |
|---|---|
| rubylang/ruby (by the Ruby core team) | 8 m |
| bitnami/ruby | 1 h 59 m |
| rails/devcontainer (Rails dev container images) | 9 h 34 m |
| ruby (by the Docker community) | ⚠️ 15 h 57 m |
CI
| Resource | Available after |
|---|---|
| GitHub Actions setup-ruby (Linux/macOS) | 1 h 12 m |
| CircleCI cimg/ruby | 1 h 36 m |
| GitHub Actions setup-ruby (Windows) | ⚠️ 28 h 34 m |
Hosting platforms
| Resource | Available after |
|---|---|
| Heroku | 2 h 28 m |
| DigitalOcean App Platform (uses Heroku’s buildpack) | 2 h 28 m6 |
| Railway (uses mise) | 8 h 15 m |
| Fly.io, Kamal and anything else using the official Docker community image | ⚠️ 15 h 57 m |
| Google Cloud (Cloud Run, App Engine) | ⚠️ ≈ 3 d 14 h, default still 4.0.7 |
| AWS Elastic Beanstalk | ⚠️ 4 d 4 h 07 m |
| AWS Lambda | ⚠️ 4 d 16 h 29 m |
System packages
| Resource | Available after |
|---|---|
| Snap | 7 m |
| Homebrew | 2 h 41 m |
| nixpkgs | 3 h 47 m |
| Fedora (Rawhide; 44/45 still in testing) | ⚠️ 11 h 03 m |
| winget | ⚠️ 20 h 54 m |
| Debian, Ubuntu, Alpine, Arch | ❌ no Ruby 4 at all |
What stands out
- The fastest ones are really fast, and mostly come from Ruby itself. The Snap package and the
rubylang/rubyimage are both published by the Ruby core team, and were available after 7 and 8 minutes. A bot committed the ruby-build definition 28 seconds after the tarball was uploaded, and the ruby-build release followed at 43 minutes. - The official Docker community image took almost 16 hours.7 The Dockerfile Rails generates uses this image, so it’s also what you get with Kamal and Fly.io by default.8 The Dockerfile itself was updated about seven hours after the tarball appeared. Most of the wait came after that, in the official-images review and build pipeline. That review serves a purpose, but it also adds hours to the wait for a security patch.
- Some platforms are even slower. AWS Lambda and Elastic Beanstalk are still on 4.0.7,
DigitalOcean’s docs list 4.0.1–4.0.2,and Google Cloud took about three and a half days to publish a 4.0.9 image, while its default for Ruby 4.0 is still 4.0.7. If you rely on a provider’s Ruby runtime, you depend on its update schedule. Edit: Elastic Beanstalk and Lambda got 4.0.9 after 4 days. Rectification: DigitalOcean actually supports 4.0.9, as it uses Heroku buildpacks.
How to patch faster
Your version manager, CI and production environment all need to support the new version before you can roll it out. The slowest one decides how fast you can patch.
Some things you can do before the next Ruby security release:
- Check the whole path to production. Find out how your local version manager, CI and production environment pick up new Ruby releases. Look for a manual approval, a scheduled build or another step that could hold up an update.
- Automate the boring part. Let a bot pick up new versions of your dependencies (Ruby, your gems and your base image), run CI and deploy when everything is green. The fewer manual steps, the faster you’re patched.
- Choose a hosting setup that lets you patch promptly. I’d avoid relying on a provider’s Ruby runtime if it’s still two patch versions behind. Use a custom container where supported, so you can update Ruby on your own schedule.
Most of this is volunteer work
All of this puts extra pressure on the maintainers of these tools, and most of them are volunteers. Every patch release means a chain of PRs, reviews, builds and releases across dozens of projects. The expectations keep going up.
The fastest ones show how much of that work bots can take over, so maintainers don’t have to drop everything for every release.
So a big thank you to everyone who makes this happen, often within minutes. 🙏
Updates
- 28 October 2026: Added rails/devcontainer to the container images (about 9.5 hours).
- 28 October 2026: AWS Lambda’s
ruby:4.0image was updated to 4.0.9, about 4.5 days after the release. - 28 October 2026: AWS Elastic Beanstalk updated its Ruby 4.0 platform to 4.0.9 on 27 October, about 4 days after the release.
- 28 October 2026: ruby-install’s version metadata was updated to 4.0.9, about 5.5 days after the release.
- 28 October 2026 (rectification): DigitalOcean App Platform uses Heroku’s Ruby buildpack and binaries, so it got 4.0.9 at the same time as Heroku, even though its docs only list 4.0.1–4.0.2. Thanks to @dblockdotorg for confirming.
- Amazon’s honeypots saw the first attempts four days before disclosure. ↩
- Availability was checked through October 28. Most timestamps are Git commit dates or GitHub release dates. For Docker images I used Docker Hub’s last pushed date, or the GitHub Container Registry’s creation date for rails/devcontainer; for Heroku, the S3
Last-Modifiedheader. For Homebrew it’s the bottle commit. For Google Cloud I used the upload time of theruby:4.0.9runtime image in Artifact Registry. For AWS Lambda I used the creation date of thepublic.ecr.aws/lambda/ruby:4.0.2026.10.27.20image, the first one whereruby -vreports 4.0.9. For AWS Elastic Beanstalk I used theDateCreatedof the Ruby 4.0 platform version 4.15.0. ↩ - The v4.0.9 tag was pushed at 02:36 UTC, 1 h 28 m before the tarball appeared on cache.ruby-lang.org. The announcement post followed 34 minutes after the tarball. The fixes themselves were public even earlier as regular commits in the Ruby repository, and some were already part of 4.0.8. I use the tarball upload to measure how quickly downstream tools packaged the release. ↩
- ruby-install gets its version list and checksums from postmodern/ruby-versions. This row tracks that metadata. ruby-install also supports explicit versions, custom source URLs and checksums, so you can supply the release tarball URL and its official checksum before the metadata is updated. ↩
- chruby switches between installed Rubies and doesn’t require an update for each release. Its documentation covers manual installation and using either ruby-install or ruby-build. With ruby-build, the release was available after 43 minutes; you could also compile the tarball yourself. ↩
- DigitalOcean’s docs and release notes still only list Ruby 4.0.1–4.0.2. Its pinned Heroku buildpack downloads Ruby binaries from Heroku’s S3 bucket, where 4.0.9 appeared after 2 h 28 m, and @dblockdotorg confirmed that 4.0.9 deploys. ↩
- What counts as ‘official’ is a bit confusing here.
rubyis a Docker Official Image maintained by the Docker community, whilerubylang/rubyis published by the Ruby core team itself. ↩ - Docker Hub shows ~1.59 billion pulls for
rubyand ~3.5 million forrubylang/ruby. The image that took 15 h 57 m has about 450 times as many pulls as the one available after 8 minutes. ↩
Originally published at Paagman.dev.