{"id":"EUVD-2025-210908","revision":null,"records":[{"revision":"afcbb2f3c5d1422ea40a69ba0c37401e","observedAt":"2026-10-23T15:48:27.903+00:00","statement":{"source":"cve-program","id":"CVE-2025-24890","aliases":[],"title":"gix-sec safe.directory protections absent for elevated administrators","description":"gitoxide is an implementation of git written in Rust. Prior to 0.13.3, the gix-sec crate on Windows incorrectly treats repositories controlled by another user as trusted when an administrator runs a dependent program with an unfiltered elevated token. In gix-sec/src/identity.rs, gix_sec::identity::is_path_owned_by_current_user obtains folder_owner and token_owner, but its administrator-specific IsWellKnownSid and CheckTokenMembership checks examine the running token rather than confirming the directory owner. This bypasses safe.directory-style protection for repositories owned and configured by a limited user, allowing repository configuration or hooks to execute commands with the administrator's privileges when an affected operation is performed. Exploitation requires Windows, an elevated administrator, a program that relies on gix-sec trust results, and interaction with a repository controlled by another user. An unelevated UAC process is not affected, and cloning is not affected because repository configuration and hooks are not copied. This issue is fixed in version 0.13.3.","state":0,"publishedAt":"2026-09-14T15:28:03.22+00:00","modifiedAt":"2026-09-14T19:00:54.132+00:00","affected":[{"ecosystem":"Vendor product","name":"gitoxide","ranges":[],"versions":[],"rawVersionEvidence":"{\n                    \"vendor\": \"GitoxideLabs\",\n                    \"product\": \"gitoxide\",\n                    \"versions\": [\n                        {\n                            \"version\": \"< 0.13.3\",\n                            \"status\": \"affected\"\n                        }\n                    ]\n                }"}],"metrics":[{"system":"CVSS 3.1","vector":"CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:L","score":6.8,"severity":"MEDIUM"}],"references":["https://github.com/GitoxideLabs/gitoxide/security/advisories/GHSA-7rhf-42qf-vrvc","https://github.com/GitoxideLabs/gitoxide/pull/2510","https://github.com/GitoxideLabs/gitoxide/commit/39e37482d6f884bf4765dbe9c95a93dc2a92e559","https://github.com/GitoxideLabs/gitoxide/releases/tag/gix-sec-v0.13.3"],"sourceUrl":"https://www.cve.org/CVERecord?id=CVE-2025-24890","license":"CVE Program Terms of Use","key":"cve-program:CVE-2025-24890","identifiers":["CVE-2025-24890"]},"retained":false,"historicalAffected":[]},{"revision":"038c35f5ea5a42769a3d62aaa55f14bb","observedAt":"2026-11-09T02:15:28.997+00:00","statement":{"source":"euvd","id":"EUVD-2025-210908","aliases":["CVE-2025-24890","GHSA-7rhf-42qf-vrvc"],"title":"gitoxide is an implementation of git written in Rust. Prior to 0.13.3, the gix-sec crate on Windows incorrectly treats repositories controlled by another user as trusted when an administrator runs a dependent program with an unfiltered elev…","description":"gitoxide is an implementation of git written in Rust. Prior to 0.13.3, the gix-sec crate on Windows incorrectly treats repositories controlled by another user as trusted when an administrator runs a dependent program with an unfiltered elevated token. In gix-sec/src/identity.rs, gix_sec::identity::is_path_owned_by_current_user obtains folder_owner and token_owner, but its administrator-specific IsWellKnownSid and CheckTokenMembership checks examine the running token rather than confirming the directory owner. This bypasses safe.directory-style protection for repositories owned and configured by a limited user, allowing repository configuration or hooks to execute commands with the administrator's privileges when an affected operation is performed. Exploitation requires Windows, an elevated administrator, a program that relies on gix-sec trust results, and interaction with a repository controlled by another user. An unelevated UAC process is not affected, and cloning is not affected because repository configuration and hooks are not copied. This issue is fixed in version 0.13.3.","state":0,"publishedAt":null,"modifiedAt":null,"affected":[],"metrics":[{"system":"EUVD CVSS 3.1","vector":"CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:L","score":6.8,"severity":null}],"references":["https://github.com/GitoxideLabs/gitoxide/security/advisories/GHSA-7rhf-42qf-vrvc","https://github.com/GitoxideLabs/gitoxide/pull/2510","https://github.com/GitoxideLabs/gitoxide/commit/39e37482d6f884bf4765dbe9c95a93dc2a92e559","https://github.com/GitoxideLabs/gitoxide/releases/tag/gix-sec-v0.13.3"],"sourceUrl":"https://euvd.enisa.europa.eu/vulnerability/EUVD-2025-210908","license":"ENISA EUVD · source terms and attribution apply","enrichment":{"sourceStatus":null,"weaknesses":[],"productCriteria":[],"sourceDates":{"datePublished":"Sep 14, 2026, 3:28:03 PM","dateUpdated":"Sep 14, 2026, 7:00:54 PM"},"relatedAdvisories":[{"id":"msrc_CVE-2025-24890","title":"gix-sec safe.directory protections absent for elevated administrators","vulnerabilityIds":["CVE-2025-24890"]}],"note":"EUVD source date text has no stated timezone and is retained without inventing a UTC instant. Related bulletin membership is not an alias, common cause or applicability claim. A missing vector with a zero score is treated as unrated. Complete vendor/product and underlying source evidence remains in the original JSON."},"key":"euvd:EUVD-2025-210908","identifiers":["EUVD-2025-210908","CVE-2025-24890","GHSA-7rhf-42qf-vrvc"]},"retained":false,"historicalAffected":[]},{"revision":"e60b8767867646709490812431c8a680","observedAt":"2026-10-25T01:17:35.189+00:00","statement":{"source":"nvd","id":"CVE-2025-24890","aliases":[],"title":"gitoxide is an implementation of git written in Rust. Prior to 0.13.3, the gix-sec crate on Windows incorrectly treats repositories controlled by another user as trusted when an administrator runs a dependent program with an unfiltered elev…","description":"gitoxide is an implementation of git written in Rust. Prior to 0.13.3, the gix-sec crate on Windows incorrectly treats repositories controlled by another user as trusted when an administrator runs a dependent program with an unfiltered elevated token. In gix-sec/src/identity.rs, gix_sec::identity::is_path_owned_by_current_user obtains folder_owner and token_owner, but its administrator-specific IsWellKnownSid and CheckTokenMembership checks examine the running token rather than confirming the directory owner. This bypasses safe.directory-style protection for repositories owned and configured by a limited user, allowing repository configuration or hooks to execute commands with the administrator's privileges when an affected operation is performed. Exploitation requires Windows, an elevated administrator, a program that relies on gix-sec trust results, and interaction with a repository controlled by another user. An unelevated UAC process is not affected, and cloning is not affected because repository configuration and hooks are not copied. This issue is fixed in version 0.13.3.","state":0,"publishedAt":"2026-09-14T16:17:05.117+00:00","modifiedAt":"2026-10-14T19:10:00.297+00:00","affected":[],"metrics":[{"system":"CVSS 3.1 · security-advisories@github.com · Secondary","vector":"CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:L","score":6.8,"severity":"MEDIUM"}],"references":["https://github.com/GitoxideLabs/gitoxide/commit/39e37482d6f884bf4765dbe9c95a93dc2a92e559","https://github.com/GitoxideLabs/gitoxide/pull/2510","https://github.com/GitoxideLabs/gitoxide/releases/tag/gix-sec-v0.13.3","https://github.com/GitoxideLabs/gitoxide/security/advisories/GHSA-7rhf-42qf-vrvc"],"sourceUrl":"https://nvd.nist.gov/vuln/detail/CVE-2025-24890","license":"NIST NVD usage terms; underlying source attribution retained","enrichment":{"sourceStatus":"Deferred","weaknesses":["CWE-283"],"productCriteria":[],"sourceDates":{"published":"2026-09-14T16:17:05.117","lastModified":"2026-10-14T19:10:00.297"},"relatedAdvisories":[],"note":"NVD analysis and CPE criteria are source context, not proof that a package or your environment is affected. Complete affected data, logical configurations and SSVC are retained in the original JSON."},"key":"nvd:CVE-2025-24890","identifiers":["CVE-2025-24890"]},"retained":false,"historicalAffected":[]},{"revision":"59e2288ebcbd4d82bd0912544e3625bb","observedAt":"2026-10-24T13:19:54.901+00:00","statement":{"source":"osv","id":"GHSA-7rhf-42qf-vrvc","aliases":["CVE-2025-24890"],"title":"gix-sec safe.directory protections absent for elevated administrators","description":"### Summary\n\nIn 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.\n\n### Details\n\nIn 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](https://git-scm.com/docs/git.html#_security) 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.\n\nOn 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.\n\nCode 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.\n\nSpecifically, in `gix_sec::identity` the [implementation](https://github.com/GitoxideLabs/gitoxide/blob/main/gix-sec/src/identity.rs#L81) of `is_path_owned_by_current_user` for Windows [finds the owner of the directory](https://github.com/GitoxideLabs/gitoxide/blob/ffb73b5f69dbe86ff88f1c473af65f368a6bcbe5/gix-sec/src/identity.rs#L109-L121) (`folder_owner`), [finds the owner of the running thread or process](https://github.com/GitoxideLabs/gitoxide/blob/ffb73b5f69dbe86ff88f1c473af65f368a6bcbe5/gix-sec/src/identity.rs#L151-L189) (`token_owner`), checks cases of ownership not specific to administrators, then attempts to check the administrator-specific case with:\n\nhttps://github.com/GitoxideLabs/gitoxide/blob/ffb73b5f69dbe86ff88f1c473af65f368a6bcbe5/gix-sec/src/identity.rs#L197-L207\n\nThe [`IsWellKnownSid`](https://learn.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-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](https://learn.microsoft.com/en-us/windows/win32/secauthz/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.)\n\nThe [`CheckTokenMembership`](https://learn.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-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.)\n\n### PoC\n\nThese 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. \n\n#### Example 1: From inside a shared or user profile directory\n\nOn 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:\n\n```powershell\ngit init unsafe-repo\ncd unsafe-repo\ngit remote add origin ssh://localhost/repo.git\ngit config core.sshCommand 'calc.exe; ssh'\n```\n\nSwitch from the limited account to an administrative account. Then:\n\n1. If gitoxide is not installed, install it, such as with `cargo install gitoxide`.\n2. 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.)\n3. 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`.\n4. `cd` to the limited user's repository as created above.\n5. Run `gix fetch`. This runs the Windows calculator (the chosen payload).\n\n#### Example 2: From anywhere\n\nOn 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:\n\n```powershell\ncd C:\\\ngit init\ngit -c safe.directory=. remote add origin ssh://localhost/repo.git\ngit -c safe.directory=. config core.sshCommand 'calc.exe; ssh'\n```\n\n(`-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.)\n\u00A0\nThe 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.\n\nSwitch 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.\n\n### Impact\n\nA user is affected only when *all* of the following apply:\n\n- The operating system is Windows.\n- The user is a member of the `Administrators` group.\n- 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.)\n- The program uses and relies on information from `gix-sec` about what directories to trust.\n- The program interacts with a repository owned by, and set up or controlled by, another user.\n\nThen 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.\n\nA 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.\n\nThe specific attack of making the root of the system drive a repository resembles [CVE-2022-24765](https://github.com/git-for-windows/git/security/advisories/GHSA-vw2c-22j4-2fh2). The workarounds presented there do not work around this vulnerability in full, but would prevent that kind of attack.","state":0,"publishedAt":"2026-09-09T16:34:35+00:00","modifiedAt":"2026-09-09T17:06:56.644729+00:00","affected":[{"ecosystem":"crates.io","name":"gix-sec","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"0.13.3"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V3","vector":"CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:L","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"MODERATE"}],"references":["https://github.com/GitoxideLabs/gitoxide/security/advisories/GHSA-7rhf-42qf-vrvc","https://github.com/GitoxideLabs/gitoxide/commit/39e37482d6f","https://github.com/GitoxideLabs/gitoxide"],"sourceUrl":"https://github.com/advisories/GHSA-7rhf-42qf-vrvc","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-7rhf-42qf-vrvc","identifiers":["GHSA-7rhf-42qf-vrvc","CVE-2025-24890"]},"retained":false,"historicalAffected":[]}],"coverage":[{"source":"cisa-kev:global","scope":"Complete CISA KEV catalog; all vendors. Missing entries do not establish absence of exploitation.","generation":"2026-11-10T01:13:24.0914870+00:00","complete":true,"records":1773,"lastAttemptAt":"2026-11-10T01:13:24.091487+00:00","lastSuccessAt":"2026-11-10T01:13:24.2413995+00:00","error":null,"lastVerifiedAt":"2026-11-10T01:13:24.2414074+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"cve-program","scope":"Official CVE Program baseline and cumulative hourly delta; all vendors, published and rejected records","generation":"cve-8859cf40d4337e24bd2f258cc7778fbad01bb24c79d057aaf34cf1dfc6f8917d-8739c76e681f900923b900c9df0ef75cf421d39cabb54650c4b9ad19b6a76d85","complete":true,"records":421793,"lastAttemptAt":"2026-11-10T01:11:09.1191281+00:00","lastSuccessAt":"2026-11-10T01:11:09.1151136+00:00","error":null,"lastVerifiedAt":"2026-11-10T01:11:09.1191281+00:00","snapshotPublishedAt":"2026-11-10T00:36:51+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"euvd","scope":"Rolling EUVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global EUVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-f74695add7cb411a92a8bb5cd1e5c310","complete":false,"records":13689,"lastAttemptAt":"2026-11-10T01:21:31.8742747+00:00","lastSuccessAt":"2026-11-10T01:21:31.9316089+00:00","error":null,"lastVerifiedAt":"2026-11-10T01:21:31.9316089+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"first-epss:nuget","scope":"FIRST EPSS for explicit CVE aliases in the collected public NuGet archive. Not a global EPSS backfill.","generation":"2026-11-10T01:13:24.0914870+00:00","complete":true,"records":1096,"lastAttemptAt":"2026-11-10T01:13:24.091487+00:00","lastSuccessAt":"2026-11-10T01:13:24.2423035+00:00","error":null,"lastVerifiedAt":"2026-11-10T01:13:24.2423037+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"nvd","scope":"Rolling NVD lookups of CVE aliases in current public OSV archives; 500 identifiers per refresh, rechecked after 48 hours. Not a global NVD catalog. Successful not-found lookups count as checked; they do not imply withdrawal or safety. No reader inventory is sent.","generation":"enrichment-ac4cdedb469b4d498dab4cba0976e3b8","complete":false,"records":13695,"lastAttemptAt":"2026-11-10T01:13:50.7927629+00:00","lastSuccessAt":"2026-11-10T01:13:50.789+00:00","error":null,"lastVerifiedAt":"2026-11-10T01:13:50.789+00:00","snapshotPublishedAt":null,"importing":false,"stagedRecords":0,"checkedIdentifiers":13704,"expectedIdentifiers":13742,"failedIdentifiers":0},{"source":"osv:Go","scope":"Complete OSV Go ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"go-cdffb4589856378aa42e8d1bd4a6c74e27a180d8160bf764c44715ef760f0a62","complete":true,"records":9932,"lastAttemptAt":"2026-11-10T01:13:23.6725967+00:00","lastSuccessAt":"2026-11-10T00:04:19.8260565+00:00","error":null,"lastVerifiedAt":"2026-11-10T01:13:23.6725967+00:00","snapshotPublishedAt":"2026-11-09T23:48:01+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:NuGet","scope":"Complete OSV NuGet ecosystem archive, including GitHub Advisory Database records; NuGet version matching only","generation":"nuget-26503967ae4379db8f374089589d6e03fb15bd31f820c9e992aaf93840c2236c","complete":true,"records":1971,"lastAttemptAt":"2026-11-10T01:11:09.2602471+00:00","lastSuccessAt":"2026-11-09T21:02:20.472473+00:00","error":null,"lastVerifiedAt":"2026-11-10T01:11:09.2602471+00:00","snapshotPublishedAt":"2026-11-09T20:18:18+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:crates.io","scope":"Complete OSV crates.io ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"crates.io-761ecc9061239b0da572dc9254c6f384c1d19339eb08408c436647a2f26129e9","complete":true,"records":3064,"lastAttemptAt":"2026-11-10T01:13:24.0606038+00:00","lastSuccessAt":"2026-11-09T17:05:03.4044794+00:00","error":null,"lastVerifiedAt":"2026-11-10T01:13:24.0606038+00:00","snapshotPublishedAt":"2026-11-09T16:33:20+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null},{"source":"osv:npm","scope":"Complete OSV npm ecosystem archive, including withdrawn and malicious-package source records; statement counts are not unique CVE counts","generation":"npm-de491e92084daab7829a905b7af7daf62c5cba9f53efe3052c21cec43e90d59a","complete":true,"records":231581,"lastAttemptAt":"2026-11-10T01:13:22.923251+00:00","lastSuccessAt":"2026-11-10T01:13:21.102106+00:00","error":null,"lastVerifiedAt":"2026-11-10T01:13:22.923251+00:00","snapshotPublishedAt":"2026-11-10T00:48:12+00:00","importing":false,"stagedRecords":0,"checkedIdentifiers":null,"expectedIdentifiers":null,"failedIdentifiers":null}]}