CVE-2026-82255
gitoxide 0.25.4 HTTP Credential Leak via Redirect
gitoxide versions from 0.25.4 contain an HTTP credential leak vulnerability in the curl-based transport backend where credentials are sent to attacker-controlled servers after HTTP redirects. The vulnerability occurs because credential validation checks the original URL instead of the effective URL after redirect, allowing attackers to steal authentication tokens through cross-domain redirects or HTTPS-to-HTTP downgrades.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- High
- Privileges needed
- None
- User interaction
- Passive
What an attacker can affect
- Confidentiality
- High
- Integrity
- High
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
7.6
gitoxide 0.25.4 HTTP Credential Leak via Redirect
gitoxide versions from 0.25.4 contain an HTTP credential leak vulnerability in the curl-based transport backend where credentials are sent to attacker-controlled servers after HTTP redirects. The vulnerability occurs because credential validation checks the original URL instead of the effective URL after redirect, allowing attackers to steal authentication tokens through cross-domain redirects or HTTPS-to-HTTP downgrades.
- Record
CVE-2026-82255- CVSS 4.0
- 7.6 High
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N - CVSS 3.1
- 6.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:N - Weakness
- CWE-522
- Updated
- 2026-11-02
EUVDEUVD-2026-67581
7.6
gitoxide versions from 0.25.4 contain an HTTP credential leak vulnerability in the curl-based transport backend where credentials are sent to attacker-controlled servers after HTTP redirects. The vulnerability occurs because credential validation checks the original URL instead of the effective URL after redirect, allowing attackers to steal authentication tokens through cross-domain redirects or HTTPS-to-HTTP downgrades.
- Record
EUVD-2026-67581- CVSS 4.0
- 7.6 High
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-2r3q-w7g9-8rpr
7.6
gitoxide versions from 0.25.4 contain an HTTP credential leak vulnerability in the curl-based...
gitoxide versions from 0.25.4 contain an HTTP credential leak vulnerability in the curl-based transport backend where credentials are sent to attacker-controlled servers after HTTP redirects. The vulnerability occurs because credential validation checks the original URL instead of the effective URL after redirect, allowing attackers to steal authentication tokens through cross-domain redirects or HTTPS-to-HTTP downgrades.
- Record
GHSA-2r3q-w7g9-8rpr- CVSS 4.0
- 7.6 High
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 6.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:N - Weakness
- CWE-522
- Updated
- 2026-11-02
GitHub AdvisoriesGHSA-9857-6mw7-fq2m
6.8
gix-transport: HTTP credentials leaked to redirected host in curl backend
Summary
The curl-based HTTP transport in gix-transport sends user credentials (passwords, tokens) to an attacker-controlled server after an HTTP redirect. When a server responds with a 302 redirect during the initial GET /info/refs, gitoxide records the redirected base URL and rewrites all subsequent requests to point at the redirected host. The Authorization header is still attached because add_basic_auth_if_present() only checks self.url (the original, never-updated URL).
The reqwest backend is not affected. Its custom redirect policy at reqwest/remote.rs lines 60-64 compares prev_url.host_str() to curr_url.host_str() and calls attempt.stop() on cross-domain redirects, so redirected_base_url is never set to a different host.
Details
The vulnerability involves two components in gix-transport:
1. URL rewriting after redirect (gix-transport/src/client/blocking_io/http/curl/remote.rs)
After a request completes, the effective URL is compared to the requested URL. If they differ (redirect occurred), the new base URL is stored (lines 355-359). On subsequent requests, swap_tails() rewrites the target URL to point at the redirected host (line 166).
2. Credential check uses original URL (gix-transport/src/client/blocking_io/http/mod.rs, lines 293-312)
add_basic_auth_if_present() checks self.url (set once during construction, never mutated) to decide whether to attach credentials. Since self.url always points to the original host, credentials are approved even when the actual request goes to the redirected (attacker) host.
The Authorization header is added to the headers list in handshake() (line 374) and request() (line 434) before being passed to the backend, which applies them to the rewritten URL via handle.http_headers(headers) (line 309).
Attack flow: cross-domain credential leak
- Victim clones
https://legitimate.com/repowith credentials configured - Server returns 302 redirect on
GET /info/refstohttps://attacker.com/... - Curl follows the redirect and strips
Authorizationfor this GET (safe so far) - Attacker serves a valid info/refs response;
redirected_base_urlis set POST /git-upload-packis rewritten viaswap_tails()toattacker.comadd_basic_auth_if_present()checksself.url(stilllegitimate.com), approves credential sendingAuthorization: Basic <credentials>is sent toattacker.com
Curl's cross-domain header stripping only protects the redirected GET. It does not protect the POST, which is a new request with credentials re-attached by gitoxide.
Secondary vector: HTTPS-to-HTTP downgrade
The cleartext protection at mod.rs line 300-305 also checks self.url:
if self.url.starts_with("http://") {
return Err(client::Error::AuthenticationRefused("..."));
}
This only validates the original URL's scheme, not the effective URL after redirect. A redirect from https://legitimate.com to http://attacker.com bypasses this check, causing credentials to be sent in cleartext over HTTP.
- Victim clones
https://legitimate.com/repowith credentials - Server redirects to
http://attacker.com/...(note: HTTP, not HTTPS) add_basic_auth_if_present()checksself.url(stillhttps://), allows credentialsAuthorizationheader is sent over unencrypted HTTP toattacker.com
PoC
A complete Rust project that reproduces the issue. It starts two local TCP servers (legitimate on :8080, attacker on :9090) and uses gix-transport to demonstrate the credential leak.
To run: Create the project next to the gitoxide checkout so path dependencies resolve, then cargo run.
<details> <summary>Cargo.toml</summary>
[package]
name = "poc-gitoxide-redirect"
version =…
- Record
GHSA-9857-6mw7-fq2m- CVSS 3.1
- 6.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:N - Weakness
- CWE-522
- Updated
- 2026-11-02
NVD
7.6
gitoxide versions from 0.25.4 contain an HTTP credential leak vulnerability in the curl-based transport backend where credentials are sent to attacker-controlled servers after HTTP redirects. The vulnerability occurs because credential validation checks the original URL instead of the effective URL after redirect, allowing attackers to steal authentication tokens through cross-domain redirects or HTTPS-to-HTTP downgrades.
- Record
CVE-2026-82255- CVSS 4.0
- 7.6 High
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - CVSS 3.1
- 6.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:N - Weakness
- CWE-522
- Updated
- 2026-11-02
OSV
7.6
gitoxide 0.25.4 HTTP Credential Leak via Redirect
gitoxide versions from 0.25.4 contain an HTTP credential leak vulnerability in the curl-based transport backend where credentials are sent to attacker-controlled servers after HTTP redirects. The vulnerability occurs because credential validation checks the original URL instead of the effective URL after redirect, allowing attackers to steal authentication tokens through cross-domain redirects or HTTPS-to-HTTP downgrades.
- Record
CVE-2026-82255- CVSS 4.0
- 7.6 High
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-522
- Updated
- 2026-11-02
OSVDEBIAN-CVE-2026-82255
7.6
gitoxide versions from 0.25.4 contain an HTTP credential leak vulnerability in the curl-based transport backend where credentials are sent to attacker-controlled servers after HTTP redirects. The vulnerability occurs because credential validation checks the original URL instead of the effective URL after redirect, allowing attackers to steal authentication tokens through cross-domain redirects or HTTPS-to-HTTP downgrades.
- Record
DEBIAN-CVE-2026-82255- CVSS 4.0
- 7.6 High
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X - Updated
- 2026-11-02
OSVGHSA-9857-6mw7-fq2m
6.8
gix-transport: HTTP credentials leaked to redirected host in curl backend
Summary
The curl-based HTTP transport in gix-transport sends user credentials (passwords, tokens) to an attacker-controlled server after an HTTP redirect. When a server responds with a 302 redirect during the initial GET /info/refs, gitoxide records the redirected base URL and rewrites all subsequent requests to point at the redirected host. The Authorization header is still attached because add_basic_auth_if_present() only checks self.url (the original, never-updated URL).
The reqwest backend is not affected. Its custom redirect policy at reqwest/remote.rs lines 60-64 compares prev_url.host_str() to curr_url.host_str() and calls attempt.stop() on cross-domain redirects, so redirected_base_url is never set to a different host.
Details
The vulnerability involves two components in gix-transport:
1. URL rewriting after redirect (gix-transport/src/client/blocking_io/http/curl/remote.rs)
After a request completes, the effective URL is compared to the requested URL. If they differ (redirect occurred), the new base URL is stored (lines 355-359). On subsequent requests, swap_tails() rewrites the target URL to point at the redirected host (line 166).
2. Credential check uses original URL (gix-transport/src/client/blocking_io/http/mod.rs, lines 293-312)
add_basic_auth_if_present() checks self.url (set once during construction, never mutated) to decide whether to attach credentials. Since self.url always points to the original host, credentials are approved even when the actual request goes to the redirected (attacker) host.
The Authorization header is added to the headers list in handshake() (line 374) and request() (line 434) before being passed to the backend, which applies them to the rewritten URL via handle.http_headers(headers) (line 309).
Attack flow: cross-domain credential leak
- Victim clones
https://legitimate.com/repowith credentials configured - Server returns 302 redirect on
GET /info/refstohttps://attacker.com/... - Curl follows the redirect and strips
Authorizationfor this GET (safe so far) - Attacker serves a valid info/refs response;
redirected_base_urlis set POST /git-upload-packis rewritten viaswap_tails()toattacker.comadd_basic_auth_if_present()checksself.url(stilllegitimate.com), approves credential sendingAuthorization: Basic <credentials>is sent toattacker.com
Curl's cross-domain header stripping only protects the redirected GET. It does not protect the POST, which is a new request with credentials re-attached by gitoxide.
Secondary vector: HTTPS-to-HTTP downgrade
The cleartext protection at mod.rs line 300-305 also checks self.url:
if self.url.starts_with("http://") {
return Err(client::Error::AuthenticationRefused("..."));
}
This only validates the original URL's scheme, not the effective URL after redirect. A redirect from https://legitimate.com to http://attacker.com bypasses this check, causing credentials to be sent in cleartext over HTTP.
- Victim clones
https://legitimate.com/repowith credentials - Server redirects to
http://attacker.com/...(note: HTTP, not HTTPS) add_basic_auth_if_present()checksself.url(stillhttps://), allows credentialsAuthorizationheader is sent over unencrypted HTTP toattacker.com
PoC
A complete Rust project that reproduces the issue. It starts two local TCP servers (legitimate on :8080, attacker on :9090) and uses gix-transport to demonstrate the credential leak.
To run: Create the project next to the gitoxide checkout so path dependencies resolve, then cargo run.
<details> <summary>Cargo.toml</summary>
[package]
name = "poc-gitoxide-redirect"
version =…
- Record
GHSA-9857-6mw7-fq2m- CVSS 3.1
- 6.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:N - Weakness
- CWE-522
- Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-82255
7.6
gitoxide versions from 0.25.4 contain an HTTP credential leak vulnerability in the curl-based transport backend where credentials are sent to attacker-controlled servers after HTTP redirects. The vulnerability occurs because credential validation checks the original URL instead of the effective URL after redirect, allowing attackers to steal authentication tokens through cross-domain redirects or HTTPS-to-HTTP downgrades.
- Record
UBUNTU-CVE-2026-82255- CVSS 4.0
- 7.6 High
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:P/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N - CVSS 3.1
- 6.8 Medium
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:N - Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
gix-transportcrates.io |
0.25.4 to 0.55.0 | 0.56.0 |
rust-gix-transportDebian:13 |
All versions, plus listed versions 0.44.0-10.48.0-10.48.0-20.57.0-10.58.1-10.59.2-1 |
None known |
rust-gix-transportDebian:14 |
before 0.57.0-1, plus listed versions 0.44.0-10.48.0-10.48.0-2 |
0.57.0-1 |
gix-transportcrates.io |
0.25.4 up to 0.56.0 | 0.56.0 |
rust-gix-transportUbuntu:24.04:LTS |
All versions, plus listed versions 0.41.1-10.41.1-1build1 |
None known |
rust-gix-transportUbuntu:26.10 |
All versions, plus listed versions 0.48.0-10.57.0-1 |
None known |
rust-gix-transportUbuntu:26.04:LTS |
All versions, plus listed versions 0.44.0-10.48.0-1 |
None known |
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-82255 is a high vulnerability (CVSS 7.6) in Gitoxidelabs Gitoxide, published May 5, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.38%, the 32nd percentile. Fixed in gix-transport 0.56.0.
References
github.com/GitoxideLabs/gitoxide/security/advisories/GHSA-9857-6mw7-fq2m
vulncheck.com/advisories/gitoxide-0.25.4-http-credential-leak-via-redirect
nvd.nist.gov/vuln/detail/CVE-2026-82255
github.com/advisories/GHSA-2r3q-w7g9-8rpr
github.com/advisories/GHSA-9857-6mw7-fq2m
github.com/CVEProject/cvelistV5/tree/main/cves/2026/82xxx/CVE-2026-82255.json
Left out here: the rest of 2 source descriptions. The JSON record has them.