CVE-2026-54917: SeaweedFS Path Traversal Vulnerability

HIGH
Advisory Identifier: GHSA-w62w-66v9-vvgv
CWE-22
Published
Advisory Summary

CVE-2026-54917 is a HIGH path traversal vulnerability (CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')) affecting SeaweedFS libraries in the Go ecosystem. The issue involves path traversal in the s3 and iceberg rest gateways allows cross-bucket access. Remediation is available by upgrading affected packages to version 0.0.0-20260526080459-dd1b4287899e.

CVE-2026-54917 at a Glance

CVE Identifier CVE-2026-54917
GHSA Identifier GHSA-w62w-66v9-vvgv
Severity HIGH
CVSS v3.1 Base Score N/A
CWE Classification CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')
Affected Product SeaweedFS
Package Ecosystem Go
Published Date
Last Updated

How to Fix CVE-2026-54917

To remediate this vulnerability, upgrade all affected SeaweedFS dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

github.com/seaweedfs/seaweedfs fixed: 0.0.0-20260526080459-dd1b4287899e
Upgrade github.com/seaweedfs/seaweedfs to 0.0.0-20260526080459-dd1b4287899e
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

inspect dependencies for github.com/seaweedfs/seaweedfs

How to Check if You Are Affected

To determine whether your application is affected by CVE-2026-54917, inspect your project dependencies for SeaweedFS:

inspect dependencies for github.com/seaweedfs/seaweedfs

Analyze the terminal output to locate any version of SeaweedFS in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 0.0.0-20260526080459-dd1b4287899e), your application is affected.

Note: Verify declared build manifests and deployed runtime container environments.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal'), where the product uses external input to construct a pathname that is intended to identify a file or directory that is located underneath a restricted parent directory, but the product does not properly neutralize special elements within the pathname that can cause the pathname to resolve to a location that is outside of the restricted directory. In SeaweedFS, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

## Summary The S3 API gateway and the Iceberg REST catalog gateway construct their routers with `mux.NewRouter().SkipClean(true)`. With path cleaning disabled, a `..` segment inside the URL survives routing, so a request such as: ``` GET /bucket-A/../evil-bucket/key ``` is matched as `bucket=bucket-A`, `object=../evil-bucket/key`. The captured object key is then joined into a filer path with `util.JoinPath` (S3) / `path.Join` (Iceberg), which collapse the `..` server-side, so the actual read or write lands in `evil-bucket`. The captured path variables were never validated for traversal segments before reaching the handlers, so bucket isolation depended on downstream checks rather than on the path itself. ## Impact - **With authentication disabled** (`enableAuth=false`): direct cross-bucket read and write. An object key containing `..` resolves to and operates on a different bucket than the one named in the request path. - **With authentication enabled** (`enableAuth=true`): an authorization confused-deputy. IAM evaluates the policy against the mux `{bucket}` variable (`bucket-A`) in `iam.authRequestWithAuthType`, while the I/O is performed against the traversed target (`evil-bucket`). A principal authorized for one bucket can therefore reach objects in another bucket it has no grant for. This breaks tenant isolation. The same class of traversal applies to the Iceberg REST catalog's `{prefix}`, `{namespace}`, and `{table}` path variables. `%2e%2e`-encoded and `..\` (backslash) variants are equivalent, because gorilla/mux URL-decodes captured variables and `NormalizeObjectKey` folds `\` to `/` before the path is used. ## Affected components - S3 API gateway (`weed s3`, and the S3 endpoint embedded in `weed server`) - Iceberg REST catalog gateway ## Affected versions All releases prior to **4.30**. ## Patched version **4.30** and later. ## Proof of concept With a bucket `evil-bucket` containing `secret.txt`, and a caller that only has (or needs no) access to `bucket-A`: ``` GET /bucket-A/../evil-bucket/secret.txt HTTP/1.1 Host: <gateway> ``` The response returns the contents of `evil-bucket/secret.txt`. The encoded form `GET /bucket-A/%2e%2e/evil-bucket/secret.txt` behaves identically. ## Remediation Upgrade to SeaweedFS **4.30** or later. The fix adds a validation middleware to both gateway routers that rejects any captured path variable containing a `.` or `..` segment, a NUL byte, an embedded slash/backslash in single-segment slots, or an empty captured value, before any handler runs. ## Workarounds For deployments that cannot upgrade immediately, place a reverse proxy in front of the gateway that normalizes the request path and rejects requests whose path contains `..`, `%2e%2e`, or backslash sequences. Note that disabling auth removes the only remaining barrier, so do not rely on `enableAuth=false` deployments being protected by anything. ## Resources - Fix: https://github.com/seaweedfs/seaweedfs/pull/9687 (commit `dd1b428`) ## Credits Reported responsibly by **Denis Abashkin** ([@dadbravo](https://github.com/dadbravo)).

CVE-2026-54917 Affected SeaweedFS Versions

1 component(s)
Fixed Versions:
0.0.0-20260526080459-dd1b4287899e
Product / Package Ecosystem Affected Versions Fixed Version
github.com/seaweedfs/seaweedfs
Go
< 0.0.0-20260526080459-dd1b4287899e
0.0.0-20260526080459-dd1b4287899e

References

Frequently Asked Questions

What is CVE-2026-54917?
CVE-2026-54917 is a security vulnerability in SeaweedFS involving Path traversal in the S3 and Iceberg REST gateways allows cross-bucket access under CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal').
Which SeaweedFS versions are affected?
Affected versions include releases prior to 0.0.0-20260526080459-dd1b4287899e across affected packages: github.com/seaweedfs/seaweedfs.
What version fixes CVE-2026-54917?
Upgrading to 0.0.0-20260526080459-dd1b4287899e (or the latest patched release for your respective branch) resolves the vulnerability.
Is github.com/seaweedfs/seaweedfs affected?
Yes, github.com/seaweedfs/seaweedfs is affected in releases prior to 0.0.0-20260526080459-dd1b4287899e. Upgrade your dependency to 0.0.0-20260526080459-dd1b4287899e or later.
What CWE is associated with CVE-2026-54917?
CVE-2026-54917 is classified under CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') (The product uses external input to construct a pathname that is intended to identify a file or directory that is located underneath a restricted parent directory, but the product does not properly neutralize special elements within the pathname that can cause the pathname to resolve to a location that is outside of the restricted directory.).
How can I check Go dependencies for CVE-2026-54917?
Run the dependency tree command: 'inspect dependencies for github.com/seaweedfs/seaweedfs'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-w62w-66v9-vvgv",
  "modified" : "2026-08-12T19:19:54Z",
  "published" : "2026-08-12T19:19:54Z",
  "aliases" : [ "CVE-2026-54917" ],
  "summary" : "SeaweedFS: Path traversal in the S3 and Iceberg REST gateways allows cross-bucket access",
  "details" : "## Summary\n\nThe S3 API gateway and the Iceberg REST catalog gateway construct their routers with `mux.NewRouter().SkipClean(true)`. With path cleaning disabled, a `..` segment inside the URL survives routing, so a request such as:\n\n```\nGET /bucket-A/../evil-bucket/key\n```\n\nis matched as `bucket=bucket-A`, `object=../evil-bucket/key`. The captured object key is then joined into a filer path with `util.JoinPath` (S3) / `path.Join` (Iceberg), which collapse the `..` server-side, so the actual read or write lands in `evil-bucket`.\n\nThe captured path variables were never validated for traversal segments before reaching the handlers, so bucket isolation depended on downstream checks rather than on the path itself.\n\n## Impact\n\n- **With authentication disabled** (`enableAuth=false`): direct cross-bucket read and write. An object key containing `..` resolves to and operates on a different bucket than the one named in the request path.\n- **With authentication enabled** (`enableAuth=true`): an authorization confused-deputy. IAM evaluates the policy against the mux `{bucket}` variable (`bucket-A`) in `iam.authRequestWithAuthType`, while the I/O is performed against the traversed target (`evil-bucket`). A principal authorized for one bucket can therefore reach objects in another bucket it has no grant for. This breaks tenant isolation.\n\nThe same class of traversal applies to the Iceberg REST catalog's `{prefix}`, `{namespace}`, and `{table}` path variables.\n\n`%2e%2e`-encoded and `..\\` (backslash) variants are equivalent, because gorilla/mux URL-decodes captured variables and `NormalizeObjectKey` folds `\\` to `/` before the path is used.\n\n## Affected components\n\n- S3 API gateway (`weed s3`, and the S3 endpoint embedded in `weed server`)\n- Iceberg REST catalog gateway\n\n## Affected versions\n\nAll releases prior to **4.30**.\n\n## Patched version\n\n**4.30** and later.\n\n## Proof of concept\n\nWith a bucket `evil-bucket` containing `secret.txt`, and a caller that only has (or needs no) access to `bucket-A`:\n\n```\nGET /bucket-A/../evil-bucket/secret.txt HTTP/1.1\nHost: <gateway>\n```\n\nThe response returns the contents of `evil-bucket/secret.txt`. The encoded form `GET /bucket-A/%2e%2e/evil-bucket/secret.txt` behaves identically.\n\n## Remediation\n\nUpgrade to SeaweedFS **4.30** or later. The fix adds a validation middleware to both gateway routers that rejects any captured path variable containing a `.` or `..` segment, a NUL byte, an embedded slash/backslash in single-segment slots, or an empty captured value, before any handler runs.\n\n## Workarounds\n\nFor deployments that cannot upgrade immediately, place a reverse proxy in front of the gateway that normalizes the request path and rejects requests whose path contains `..`, `%2e%2e`, or backslash sequences. Note that disabling auth removes the only remaining barrier, so do not rely on `enableAuth=false` deployments being protected by anything.\n\n## Resources\n\n- Fix: https://github.com/seaweedfs/seaweedfs/pull/9687 (commit `dd1b428`)\n\n## Credits\n\nReported responsibly by **Denis Abashkin** ([@dadbravo](https://github.com/dadbravo)).",
  "severity" : [ {
    "type" : "CVSS_V4",
    "score" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:N/SC:H/SI:H/SA:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "Go",
      "name" : "github.com/seaweedfs/seaweedfs"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "0.0.0-20260526080459-dd1b4287899e"
      } ]
    } ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/seaweedfs/seaweedfs/security/advisories/GHSA-w62w-66v9-vvgv"
  }, {
    "type" : "ADVISORY",
    "url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-54917"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/seaweedfs/seaweedfs/pull/9687"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/seaweedfs/seaweedfs/commit/dd1b4287899eed3dfd73c2f3b1de001996fda229"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/seaweedfs/seaweedfs"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-22" ],
    "severity" : "HIGH",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-08-12T19:19:54Z",
    "nvd_published_at" : "2026-06-25T19:16:42Z"
  }
}