GitHub Advisoryadvisory · Go
GHSA-xwwr-4h3p-r22c rclone serve s3: --auth-proxy without --auth-key authenticates nobody - full SigV4 signature bypass
CRITICAL
Official page ↗
- Aliases
- CVE-2026-88018
- Ecosystem
- Go
- Packages
- github.com/rclone/rclone
- Severity
- Critical
- CVSS vector
- CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
- Weaknesses
- CWE-287, CWE-306
- Reviewed
- 2026-09-10
Affected packages
• Go github.com/rclone/rclone: < 1.75.1 → fixed in 1.75.1
Description
Summary
`rclone serve s3`'s handler chain, when `--auth-proxy` is configured, is (outermost first): `authPairMiddleware` -> `proxyAuthMiddleware` -> gofakes3's own SigV4-verifying handler.
`authPairMiddleware` parses the accessKeyID straight out of the incoming request's own `Authorization` header (entirely client-controlled) and registers `{accessKey: ws.s3Secret}` into gofakes3's shared credential store via `AddAuthKeys`, for EVERY access key any client presents - not just ones previously known to the server. `ws.s3Secret` defaults to `""` whenever `--auth-key` is not set, which the `--auth-proxy` documentation (and the reference `bin/test_proxy.py`) presents as a complete, standalone authentication mechanism requiring no other flag - matching how it's used for `serve webdav`/`ftp`/`sftp`.
gofakes3's SigV4 verification then checks the request's signature against exactly the secret `authPairMiddleware` just registered for that same client-chosen key. An empty string is a valid HMAC key, so a caller can trivially compute a correct SigV4 signature for ANY access key ID of their choosing using an empty secret, and verification passes.
Crucially, the auth-proxy script never receives a real secret to verify against, for S3 specifically: `Server.auth()` calls `w.proxy.Call(md5(accessKeyID), accessKeyID, false, r.RemoteAddr)` - passing the access key ID itself as BOTH the hashed "user" and the raw "auth"/password fields. Contrast with `serve webdav`/`ftp`/`sftp`, whose proxy integration passes the client's actual typed password (see `bin/test_proxy.py`, which forwards it into a backing SFTP login for real verification). For S3, no independent secret is ever transmitted to the proxy script at all, so no script - however carefully written - can distinguish a legitimate holder of an access key ID from an attacker who merely picked the same string.
Net effect: with `--auth-proxy` configured and `--auth-key` not also set (the configuration the feature is documented to support standalone), SigV4 signature verification authenticates nobody.
Details
Vulnerable code (before fix):
```go
func authPairMiddleware(next http.Handler, ws *Server) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
accessKey, _ := parseAccessKeyID(r)
authPair := map[string]string{accessKey: ws.s3Secret}
ws.faker.AddAuthKeys(authPair)
next.ServeHTTP(w, r)
})
}
```
PoC
Built and signed a request by hand (via the vendored `github.com/aws/aws-sdk-go-v2/aws/signer/v4`) using a freshly-random access key ID never configured or returned by anything, with `SecretAccessKey: ""`, against a real `rclone serve s3 --auth-proxy ` instance with no `--auth-key` set:
```
status=200
...mybucket...
```
A fully authenticated, successful bucket listing, with zero prior credential knowledge.
Impact
Any network-reachable, unauthenticated attacker who knows (or discovers) that a target is running `rclone serve s3 --auth-proxy` without `--auth-key` can choose an arbitrary access key ID, sign a request against an empty secret, and be treated as an authenticated user by the auth-proxy script - reaching whatever backend that script resolves the chosen identity to. No credentials, prior access, or user interaction of any kind are required.
Fix
Refuse to start `rclone serve s3` when `--auth-proxy` is set without `--auth-key`, rather than silently falling back to a signature check that authenticates nobody:
```go
if proxyOpt.AuthProxy != "" && len(opt.AuthKey) == 0 {
return nil, errors.New("serve s3: --auth-proxy requires --auth-key to also be set (SigV4 has no other way to verify a signature for a dynamically-proxied identity)")
}
```
Note this is a minimal fix for the zero-knowledge bypass; once `--auth-key` is also set, every access key ID still shares that one static secret for signature-verification purposes (a caller who knows it can request any identity from the proxy script) - a narrower, pre-existing limitation flagged for awareness but not changed here, since a complete fix needs the auth-proxy wire protocol to carry a per-identity secret for S3 specifically (a larger design change).
Related
Alias · CVE (1)
- CVE-2026-88018 rclone is a command-line program to sync files and directories to and from different cloud storage providers. vulnerability
References
- https://github.com/rclone/rclone/security/advisories/GHSA-xwwr-4h3p-r22c web
- https://nvd.nist.gov/vuln/detail/CVE-2026-88018 advisory
- https://github.com/rclone/rclone/commit/90595f34f27f569be6b27c57fe5ab65057d323bd web
- https://github.com/rclone/rclone package
- https://github.com/rclone/rclone/releases/tag/v1.75.1 web