Skip to main content

gitoxide gix-fs CVE-2026-100419

| EUVDEUVD-2026-87366 HIGH
Improper Link Resolution Before File Access (CWE-59)
2026-09-25 disclosure@vulncheck.com GHSA-jjhr-hr59-47h4
7.3
CVSS 4.0 · Vendor: vulncheck
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Recon
    Publish malicious repo with duplicate symlink+dir tree entries
  2. Delivery
    Victim performs forced checkout (overwrite_existing)
  3. Exploit
    Prefix-reuse bypasses leading-directory validation
  4. Install
    Symlink resolves write outside worktree
  5. C2
    Plant executable .git/hooks/post-checkout
  6. Execute
    Hook runs on next Git op
  7. Impact
    Code execution as victim

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V5 - File Handling Symlink resolution safety
Exploitation Conditions

Exploitation requires: (1) the victim to check out an attacker-controlled/malicious repository or tree using gitoxide's worktree checkout; (2) checkout performed in forced mode with overwrite_existing enabled, which triggers the deferred-symlink phase; (3) a filesystem supporting symlinks (the writeup uses std::os::unix::fs::symlink, i.e. Unix-like hosts); and (4) a crafted tree containing colliding symlink and directory entries sharing a leading component so that gix_fs::Stack::make_relative_path_current reuses the cached prefix and skips create_leading_directory's symlink_metadata/unlink check. Limiting factors that reduce real-world risk: attack vector is LOCAL (no remote/network trigger), it needs user interaction (the victim must initiate the checkout), attack complexity is HIGH plus an additional attack requirement (winning the prefix-reuse condition), and it depends on the non-default forced/overwrite checkout mode rather than a plain clone.

Impact

This is a genuine but conditionally-gated risk rather than a mass-exploitation threat. The vendor CVSS 4.0 vector (AV:L/AC:H/AT:P/PR:N/UI:P) is internally consistent with the technical writeup: exploitation is LOCAL (the victim must check out an attacker-crafted repository), requires HIGH attack complexity plus a specific attack requirement (AT:P) because it depends on winning the prefix-reuse caching condition in gix_fs::Stack and on the checkout running in forced mode with overwrite_existing, and requires user interaction (UI:P - the victim initiating checkout). Impact is high (VC:H/VI:H/VA:H) because a worktree escape allowing arbitrary symlink/file writes (e.g. into .git/hooks or any writable directory) chains to code execution. No EPSS score, no CISA KEV listing, and no packaged proof-of-concept are present in the input, so this is 'no public exploit identified at time of analysis' - however, the GHSA advisory (GHSA-f89h-2fjh-2r9q) contains a detailed, near-reproducible exploitation recipe (duplicate symlink+directory tree entries → deferred symlink phase → symlink(target, '<wt>/a/post-checkout')), which materially lowers the barrier to weaponization. Note a version-scope conflict that must be resolved before remediation: the CVE description states 'before 0.23.0' while the GHSA/package data states vulnerable <= 0.21.0, fixed in 0.21.1, and the source reference cites the gix-fs-v0.22.1 tag - verify the true fixed version with the vendor. Net: real priority for anyone whose tooling force-checks-out untrusted repositories with gitoxide, but not an internet-facing drive-by; the AV:L + UI:P + AC:H combination keeps real-world exposure narrow.

Exploit ScenarioDerived

An attacker publishes a malicious Git repository whose tree contains a symlink entry 'a' pointing to a sensitive directory (e.g. .git/hooks) plus a colliding directory 'a/' containing a symlink such as post-checkout. When a victim performs a forced checkout (overwrite_existing) of this repository using gitoxide, the deferred symlink phase reuses the cached 'a' prefix without re-running the intermediate-directory safety check, so a subsequent write resolves through the attacker's symlink and lands outside the worktree - e.g. writing an executable .git/hooks/post-checkout that runs on the next hook-aware Git operation. No packaged PoC is provided, but the GHSA advisory documents the full exploitation path in reproducible detail.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.1% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Sep 25, 2026

Path traversal via symlink prefix reuse in gitoxide's gix-fs crate (before 0.23.0; GHSA lists <= 0.21.0) allows a crafted repository tree to write attacker-controlled symlinks outside the worktree during forced checkout with overwrite_existing enabled, enabling code execution by overwriting known paths such as .git/hooks/post-checkout. Exploitation is local, requires user interaction to initiate checkout of an untrusted tree, and has high attack complexity tied to winning the prefix-reuse condition; no public exploit was identified at time of analysis, and no KEV or EPSS data were provided. Per the assessed CVSS:3.1 vector AV:L/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:H, unauthenticated but local access with user interaction is required.

RemediationAI

Apply the vendor fix: upgrade the gix-fs crate to the patched release. The GitHub advisory GHSA-f89h-2fjh-2r9q identifies fixed version 0.21.1, while NVD/VulnCheck reference the fix as gix-fs 0.23.0 and point to upstream commit b62498378b8bc2c95863a044b700f2063b0b5875; upgrading to 0.23.0 or later, or to at least 0.21.1 as verified against your dependency tree, is the primary remediation. Confirm resolution against both advisories (GHSA-f89h-2fjh-2r9q and GHSA-6p9q-f2xg-6pr5). Where immediate upgrade is not possible, avoid forced checkout with overwrite_existing enabled on untrusted repositories, since the flaw is only reachable through the deferred-symlink phase of that mode; this breaks normal forced-checkout workflows. Additionally, avoid using gitoxide checkout on attacker-controlled trees, or run checkout inside a sandbox/container with no write access to sensitive locations such as .git/hooks, shell startup files, or other attacker-targetable paths; this reduces post-exploitation impact but does not eliminate the worktree escape itself. Ensure .git/hooks and other predictable execution paths are not writable by the checkout process where feasible, though note the escape is not limited to the repository directory and can target any path the user can write.

Affected VersionsENISA

gitoxide 0 <0.23.0

Affected Packages

euvd gitoxide fix: 0.23.0

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

CWE-59 (Improper Link Resolution Before File Access / link following) in gix-fs's worktree checkout path validation. During checkout, gitoxide defers all symlink index entries and creates them after regular files using a single shared gix_worktree::Stack backed by gix_fs::Stack. gix_fs::Stack::make_relative_path_current() caches validated path prefixes; when a previously processed leaf component exactly matches the leading component of the next path, the leaf-to-directory transition at gix-fs/src/stack.rs:195-197 calls only delegate.push_directory() and never delegate.push(). In gix_worktree::stack::delegate::StackDelegate, when the state is State::CreateDirectoryAndAttributesStack, the push_directory path only loads attributes (for example from the ODB in the clone case) and does not perform the on-disk symlink_metadata() check or the unlink-on-collision logic, which lives in StackDelegate::push() via create_leading_directory(). Because the terminal symlink is created with plain std::os::unix::fs::symlink, which follows symlinks in parent directories, a crafted tree with duplicate symlink (120000) and directory (040000) entries sharing a leading component converts into index entries such as ['a' (SYMLINK), 'a/post-checkout' (SYMLINK)]; after 'a' is created as a symlink, processing 'a/post-checkout' reuses the cached 'a' prefix without re-running the intermediate-directory check, causing the symlink write to resolve through the just-created 'a' symlink and land outside the worktree. The upstream commit b62498378b8bc2c95863a044b700f2063b0b5875 adjusts the stack so terminal components are validated again even when cached, and references also point to gix-fs/src/stack.rs#L185-L196.

Know when Rust gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (vulncheck) PRIMARY 7.3 HIGH
CVSS:4.0/AV:L/AC:H/AT:P/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
vuln.today AI 7.0 HIGH

Local trigger via checkout of an attacker repo (AV:L, UI:R), high complexity to hit the prefix-reuse+forced-overwrite condition (AC:H), no auth (PR:N), and arbitrary file write chaining to code execution (C/I/A:H).

3.1 AV:L/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:H
4.0 AV:L/AC:H/AT:P/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
SUSE 6.5 MEDIUM
AV:L/AC:H/PR:N/UI:R/S:U/C:L/I:H/A:H
Red Hat 7.0 MEDIUM

Primary rating from Vendor (vulncheck).

CVSS VectorVendor: vulncheck

Attack Vector
Local
Attack Complexity
High
Attack Requirements
Present
Privileges Required
None
User Interaction
Passive
Vulnerable system: Confidentiality
High
Vulnerable system: Integrity
High
Vulnerable system: Availability
High
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

2
Patch available
Sep 25, 2026 - 23:19 EUVD
CVE Published
Sep 25, 2026 - 22:17 cve.org
HIGH 7.3

DescriptionCVE.org

gitoxide gix-fs before 0.23.0 contains a path validation bypass vulnerability in the worktree checkout mechanism that allows attackers to escape the worktree directory via symlink manipulation. During forced checkout with overwrite_existing enabled, attackers can craft malicious repository trees where symlink entries replace validated directories, causing subsequent files to be written outside the worktree through the symlink for code execution or file manipulation.

Technical POC Analysis

Advisory GHSA-6p9q-f2xg-6pr5 (package gix-fs, Rust).

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Executive ViewAI

Why It Matters

A vulnerability in gitoxide's gix-fs crate (versions before 0.23.0, with GHSA listing <=0.21.0) can allow a crafted repository to overwrite files outside the checkout area and potentially execute code on developer workstations or CI/CD runners during forced checkout with overwrite_existing. This creates a supply-chain and code-integrity risk for teams that process untrusted repositories, because an attacker could tamper with build hooks, credentials, or source artifacts. Leadership should prioritize tracking a vendor fix and interim controls for development and pipeline environments.

Business Impact: High
Compensating Controls

No vendor-released patch identified at time of analysis. Interim mitigations include avoiding forced checkout with overwrite_existing for untrusted repositories, disabling overwrite_existing where feasible, running checkouts in isolated least-privilege containers or sandboxes, restricting local access to trusted users, monitoring file systems and .git/hooks for unexpected modifications, and updating to gix-fs 0.23.0 or later when a vendor patch becomes available.

Threat Intelligence Overview

EPSS Score
0.1%
Top 97% exploitable
Prevalence
Medium
gitoxide is an increasingly adopted Rust Git implementation but niche versus git itself
Data Quality
8 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment MSRC Vendor GitHub VulDB

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.1%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
Poc
System Exposure· derived
Small
Automatable
No
Human Impact
High
Technical Impact
Total

Priority Score

36
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +36
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.

More in Rust

View all
CVE-2024-3566 CRITICAL POC
9.8 Apr 10

Command injection via Windows CreateProcess argument parsing affects multiple language runtimes and tooling (Node.js, PH

CVE-2021-31162 CRITICAL POC
9.8 Apr 14

In the standard library in Rust before 1.52.0, a double free can occur in the Vec::from_iter function if freeing the ele

CVE-2021-28879 CRITICAL POC
9.8 Apr 11

In the standard library in Rust before 1.52.0, the Zip implementation can report an incorrect size due to an integer ove

CVE-2026-58491 CRITICAL POC
9.3 Sep 21

Stored cross-site scripting and open redirect in Warpgate's SSO endpoints (versions prior to 0.25.5) allow an unauthenti

CVE-2021-29922 CRITICAL POC
9.1 Aug 07

library/std/src/net/parser.rs in Rust before 1.53.0 does not properly consider extraneous zero characters at the beginni

CVE-2026-77620 HIGH POC
8.7 Sep 22

Denial of service in the Vector observability pipeline's `logstash` source (versions 0.15.0 through 0.56.x) allows a rem

CVE-2019-12083 HIGH POC
8.1 May 13

The Rust Programming Language Standard Library 1.34.x before 1.34.2 contains a stabilized method which, if overridden, c

CVE-2021-28878 HIGH POC
7.5 Apr 11

In the standard library in Rust before 1.52.0, the Zip implementation calls __iterator_get_unchecked() more than once fo

CVE-2021-28875 HIGH POC
7.5 Apr 11

In the standard library in Rust before 1.50.0, read_to_end() does not validate the return value from Read in an unsafe c

CVE-2019-16760 HIGH POC
7.5 Sep 30

Cargo prior to Rust 1.26.0 may download the wrong dependency if your package.toml file uses the `package` configuration

CVE-2024-24576 CRITICAL POC
10.0 Apr 09

Rust is a programming language. Rated critical severity (CVSS 10.0), this vulnerability is remotely exploitable, no auth

CVE-2018-1000810 CRITICAL
9.8 Oct 08

The Rust Programming Language Standard Library version 1.29.0, 1.28.0, 1.27.2, 1.27.1, 127.0, 126.2, 126.1, 126.0 contai

Vendor StatusVendor

SUSE

Severity: Moderate
Product Status
SUSE Linux Enterprise Desktop 15 SP7 Not-Affected
SUSE Linux Enterprise Desktop 15 SP7 Not-Affected
SUSE Linux Enterprise Desktop 15 SP7 Not-Affected
SUSE Linux Enterprise Desktop 15 SP7 Not-Affected
SUSE Linux Enterprise Desktop 15 SP7 Not-Affected

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy