Skip to main content

gitoxide gix-sec EUVDEUVD-2025-210908

| CVE-2025-24890 MEDIUM
Unverified Ownership (CWE-283)
2026-09-09 https://github.com/GitoxideLabs/gitoxide GHSA-7rhf-42qf-vrvc
6.8
CVSS 3.1 · Vendor: https://github.com/GitoxideLabs/gitoxide
View

Attack ChainAIDerived

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

  1. Access
    Limited user creates .git repo in shared/system location
  2. Delivery
    Injects malicious core.sshCommand into repo config
  3. Exploit
    Admin launches gitoxide tool with UAC elevation
  4. Execution
    gix-sec calls IsWellKnownSid/CheckTokenMembership on process SID instead of directory SID
  5. Persist
    All directories unconditionally trusted
  6. Impact
    Attacker payload executes with Administrator privileges

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Ownership verification
Exploitation Conditions

All of the following conditions must hold simultaneously: (1) the operating system is Windows; (2) the victim's gitoxide-backed process runs with an unfiltered administrative token - this occurs when the user is a member of the Administrators group and either uses UAC elevation or has UAC disabled entirely; (3) the attacker holds a limited local account on the same system and has pre-staged a Git repository with malicious core.sshCommand or hook configuration in a location the admin will traverse (a shared directory, the user profile tree, or the root of the system drive); (4) the victim application uses gix-sec to make directory trust decisions. Exploitation is prevented if the admin runs the application unelevated (filtered token), since the Administrators-group ownership branch is never entered. The attack does not apply to cloning operations because cloning does not copy repository configuration or hooks into the local clone.

Impact

The provided CVSS 6.8 (AV:L/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:L) is well-calibrated. The local attack vector is accurate: the attacker must hold an existing limited account on the target Windows system and pre-stage a malicious repository before the administrator interacts with it. UI:R is real but the advisory's second example - poisoning C:\ itself, affecting any gitoxide invocation anywhere on the system drive - reduces the practical friction of triggering that interaction. In environments where custom shell prompts or editor integrations silently query repository state, even a mid-sized municipal IT team in zabrze running gitoxide-backed tooling could trigger the payload without any obvious user-initiated repository action. A working PoC is provided in the GHSA advisory, meaning exploitation skill requirements are minimal for any local adversary. No EPSS data was supplied and the CVE does not appear in CISA KEV, so widespread automated exploitation is not confirmed; the risk is meaningfully elevated for mixed-privilege Windows environments where gitoxide or applications embedding gix-sec are deployed alongside untrusted local users.

Exploit ScenarioDerived

A limited Windows user initializes C:\ as a Git repository and edits C:\.git\config to set core.sshCommand to an arbitrary payload such as calc.exe. Later, an administrator opens an elevated PowerShell session and runs gix fetch from any directory on the C:\ drive that is not inside a separate repository. Because gix-sec's broken ownership check unconditionally trusts all directories for elevated processes, gitoxide treats C:\.git as fully trusted and spawns the attacker-specified sshCommand with full administrative privileges. A working proof-of-concept demonstrating this and a variant using shared user-profile directories is included verbatim in the GHSA advisory.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.2% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Sep 09, 2026

Broken Windows directory-ownership verification in gix-sec (gitoxide's trust enforcement crate) causes all filesystem paths to be unconditionally trusted when the process runs with an unfiltered administrative token, nullifying safe.directory protections. Versions 0.13.2 and earlier of gix-sec contain a logic inversion in is_path_owned_by_current_user: the administrator-specific branch checks the SID of the running process against the Administrators group rather than checking the SID of the target directory, so both IsWellKnownSid and CheckTokenMembership always return true for elevated processes regardless of who actually owns the directory. A local limited-privilege attacker can plant a malicious Git repository (configuring core.sshCommand or hooks) in a shared or system-root location and trigger arbitrary code execution with full administrative rights when any admin-level gitoxide-backed operation encounters that path. No CISA KEV listing is present, but a working proof-of-concept is included in the GHSA advisory.

RemediationAI

Upgrade gix-sec to version 0.13.3 or later, which corrects the ownership comparison to use folder_owner in both the IsWellKnownSid and CheckTokenMembership calls and properly handles UAC linked-token scenarios. Downstream Rust crates and applications with transitive dependencies on gix-sec should update their Cargo.lock and rebuild. The patch commit is available at https://github.com/GitoxideLabs/gitoxide/commit/39e37482d6f and the advisory is at https://github.com/GitoxideLabs/gitoxide/security/advisories/GHSA-7rhf-42qf-vrvc. Where immediate upgrading is not feasible, administrators should avoid running gitoxide-based tools with UAC elevation - operating with a filtered token (standard non-elevated session) prevents the vulnerable code path from triggering entirely, since the flaw only activates when the process carries an unfiltered administrative token. Additionally, auditing and removing attacker-plantable .git directories from world-writable or shared locations (C:\Users\Public, the root of the system drive) limits the attack surface for the second exploit scenario. Ensuring UAC remains enabled and that administrators do not disable it provides a meaningful compensating control; disabling UAC or habitually running as a full administrator without elevation prompts removes this partial protection.

Affected VersionsENISA

gitoxide < 0.13.3

Affected Packages

cargo gix-sec fix: 0.13.3
euvd gitoxide fix: 0.13.3

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 2 packages in cargo, euvd

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

Technical ContextAI · show details

gix-sec is the security and trust crate within the gitoxide project, a Rust-based reimplementation of Git. Its is_path_owned_by_current_user function enforces safe.directory-style protections by verifying that the calling user owns a repository's directory before allowing potentially dangerous configured operations (hooks, core.sshCommand, etc.) to execute. On Windows, ownership semantics differ from Unix: elevated admin processes create objects owned by the Administrators group SID, not the individual user SID. The function is supposed to handle this by checking whether the directory itself is owned by the Administrators group. Instead, both the IsWellKnownSid call and the CheckTokenMembership call reference token_owner (the SID of the running process/thread) rather than folder_owner (the SID owning the target directory). Because any elevated admin process is itself owned by the Administrators group, both checks trivially return true for every directory. CWE-283 (Unverified Ownership) precisely classifies the root cause: ownership verification is applied to the wrong object. The fix in commit 39e37482d6f corrects the calls to use folder_owner and additionally handles UAC linked-token scenarios to correctly evaluate membership for the full administrative token.

Know when the next one hits your stack

  • 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 (https://github.com/GitoxideLabs/gitoxide) PRIMARY 6.8 MEDIUM
AV:L/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:L
vuln.today AI 6.8 MEDIUM

Attacker needs a local limited account (PR:L); admin must actively invoke gitoxide (UI:R); code executes within admin process scope with no further scope change (S:U).

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

Primary rating from Vendor (https://github.com/GitoxideLabs/gitoxide).

CVSS VectorVendor: https://github.com/GitoxideLabs/gitoxide

Attack Vector
Local
Attack Complexity
Low
Privileges Required
Low
User Interaction
Required
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
Low

DescriptionCVE.org

Summary

In a process run with full administrative rights on Windows, gix-sec wrongly treats all locations as trusted, leading to the execution of commands configured in repositories controlled by limited user accounts.

Details

In a similar way to Git, gitoxide tries to avoid operating in local repositories that it neither considers to be owned by the current user nor finds to match any value of safe.directory. This is because of the numerous commands that can be configured for a Git repository, to run as part of various actions, some of which even occur automatically due to the way custom shell prompts and text editors update their knowledge of repositories.

On Unix-like operating systems, every directory is considered to be owned by some user ID. On Windows, other identities can own a directory in the same sense that a user can, and directories created while operating with full administrative rights default to being owned by the Administrators group, not the specific user. Such administrators should be able to use what are, conceptually, their own repositories. So Git considers administrators (when operating this way) to own them.

Code in gix-sec intends to implement a similar check. But after finding that it is run with an administrative token, it needs to check if the directory is owned by the Administrators group, yet instead accidentally examines *itself* again, rather than the directory.

Specifically, in gix_sec::identity the implementation of is_path_owned_by_current_user for Windows finds the owner of the directory (folder_owner), finds the owner of the running thread or process (token_owner), checks cases of ownership not specific to administrators, then attempts to check the administrator-specific case with:

https://github.com/GitoxideLabs/gitoxide/blob/ffb73b5f69dbe86ff88f1c473af65f368a6bcbe5/gix-sec/src/identity.rs#L197-L207

The IsWellKnownSid call checks if the owner of the current thread or process is the Administrators group. By default, operations carried out when running as an administrator with UAC elevation--or using an administrative account for which UAC is turned off altogether--create not just files and directories with the Administrators group as the owner, but other securable objects as well, including processes and threads. So this check returns true. (Based on the comment, it may be that this was really meant to check if the *directory* is owned by an administrator. But nothing related to the directory appears in this check.)

The CheckTokenMembership call checks if the owner of the current thread or process is an identity enabled in the access token represented by the token handle of NULL, passed as 0. But a token handle of NULL represents the running thread. Consequently, if we have gotten this far--which happens when running with full administrative rights--in nearly all situations this will return true as well. (Based on the message, it may be that this was really meant to check if the user is an *administrator*. But nothing related to the Administrators group appears in this check.)

PoC

These examples use gix fetch for simplicity, but some other actions implemented in gitoxide are vulnerable, as well as any provided by applications that rely on the results of gix-sec checks.

Example 1: From inside a shared or user profile directory

On Windows, running as a limited user account, create a repository in a shared location like C:\Users\Public, or even within the limited user's user profile directory. Configure a fake (or, if preferred, real) remote and a value of core.sshCommand that runs an arbitrary payload. For example, in PowerShell:

powershell
git init unsafe-repo
cd unsafe-repo
git remote add origin ssh://localhost/repo.git
git config core.sshCommand 'calc.exe; ssh'

Switch from the limited account to an administrative account. Then:

  1. If gitoxide is not installed, install it, such as with cargo install gitoxide.
  2. Run PowerShell with UAC elevation, so that it and processes started in it have an unfiltered token. (If UAC is turned off for this account, then just run PowerShell normally.)
  3. This example will not work if the GIT_SSH_COMMAND environment variable is set. It is not usually set, but if it may be, you can unset it in the current shell environment by running $env:GIT_SSH_COMMAND = $null.
  4. cd to the limited user's repository as created above.
  5. Run gix fetch. This runs the Windows calculator (the chosen payload).
Example 2: From anywhere

On Windows, even limited user accounts can create directories in the root of the system drive. As a limited user--and assuming the system drive is C:--initialize C:\ itself as a repository. Set up the repository to run the payload, either by editing C:\.git\config manually, or by running the git remote and git config commands from example 1 but passing -c safe.directory=.. The second approach is as follows:

powershell
cd C:\
git init
git -c safe.directory=. remote add origin ssh://localhost/repo.git
git -c safe.directory=. config core.sshCommand 'calc.exe; ssh'

(-c safe.directory=. keeps git from refusing to run the git remote and git config commands on the repository it has just created, whose .git directory is under its control but whose working tree is not.)

The entire system drive is now a Git repository due to the presence of C:\.git. The limited user owns this .git directory and controls the configuration in it. Normally safe.directory protections keep this from being a problem. But they are ineffective for administrators running applications (such as the gix command) that use gix-sec to enforce those protections.

Switch from the limited account to an administrative account. Follow the instructions for the administrator from example 1, except do so from *any* directory anywhere on the C: drive that is not in its own repository. Unless GIT_CEILING_DIRECTORIES is set in such a way that keeps C:\ from being considered, running gix fetch again runs the Windows calculator. This happens even if the command is run from inside the administrator's own user profile directory.

Impact

A user is affected only when *all* of the following apply:

  • The operating system is Windows.
  • The user is a member of the Administrators group.
  • The program is run with the user's unfiltered token. This happens when UAC is enabled and the user runs the program with UAC elevation, as well as when UAC is disabled. (Running as an administrator but enabling UAC and running the program unelevated is sufficient to avoid this vulnerability.)
  • The program uses and relies on information from gix-sec about what directories to trust.
  • The program interacts with a repository owned by, and set up or controlled by, another user.

Then operations that would run code present in a repository's configuration or hooks when the repository is trusted will be performed in any repository. These operations often require user interaction. But this interaction may not seem to the user like it involves operations on a repository, if it is performed as part of a custom prompt for a shell, or by other software that integrates with repositories. It may also not seem like it involves operation on files controlled by another user, such as when the repository is the root of the system drive.

A malicious user with a limited account on the system may therefore be able to arrange for an administrator to run arbitrary code. However, this vulnerability does not affect cloning repositories or using repositories one has cloned, because cloning does not copy configuration and hooks into the local repository.

The specific attack of making the root of the system drive a repository resembles CVE-2022-24765. The workarounds presented there do not work around this vulnerability in full, but would prevent that kind of attack.

Threat Intelligence Overview

EPSS Score
0.2%
Top 95% exploitable
Prevalence
Low
niche Rust Git implementation, not mainstream enterprise tooling
Threat Intel
1
1 sources
Exploit
POC
Public exploit code exists
Data Quality
6 sources
Confidence: High

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 MEDIUM
CISA KEV No
Public POC Yes
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.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· derived
Defer
Exploitation· derived
Poc
System Exposure· derived
Small
Automatable· derived
No
Human Impact· derived
Medium

Priority Score

54
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +34
PoC: +20
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.

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