GitHub Advisoryadvisory · Go
GHSA-486v-q2wf-fp2r rclone: http backend forwards custom/auth headers to a different host on redirect
LOW
Official page ↗
- Aliases
- CVE-2026-88013
- Ecosystem
- Go
- Packages
- github.com/rclone/rclone
- Severity
- Low
- CVSS vector
- CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:N/A:N
- Weaknesses
- CWE-200, CWE-319, CWE-522
- Reviewed
- 2026-09-10
Affected packages
• Go github.com/rclone/rclone: >= 1.49.0, < 1.75.1 → fixed in 1.75.1
Description
Vulnerability Details
File: `backend/http/http.go`
Lines: 285 (client construction — no `CheckRedirect`), 505-510 (`addHeaders`, writes configured secret headers onto every request), 533-534 / 700-701 / 782-785 (`f.httpClient.Do(req)` used by List/stat/download)
Root Cause
The `http` backend lets a user attach arbitrary secret headers to every request via `--http-headers`/`headers=` (documented for authentication: `'"Cookie","name=value","Authorization","xxx"'`). The backend's HTTP client is built with `fshttp.NewClient(ctx)`, which never sets `http.Client.CheckRedirect`, so it falls back to Go's stdlib default redirect policy.
Go's default policy only strips four header names (`Authorization`, `Www-Authenticate`, `Cookie`, `Cookie2`), and only when the redirect target's *host* differs from the original — every other configured header is copied to the redirect target unconditionally, regardless of host or scheme. Even the four protected names survive a same-host `https://` → `http://` downgrade, since Go only checks host equality, not scheme.
Any redirect response from the configured remote — whether from server compromise, an open redirect, a CDN/mirror failover to a different domain, or a malicious server from the start — causes rclone to resend every configured secret header (and, for a scheme downgrade, `Authorization`/`Cookie` in cleartext) to the new destination.
This is the exact vulnerability class already fixed for the `s3` backend (`9328763`/`7543a7a`, GHSA-8mxv-9xhp-86h4 and the `webdav` backend (`59b513b`, GHSA-h4mf-4v27-hggj, wiring `rest.RefuseHTTPSDowngradeRedirectFn`). `backend/http` was not touched by either fix.
Vulnerable Code
```go
// backend/http/http.go:285
client := fshttp.NewClient(ctx) // no CheckRedirect set
...
f.httpClient = client // used by readDir / NewObject / Object.Open
```
```go
// backend/http/http.go:505-510
func addHeaders(req *http.Request, opt *Options) {
for i := 0; i 0 && req.URL.Host != via[0].URL.Host {
for i := 0; i < len(opt.Headers); i += 2 {
req.Header.Del(opt.Headers[i])
}
}
return nil
}
}
```
A regression test (`TestRedirectStripsHeadersOnHostChange`) was added to `backend/http/http_internal_test.go`, confirmed to fail without the fix and pass with it. Full `backend/http` and `lib/rest` test suites pass with the fix applied. I have a fix branch ready to push to a private fork once this report is acknowledged.
Verification
Dynamically confirmed on rclone master @ `cfdc9d0` (post `v1.75.0`) in a local test harness — see "Dynamic Confirmation" above. Fix verified to eliminate the leak via the same harness (secret header absent from Server B after the fix; functionality — file download via redirect — unaffected).
Related
Alias · CVE (1)
- CVE-2026-88013 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-486v-q2wf-fp2r web
- https://nvd.nist.gov/vuln/detail/CVE-2026-88013 advisory
- https://github.com/rclone/rclone/commit/22859b7e696cea3c563c6ba04c6b7f91f74456b4 web
- https://github.com/rclone/rclone/commit/79fbc0842f74e02cb84f0e3e7261d169983c8831 web
- https://github.com/rclone/rclone/commit/925fb4fb21eb25e75cd1b64fdd17ded857784bfc web
- https://github.com/rclone/rclone package
- https://github.com/rclone/rclone/releases/tag/v1.75.1 web