Aug 6, 2026·5 min read·1 visit
A middleware path-desynchronization defect in rclone serve restic allows authenticated users to bypass repository isolation and access other tenants' backups using path traversal sequences.
A critical path traversal and authorization bypass vulnerability exists in the rclone serve restic command when multi-user isolation is enabled using the --private-repos flag. Due to a middleware desynchronization flaw, authenticated users can access, modify, or delete backup repositories belonging to other tenants.
Rclone features an integrated REST server subcommand, serve restic, which enables the hosting of multiple private restic backup repositories. This functionality leverages the --private-repos flag to enforce isolation among distinct clients. Under this security model, each authenticated user is restricted to their own designated repository folder.
The isolation is implemented via HTTP Basic authentication, where the backend sub-directory is determined by the authenticated username. However, a logical flaw exists in the directory confinement checks prior to version 1.74.4. This allows authenticated clients to escape their restricted path boundaries.
The flaw represents a path traversal and authorization bypass vulnerability classified under CWE-22 and CWE-639. An authenticated attacker can read, modify, or delete backup data belonging to other users on the same server.
The root cause of CVE-2026-59733 lies in a logical path-desynchronization defect between two distinct HTTP middleware components in the cmd/serve/restic package. These components are checkPrivate (the authorization handler) and WithRemote (the object-key retrieval handler).
When a client submits an HTTP request, the checkPrivate middleware validates access based on a path parameter parsed by the go-chi router. Specifically, it retrieves the {userID} wildcard parameter. If an attacker submits a path such as /attacker/../victim/config, the router identifies attacker as the {userID} parameter. Because the attacker is authenticated as attacker, the access check is authorized successfully.
Following authorization, the WithRemote middleware processes the request to determine the target storage path. Rather than utilizing the verified {userID} parameter, it extracts the raw, uncanonicalized path directly from the URL. The storage backend subsequently cleans the relative dot-dot segments, which resolves /attacker/../victim/config directly to /victim/config.
This desynchronization permits authorized access under the identity of one user, while the physical read, write, or delete operation is executed against the directory of a different user.
The vulnerable version of the path extraction logic does not perform validation on the directory components of the raw URL path. This allows traversal sequences to pass directly into the storage backend.
// Vulnerable logic in cmd/serve/restic/restic.go
func WithRemote(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
urlpath := r.URL.Path
urlpath = strings.Trim(urlpath, "/")
// Raw path containing ".." is parsed directly without canonical verification
parts := matchData.FindStringSubmatch(urlpath)
// ...
})
}The official patch addresses this gap by validating that the requested path is already in canonical form before any parsing occurs. It utilizes path.Clean to check for anomalies.
// Patched logic in cmd/serve/restic/restic.go
func WithRemote(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
urlpath := r.URL.Path
urlpath = strings.Trim(urlpath, "/")
// Reject any non-canonical path, in particular one containing ".." traversal elements.
if urlpath != "" && path.Clean(urlpath) != urlpath {
http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
return
}
parts := matchData.FindStringSubmatch(urlpath)
// ...
})
}An attacker requires a valid set of credentials for their own private repository namespace. The attack vector is executed over HTTP, making it fully remote and independent of local host privileges.
The attack is executed by constructing custom HTTP requests that embed relative directory traversal segments directly into the URL path. By inserting the authorized username, followed by traversal operators and the target user's namespace, the request escapes the tenant sandbox.
For example, to retrieve the configuration of a victim repository, the attacker issues a GET request to /attacker/../victim/config with their own Basic Authentication credentials. The server responds with the contents of the target repository's configuration. Overwriting or deleting the configuration can similarly be executed using POST or DELETE requests.
The impact of CVE-2026-59733 is a full compromise of data confidentiality, integrity, and availability within multi-user rclone restic environments. A compromised tenant can access, manipulate, or delete all stored backups across every other tenant on the system.
The National Vulnerability Database has assigned a CVSS v3.1 score of 8.8 (High), with a vector of CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H. This reflects the low complexity of the attack and the lack of required interaction, combined with high impact metrics.
Because backup systems often contain highly sensitive data, including system configurations, intellectual property, and credentials, the exposure of these files constitutes a critical vector for data exfiltration and subsequent lateral movement.
The primary remediation for this vulnerability is upgrading the rclone installation to version 1.74.4 or later. This version contains the path canonicalization check which successfully blocks non-canonical requests.
If immediate upgrading is not viable, administrators must implement alternative isolation strategies. Disabling the --private-repos flag and running separate rclone daemon processes for each tenant on distinct ports is the recommended workaround.
Additionally, upstream reverse proxies such as Nginx or HAProxy can be configured to inspect and block any request paths that contain directory traversal tokens such as .. or double slashes before they reach the rclone backend.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H| Product | Affected Versions | Fixed Version |
|---|---|---|
rclone Rclone | < 1.74.4 | 1.74.4 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-22, CWE-639 |
| Attack Vector | Network (Remote) |
| CVSS v3.1 | 8.8 (High) |
| EPSS Score | 0.00422 |
| Impact | Complete compromise of repository confidentiality, integrity, and availability |
| Exploit Status | Proof-of-Concept (PoC) available |
| CISA KEV Status | Not listed |
The application builds a pathname using input paths that can contain path traversal sequences, allowing access to files outside of the restricted namespace.
A protocol downgrade vulnerability in rclone's WebDAV backend allows sensitive credentials, cookies, and authentication headers to be transmitted in cleartext. This occurs when a remote server redirects an HTTPS request to a plaintext HTTP URL on the same host, which the Go HTTP client default behavior permits without checking the protocol transport layer. This report provides a detailed technical analysis of the root cause, exploit mechanics, patch diff, and remediation strategies.
An incomplete sanitization vulnerability exists in rclone's SFTP backend before version 1.75.0 when performing server-side hashing operations on Windows hosts. Due to PowerShell treating Unicode smart quotes as equivalent to ASCII single quotes, malicious file paths can escape command string delimiters and execute arbitrary commands on the remote system.
A logic vulnerability in the rclone S3 backend implementation allows an unauthenticated adjacent-network attacker to intercept temporary AWS STS credentials. During HTTP redirection handling, the application fails to verify whether a protocol scheme change occurred (such as transitioning from HTTPS to HTTP). If a secure request is redirected to an unencrypted endpoint on the same host, rclone continues to forward the highly sensitive X-Amz-Security-Token header in cleartext.
CVE-2025-15366 is a command injection vulnerability in Python's standard imaplib module, occurring due to the improper neutralization of carriage returns (\r), line feeds (\n), and null bytes (\x00). When an application passes user-controlled input into standard IMAP library calls, an attacker can break out of the line-oriented protocol context and execute arbitrary IMAP directives with the privileges of the authenticated session.
A path traversal vulnerability (Zip Slip variant) exists in rclone's archive extract functionality before version 1.74.4. The command fails to sanitize relative directory components in archive headers, allowing files to be written outside the target directory or cloud prefix. This issue can result in arbitrary file writes or cloud object overwrites depending on the permissions of the credentials used. Nick Craig-Wood authored the patch on June 29, 2026, which was released in version 1.74.4 on July 14, 2026. This vulnerability is assigned CVE-2026-59732 and is cataloged as GHSA-4vr5-p2gc-h23p. This report provides a detailed root cause analysis, code-level diff, and remediation steps.
A local encoding path traversal vulnerability exists in rclone versions from v1.51.0 up to v1.75.0. When non-default local encoding parameters (such as Slash, None, or Raw) are specified, rclone's standard decoder maps safely encoded fullwidth dot-dot characters back into native directory traversal components. Since the local backend historically lacked a post-resolution path containment check, these relative segments resolved outside the designated synchronization root, allowing arbitrary file creation and modification on the host system.