Skip to content

fix: path traversal in DiskService#path_for - #307

Merged
flavorjones merged 1 commit into
mainfrom
fix-path-for
Jun 8, 2026
Merged

fix: path traversal in DiskService#path_for#307
flavorjones merged 1 commit into
mainfrom
fix-path-for

Conversation

@flavorjones

Copy link
Copy Markdown
Member

Port the upstream Rails fixes for CVE-2026-33195 to this gem's override of ActiveStorage::Service::DiskService#path_for, to reject dot segments, expand the path and require it to stay within the root, and convert ArgumentError (null bytes) and
Encoding::CompatibilityError into InvalidKeyError.

Also reject a blank tenant or key segment, specific to the tenant/token key layout.

Requires Rails >= 8.1.2.1, which introduces InvalidKeyError and the hardened parent path_for. Because this is still pre-release software, I'm comfortable bumping the requirement.

As the upstream commit says: These changes are defense-in-depth measures intended to limit the blast radius of developer errors, and are not a trust boundary.

ref: GHSA-pmwx-rm49-xv39

Port the upstream Rails fixes for CVE-2026-33195 to this gem's
override of `ActiveStorage::Service::DiskService#path_for`, to reject
dot segments, expand the path and require it to stay within the root,
and convert ArgumentError (null bytes) and
Encoding::CompatibilityError into InvalidKeyError.

Also reject a blank tenant or key segment, specific to the
tenant/token key layout.

Requires Rails >= 8.1.2.1, which introduces InvalidKeyError and the
hardened parent path_for. Because this is still pre-release software,
I'm comfortable bumping the requirement.

ref: GHSA-pmwx-rm49-xv39
Copilot AI review requested due to automatic review settings June 8, 2026 20:06

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Ports the upstream Rails hardening for ActiveStorage::Service::DiskService#path_for into this gem’s tenanted override, aiming to prevent path traversal by rejecting dot segments, normalizing/expanding paths, enforcing containment within the resolved root, and mapping key-string errors to ActiveStorage::InvalidKeyError.

Tip

If you aren't ready for review, convert to a draft PR.
Click "Convert to draft" or run gh pr ready --undo.
Click "Ready for review" or run gh pr ready to reengage.

Changes:

  • Harden DiskService#path_for for tenanted keys by rejecting dot segments, blank tenant/key segments, and enforcing that expanded paths remain within the disk root.
  • Convert ArgumentError (e.g., null bytes) and Encoding::CompatibilityError into ActiveStorage::InvalidKeyError with specific messages.
  • Add unit test coverage for path traversal and invalid key cases; bump Rails dependency to >= 8.1.2.1.

Reviewed changes

Copilot reviewed 3 out of 4 changed files in this pull request and generated no comments.

File Description
lib/active_record/tenanted/storage.rb Adds defense-in-depth validation and containment checks to the tenanted DiskService#path_for override and normalizes raised error types.
test/unit/storage_test.rb Introduces targeted tests covering traversal patterns, encoding/null byte errors, and a benign key containment check.
activerecord-tenanted.gemspec Bumps the minimum Rails requirement to >= 8.1.2.1 to rely on ActiveStorage::InvalidKeyError and upstream hardening.
Gemfile.lock Updates locked dependency requirements to match the new minimum Rails version.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@flavorjones
flavorjones merged commit b242c8a into main Jun 8, 2026
12 checks passed
@flavorjones
flavorjones deleted the fix-path-for branch June 8, 2026 20:13
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.

2 participants