Aug 12, 2026·5 min read·80 visits
SeaweedFS gateways disable routing path cleaning, allowing '..' segments to reach the backend. This permits users with access to a single bucket to bypass IAM boundaries and read/write files in any other bucket on the cluster.
CVE-2026-54917 is a critical path traversal and authorization bypass vulnerability affecting the S3 and Iceberg REST catalog gateways in SeaweedFS. By explicitly disabling canonical path cleaning in the gorilla/mux routing system, relative path segments such as '..' are allowed to bypass routing constraints and access control checks. When these paths are collapsed server-side by the backend filer, they resolve to folders outside the authorized bucket boundary, allowing unauthorized cross-bucket access.
SeaweedFS is a highly scalable distributed storage system designed to support object storage (S3), file systems, and Iceberg tables. Within its architecture, the S3 API gateway and the Iceberg REST catalog gateway serve as translation layers, converting high-level object queries into low-level operations processed by the SeaweedFS distributed filer. These gateways rely on the gorilla/mux library for HTTP routing and parameter parsing.
To preserve raw path structures for specific storage use cases, both gateways historically initialized their routing engines with mux.NewRouter().SkipClean(true). Disabling canonical path cleaning prevents the routing engine from resolving relative directory navigation tokens, such as double dots (..), before matching incoming URIs. This configuration leaves the gateways exposed to path manipulation attacks.
When a request contains a directory traversal sequence, the router matches the catch-all pattern and forwards the unmodified path to the application logic. This behavior violates tenant isolation boundaries, as the relative segments remain intact during the routing and authorization phases. The complete bypass allows any authenticated tenant to access assets across the entire cluster.
The root cause of CVE-2026-54917 lies in a logic discrepancy between the router's path parameter extraction and the backend's path resolution mechanisms. In a standard configuration, relative path elements are normalized at the edge; however, with SkipClean(true) active, the raw traversal tokens bypass edge validation entirely.
When an attacker issues a crafted request, the router assigns the first segment as the {bucket} variable and the remainder as the {object} variable. Because the IAM authorization check is evaluated solely against the extracted {bucket} variable, the gateway validates and permits the request under the assumption that the caller is accessing their own authorized resource.
Following authorization, the gateway constructs the physical storage path by joining the bucket root with the unsanitized object key. The backend filer relies on Go's path.Join or util.JoinPath (which call filepath.Clean) to finalize the path structure. This execution collapses the relative directory sequences, shifting the target of the operation to an unauthorized destination.
Prior to version 4.30, the S3 API gateway lacked validation checks to verify whether captured route variables contained relative directory traversal sequences. The system's standard variable sanitization function, NormalizeObjectKey, was designed only to convert backslashes and collapse duplicate slashes.
// Vulnerable path resolution logic
func (s3a *S3ApiServer) toFilerPath(bucket, object string) string {
object = s3_constants.NormalizeObjectKey(object)
return fmt.Sprintf("%s/%s", s3a.bucketDir(bucket), object)
}To resolve this vulnerability, the maintainers implemented path validation middleware to intercept incoming requests before handlers process them. This middleware verifies that neither the bucket name nor the object key contains elements capable of traversing directories.
// Patched object key validation checks
func IsValidObjectKey(object string) bool {
if object == "" {
return true
}
if strings.ContainsRune(object, '\x00') {
return false
}
object = strings.ReplaceAll(object, "\\", "/")
for _, seg := range strings.Split(object, "/") {
if seg == "." || seg == ".." {
return false
}
}
return true
}This validation logic ensures that any route variable containing null bytes, directory traversal patterns, or structural separators is rejected immediately. The corresponding middleware throws an HTTP 400 Bad Request error before downstream operations are triggered.
Exploiting CVE-2026-54917 requires that the attacker possess valid S3 API credentials for at least one bucket on the targeted SeaweedFS deployment. Because standard client libraries automatically normalize directory traversal sequences before transmission, attackers must manually construct the raw HTTP requests.
To execute the exploit, a script manually computes and appends the S3 AWS Signature Version 4 (SigV4) headers. The raw HTTP request line is written directly to the socket to prevent the client runtime from removing the traversal characters. The request includes the traversal sequence inside the path parameter, targeting an unauthorized bucket.
# Signature generation logic requires signing the unnormalized canonical URI
wire, canon = build_paths(bucket, target_bucket, key, variant)
payload_sha = hashlib.sha256(body).hexdigest()
headers = sign_v4(method, host, port, wire, canon, ak, sk, region, payload_sha)When the S3 gateway receives this request, it decodes the URI and authenticates the user for the legitimate bucket. After authorization, the backend resolves the path traversal to perform read or write operations against the target bucket, completely bypassing tenant isolation boundaries.
The impact of this vulnerability is critical, as it allows complete horizontal privilege escalation across tenant boundaries. Any user with read or write credentials for a single bucket can access, modify, or delete files across all other buckets on the system.
This bypass undermines the data confidentiality and integrity guarantees of multi-tenant SeaweedFS deployments. Attackers can exfiltrate raw database backups, sensitive system files, or proprietary data objects, or overwrite existing objects with malicious payloads.
This flaw has been assigned a CVSS v3.1 base score of 10.0, reflecting its low complexity, network-based attack vector, and the lack of high-level privileges required to compromise tenant isolation. Because the flaw affects multiple protocol gateways, it represents a systemic vulnerability in the access control layer.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
SeaweedFS SeaweedFS | < 4.30 | 4.30 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-22 |
| Attack Vector | Network |
| CVSS Score | 10.0 |
| Exploit Status | Proof-of-Concept Available |
| CISA KEV Status | Not Listed |
Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')
An LDAP injection vulnerability exists in the centraldogma-server-auth-shiro module of LY Corporation Central Dogma before version 0.84.0. The search logic dynamically constructs LDAP search filters by interpolating user-provided usernames without escaping RFC 4515 metacharacters. Unauthenticated remote attackers can leverage this flaw to bypass authentication, enumerate directory hierarchies, and access unauthorized resources.
CVE-2026-11746 is a critical vulnerability in Central Dogma Server prior to version 0.84.0, where an embedded ZooKeeper replication secret silently falls back to a publicly known, hard-coded default string ('ch4n63m3'). Remote attackers with access to the replication network can authenticate as legitimate cluster peers, potentially leading to unauthorized data exposure, state manipulation, or complete cluster takeover.
A logical verification flaw in ZITADEL's external JWT Identity Provider validation allows attackers to bypass session expiration checks. If an incoming JWT lacks the 'exp' claim, the system skips validation entirely, creating an indefinitely valid session. This issue has been addressed in versions 3.4.12 and 4.15.2.
CVE-2026-59149 identifies a directory traversal vulnerability in `@mockoon/commons-server`, the backend mock-server library powering the Mockoon application. The flaw occurs in the path containment validation logic used during raw file response generation. An unauthenticated attacker can exploit this weakness to retrieve arbitrary files from sibling directories sharing a common prefix with the designated static base directory.
An in-depth analysis of CVE-2026-59148, a high-severity flaw in Mockoon where unauthenticated administrative endpoints and a wildcard Cross-Origin Resource Sharing (CORS) policy allow remote execution, state poisoning, and credential theft.
An improper authentication vulnerability (CWE-287) in ZITADEL's external identity provider handler before version 4.15.3 allows remote attackers to perform complete account takeover. When auto-linking by email is enabled, ZITADEL verifies that the local target account has a verified email address but fails to verify if the external provider confirmed ownership of that same email. Attackers can exploit this by registering an unverified account with a victim's email address on a permissive external provider, leading to unauthorized account binding and persistent access.