Public mode

No access to your tenant or devices. Every item links to its source. What this means

Some sources or documents need attention: 275/275 feeds/APIs · 469/469 docs · 9/9 advisories · checked 20:01 UTC Customize Public modeDiscuss ChangeIntel on Discord

SeaweedFS: Path traversal in the S3 and Iceberg REST gateways allows cross-bucket access

Exact source revision recorded 24 Oct 2026 13:19:41 UTC. It does not establish the source's current position. Latest evidence.

osv · GHSA-w62w-66v9-vvgv

Published

## 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)).

Source published
12 Aug 2026 19:19:54 UTC
Source modified
25 Sep 2026 14:25:32 UTC
Observed here
24 Oct 2026 13:19:41 UTC
Source terms
GitHub Advisory Database · CC-BY-4.0

Original source record · Cite this exact observation · Complete original publisher JSON

This view projects the publisher's source fields for reading; the original JSON retains additional fields and CVE enrichment containers. Attribution: osv · GitHub Advisory Database · CC-BY-4.0. Source text is retained; field grouping and change labels are provided by ChangeIntel.

CVSS_V4 · 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

Publisher rating · HIGH

ChangeIntel

An IT change radar: releases, security, known issues, retirements, documentation changes, and service status from public sources. Every item links to supporting evidence; dates and statuses can change after they are read.

Sources read 10 Nov 20:01 UTC · 275 of 275 readable · 273 fully read · documentation 469/469 current