Skip to content

Upgrade puma 3.12.6 -> 8.0.2 (security: clears 7+ CVEs)#84

Merged
JuanVqz merged 1 commit into
mainfrom
security/upgrade-puma
Jul 9, 2026
Merged

Upgrade puma 3.12.6 -> 8.0.2 (security: clears 7+ CVEs)#84
JuanVqz merged 1 commit into
mainfrom
security/upgrade-puma

Conversation

@JuanVqz

@JuanVqz JuanVqz commented Jul 9, 2026

Copy link
Copy Markdown
Member

What

Security upgrade: puma ~> 3.7 (3.12.6) → ~> 8.0 (8.0.2).

Why

puma was pinned at 3.12.6 — EOL (2020) and carrying a stack of advisories, including a Critical HTTP request-smuggling CVE plus several High/Medium ones. The ~> 3.7 pin blocked every fix, so this is the highest-priority security item in the audit.

Why puma 8 and not 6: puma 6.x still carries two open High advisories — CVE-2026-47736 / CVE-2026-47737 (PROXY Protocol v1) — whose only fix is ~> 7.2.1 / >= 8.0.2. Bumping to 6.x would clear the old CVEs but leave those two. puma 8.0.2 clears all of them; bundle-audit shows no remaining puma advisories.

Changes

  • Gemfile: gem "puma", "~> 3.7""~> 8.0" (resolves to 8.0.2)
  • Both Gemfile.lock and the dual-boot Gemfile.next.lock updated
  • No config changes neededconfig/puma.rb uses only the standard threads / port / environment DSL + the tmp_restart plugin, all still valid in puma 8; the Procfile's -t/-p/-e flags are unchanged
  • Used --conservative so rack stays at 2.2.23 (no collateral major)

Verification (local)

  • bundle-audit: no remaining puma advisories (the whole point)
  • puma 8.0.2 boots as a server and serves HTTP 200 on /
  • App boots (Rails.env)
  • Test suite: 16 runs, 52 assertions, 0 failures, 0 errors, 0 skips
  • rubocop clean (exact CI config), reek clean

Note

Two non-puma advisories remain in the audit and are handled separately: concurrent-ruby (next PR — unpin < 1.3.5, update to >= 1.3.7) and webrick (transitive, no upstream patch yet; low exposure since puma serves in production).

@JuanVqz JuanVqz self-assigned this Jul 9, 2026
puma was pinned ~> 3.7 (3.12.6, EOL, 2020) with a stack of advisories
including a Critical HTTP request-smuggling CVE; the pin blocked every fix.
Bumped to ~> 8.0.

Went to puma 8 rather than 6: puma 6.x still carries two open High PROXY
Protocol v1 advisories (CVE-2026-47736/47737) whose only fix is ~> 7.2.1 /
>= 8.0.2, so 6.x would not have fully cleared bundle-audit. puma 8.0.2 is
clean.

config/puma.rb and the Procfile needed no changes (standard threads/port/
environment DSL + tmp_restart plugin, all still valid in puma 8). Used
--conservative so rack stays at 2.x. Both lockfiles updated.

Verified locally: bundle-audit shows no remaining puma advisories; puma
8.0.2 boots as a server and serves HTTP 200 on /; app boots; test suite
green (16 runs, 52 assertions, 0 failures); rubocop + reek clean.
@JuanVqz
JuanVqz force-pushed the security/upgrade-puma branch from f896017 to dd9c090 Compare July 9, 2026 05:10
@JuanVqz
JuanVqz marked this pull request as ready for review July 9, 2026 05:10
@JuanVqz
JuanVqz merged commit 2905b46 into main Jul 9, 2026
@JuanVqz
JuanVqz deleted the security/upgrade-puma branch July 9, 2026 05:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant