CVE-2026-82251
gitoxide before 0.52.1 Path Traversal via Submodule Name
gitoxide before 0.52.1 fails to validate submodule names from .gitmodules configuration, allowing path traversal when deriving submodule git directories. Attackers can craft malicious submodule names with traversal segments to redirect state() and open() functions to repositories outside .git/modules, causing repository confusion and inspection of attacker-controlled repositories.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
8.7
gitoxide before 0.52.1 Path Traversal via Submodule Name
gitoxide before 0.52.1 fails to validate submodule names from .gitmodules configuration, allowing path traversal when deriving submodule git directories. Attackers can craft malicious submodule names with traversal segments to redirect state() and open() functions to repositories outside .git/modules, causing repository confusion and inspection of attacker-controlled repositories.
- Record
CVE-2026-82251- CVSS 4.0
- 8.7 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N - CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-22
- Updated
- 2026-11-02
EUVDEUVD-2026-67703
8.7
gitoxide before 0.52.1 fails to validate submodule names from .gitmodules configuration, allowing path traversal when deriving submodule git directories. Attackers can craft malicious submodule names with traversal segments to redirect state() and open() functions to repositories outside .git/modules, causing repository confusion and inspection of attacker-controlled repositories.
- Record
EUVD-2026-67703- CVSS 4.0
- 8.7 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-66gr-hvvc-vvxc
8.7
gitoxide before 0.52.1 fails to validate submodule names from .gitmodules configuration, allowing...
gitoxide before 0.52.1 fails to validate submodule names from .gitmodules configuration, allowing path traversal when deriving submodule git directories. Attackers can craft malicious submodule names with traversal segments to redirect state() and open() functions to repositories outside .git/modules, causing repository confusion and inspection of attacker-controlled repositories.
- Record
GHSA-66gr-hvvc-vvxc- CVSS 4.0
- 8.7 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/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
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-22
- Updated
- 2026-11-02
GitHub AdvisoriesGHSA-fr8x-3vfx-f45h
7.7
gix and gitoxide: unvalidated submodule name traverses out of .git/modules and redirects state() / open() to another repository
Summary
attachments: pocs.zip
Submodule names coming from .gitmodules are exposed as unvalidated names and are later reused to derive the submodule git directory as:
<superproject common_dir>/modules/<submodule name>
Because the submodule name is joined directly as a filesystem path component, a name such as ../../../escaped-target.git escapes .git/modules after normalization. The current implementation then uses that escaped path in both state() and open().
The updated PoC demonstrates the real sink, not just string construction:
state()reportsrepository_exists=truefor the traversed path;open()returns a repository whose normalizedcommon_dir()matches the attacker-chosen repository outside.git/modules.
Root cause analysis
The relevant flow is:
gix-submodule/src/access.rsexposes unvalidated submodule names from configuration.gix/src/submodule/mod.rsderives the git directory by doingcommon_dir().join("modules").join(name)with no confinement check.gix/src/submodule/mod.rsuses that derived path during state resolution and repository opening.
There is no normalization-and-confinement step between “submodule name from configuration” and “filesystem path used for repository existence checks / open.” As a result, traversal segments in the submodule name directly influence which repository path is inspected and opened.
Reproduce steps
Use the attached PoC zip that contains the pocs/ workspace.
-
Unzip the PoC archive.
-
Enter
pocs/F002. -
Run:
cargo run --quiet -
Compare the output with
pocs/F002/result.txt.
Key outputs are:
submodule_name=../../../escaped-target.gitderived_git_dir_raw=.../.git/modules/../../../escaped-target.gitderived_git_dir_normalized=.../artifacts/escaped-target.gitescaped_target=.../artifacts/escaped-target.gitrepository_exists=truesubmodule_opened=trueopened_common_dir_normalized=.../artifacts/escaped-target.gitnormalized_git_dir_matches_target=trueopened_common_dir_matches_target=truetarget_outside_modules_root=true
These outputs show that gitoxide is not only constructing a traversable path string. It is actually using the escaped path for repository existence checks and for opening a repository object.
Impact
Confirmed impact:
- a malicious submodule name can redirect submodule state inspection away from
.git/modules/<name>to an attacker-chosen repository path outside.git/modules; Submodule::state()can report repository existence for the wrong repository;Submodule::open()can return a repository object backed by that attacker-chosen path.
This is best described as a path-traversal / repository-confusion issue in submodule repository resolution.
This report does not claim command execution from this behavior alone. The demonstrated impact is repository redirection: callers that enumerate, inspect, or operate on submodules can be steered into using the wrong repository.
Recommended fix
Two complementary fixes are advisable:
- do not reuse raw submodule names as filesystem path fragments;
- either use a validated/sanitized name for filesystem derivation,
- or derive the storage path from a safe identifier instead of the user-controlled name;
- add an explicit confinement check after path derivation;
- normalize or canonicalize the candidate path,
- verify that the result stays under
<common_dir>/modules, - reject names that contain traversal segments, path separators, or any representation that can escape the modules root.
In short, submodule…
- Record
GHSA-fr8x-3vfx-f45h- CVSS 4.0
- 7.7 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:P - Weakness
- CWE-22
- Updated
- 2026-11-02
NVD
8.7
gitoxide before 0.52.1 fails to validate submodule names from .gitmodules configuration, allowing path traversal when deriving submodule git directories. Attackers can craft malicious submodule names with traversal segments to redirect state() and open() functions to repositories outside .git/modules, causing repository confusion and inspection of attacker-controlled repositories.
- Record
CVE-2026-82251- CVSS 4.0
- 8.7 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/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
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Weakness
- CWE-22
- Updated
- 2026-11-02
OSV
8.7
gitoxide before 0.52.1 Path Traversal via Submodule Name
gitoxide before 0.52.1 fails to validate submodule names from .gitmodules configuration, allowing path traversal when deriving submodule git directories. Attackers can craft malicious submodule names with traversal segments to redirect state() and open() functions to repositories outside .git/modules, causing repository confusion and inspection of attacker-controlled repositories.
- Record
CVE-2026-82251- CVSS 4.0
- 8.7 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N - Weakness
- CWE-22
- Updated
- 2026-11-02
Show 7 moreShow less
OSVDEBIAN-CVE-2026-82251
8.7
gitoxide before 0.52.1 fails to validate submodule names from .gitmodules configuration, allowing path traversal when deriving submodule git directories. Attackers can craft malicious submodule names with traversal segments to redirect state() and open() functions to repositories outside .git/modules, causing repository confusion and inspection of attacker-controlled repositories.
- Record
DEBIAN-CVE-2026-82251- CVSS 4.0
- 8.7 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/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-fr8x-3vfx-f45h
7.7
gix and gitoxide: unvalidated submodule name traverses out of .git/modules and redirects state() / open() to another repository
Summary
attachments: pocs.zip
Submodule names coming from .gitmodules are exposed as unvalidated names and are later reused to derive the submodule git directory as:
<superproject common_dir>/modules/<submodule name>
Because the submodule name is joined directly as a filesystem path component, a name such as ../../../escaped-target.git escapes .git/modules after normalization. The current implementation then uses that escaped path in both state() and open().
The updated PoC demonstrates the real sink, not just string construction:
state()reportsrepository_exists=truefor the traversed path;open()returns a repository whose normalizedcommon_dir()matches the attacker-chosen repository outside.git/modules.
Root cause analysis
The relevant flow is:
gix-submodule/src/access.rsexposes unvalidated submodule names from configuration.gix/src/submodule/mod.rsderives the git directory by doingcommon_dir().join("modules").join(name)with no confinement check.gix/src/submodule/mod.rsuses that derived path during state resolution and repository opening.
There is no normalization-and-confinement step between “submodule name from configuration” and “filesystem path used for repository existence checks / open.” As a result, traversal segments in the submodule name directly influence which repository path is inspected and opened.
Reproduce steps
Use the attached PoC zip that contains the pocs/ workspace.
-
Unzip the PoC archive.
-
Enter
pocs/F002. -
Run:
cargo run --quiet -
Compare the output with
pocs/F002/result.txt.
Key outputs are:
submodule_name=../../../escaped-target.gitderived_git_dir_raw=.../.git/modules/../../../escaped-target.gitderived_git_dir_normalized=.../artifacts/escaped-target.gitescaped_target=.../artifacts/escaped-target.gitrepository_exists=truesubmodule_opened=trueopened_common_dir_normalized=.../artifacts/escaped-target.gitnormalized_git_dir_matches_target=trueopened_common_dir_matches_target=truetarget_outside_modules_root=true
These outputs show that gitoxide is not only constructing a traversable path string. It is actually using the escaped path for repository existence checks and for opening a repository object.
Impact
Confirmed impact:
- a malicious submodule name can redirect submodule state inspection away from
.git/modules/<name>to an attacker-chosen repository path outside.git/modules; Submodule::state()can report repository existence for the wrong repository;Submodule::open()can return a repository object backed by that attacker-chosen path.
This is best described as a path-traversal / repository-confusion issue in submodule repository resolution.
This report does not claim command execution from this behavior alone. The demonstrated impact is repository redirection: callers that enumerate, inspect, or operate on submodules can be steered into using the wrong repository.
Recommended fix
Two complementary fixes are advisable:
- do not reuse raw submodule names as filesystem path fragments;
- either use a validated/sanitized name for filesystem derivation,
- or derive the storage path from a safe identifier instead of the user-controlled name;
- add an explicit confinement check after path derivation;
- normalize or canonicalize the candidate path,
- verify that the result stays under
<common_dir>/modules, - reject names that contain traversal segments, path separators, or any representation that can escape the modules root.
In short, submodule…
- Record
GHSA-fr8x-3vfx-f45h- CVSS 4.0
- 7.7 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:P - Weakness
- CWE-22
- Updated
- 2026-11-02
OSVUBUNTU-CVE-2026-82251
8.7
gitoxide before 0.52.1 fails to validate submodule names from .gitmodules configuration, allowing path traversal when deriving submodule git directories. Attackers can craft malicious submodule names with traversal segments to redirect state() and open() functions to repositories outside .git/modules, causing repository confusion and inspection of attacker-controlled repositories.
- Record
UBUNTU-CVE-2026-82251- CVSS 4.0
- 8.7 High
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N - CVSS 3.1
- 7.5 High
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N - Updated
- 2026-11-02
OSVAZL-98406 No score
CVE-2026-82251 affecting package rust for versions less than 1.75.0-30
gitoxide before 0.52.1 fails to validate submodule names from .gitmodules configuration, allowing path traversal when deriving submodule git directories. Attackers can craft malicious submodule names with traversal segments to redirect state() and open() functions to repositories outside .git/modules, causing repository confusion and inspection of attacker-controlled repositories.
- Record
AZL-98406- Updated
- 2026-11-05
OSVAZL-98421 No score
CVE-2026-82251 affecting package rust for versions less than 1.96.1-2
gitoxide before 0.52.1 fails to validate submodule names from .gitmodules configuration, allowing path traversal when deriving submodule git directories. Attackers can craft malicious submodule names with traversal segments to redirect state() and open() functions to repositories outside .git/modules, causing repository confusion and inspection of attacker-controlled repositories.
- Record
AZL-98421- Updated
- 2026-11-05
OSVopenSUSE-SU-2026:11730-1 No score
cargo-audit-0.22.2~git0.281452c-3.1 on GA media
These are all security issues fixed in the cargo-audit-0.22.2~git0.281452c-3.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2026:11730-1- Updated
- 2026-11-02
OSVopenSUSE-SU-2026:11741-1 No score
cargo-c-0.10.25-1.1 on GA media
These are all security issues fixed in the cargo-c-0.10.25-1.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2026:11741-1- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
gitoxidecrates.io |
through 0.52.0 | 0.52.1 |
gixcrates.io |
before 0.83.0 | 0.83.0 |
rustAzure Linux:3 |
before 1.75.0-30 | 1.75.0-30 |
rustAzure Linux:3 |
1.85.0 up to 1.96.1-2 | 1.96.1-2 |
rust-gixDebian:13 |
All versions, plus listed versions 0.69.1-10.69.1-20.73.0-10.73.0-20.73.0-3 Show 5 moreShow less0.73.0-40.83.0-10.83.0-20.86.0-10.87.1-1 |
None known |
rust-gixDebian:14 |
before 0.83.0-1, plus listed versions 0.69.1-10.69.1-20.73.0-10.73.0-20.73.0-30.73.0-4 |
0.83.0-1 |
gitoxidecrates.io |
before 0.52.1 | 0.52.1 |
rust-gixUbuntu:26.10 |
All versions, plus listed versions 0.73.0-10.83.0-2 |
None known |
rust-gixUbuntu:26.04:LTS |
All versions, plus listed versions 0.69.1-10.69.1-20.73.0-10.73.0-1build1 |
None known |
cargo-auditopenSUSE:Tumbleweed |
before 0.22.2~git0.281452c-3.1 | 0.22.2~git0.281452c-3.1 |
cargo-copenSUSE:Tumbleweed |
before 0.10.25-1.1 | 0.10.25-1.1 |
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-82251 is a high vulnerability (CVSS 8.7) 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.52%, the 44th percentile. Fixed in gitoxide 0.52.1.
References
github.com/GitoxideLabs/gitoxide/security/advisories/GHSA-fr8x-3vfx-f45h
vulncheck.com/advisories/gitoxide-before-0.52.1-path-traversal-via-submodule-name
nvd.nist.gov/vuln/detail/CVE-2026-82251
github.com/advisories/GHSA-66gr-hvvc-vvxc
github.com/advisories/GHSA-fr8x-3vfx-f45h
github.com/CVEProject/cvelistV5/tree/main/cves/2026/82xxx/CVE-2026-82251.json
Show 9 moreShow less
security-tracker.debian.org/tracker/CVE-2026-82251
github.com/GitoxideLabs/gitoxide
ubuntu.com/security/CVE-2026-82251
cve.org/CVERecord?id=CVE-2026-82251
suse.com/security/cve/CVE-2026-82247
suse.com/security/cve/CVE-2026-82250
suse.com/security/cve/CVE-2026-82251
suse.com/security/cve/CVE-2026-82253
suse.com/security/cve/CVE-2026-82254
Left out here: the rest of 2 source descriptions. The JSON record has them.