Skip to content
Heist/ feed
HighFix available

gix-fs: Symlink prefix-reuse allows worktree escape during checkout

Type: advisorySource: OSV1 source record

### Summary A malicious tree can be constructed that will, when checked out with gitoxide, permit writing an attacker-controlled symlink into any existing directory the user has write access to. ### Details During checkout, all symlink index entries are deferred and created after regular files using a single shared `gix_worktree::Stack`. Internally, this uses a `gix_fs::Stack`. `gix_fs::Stack::make_relative_path_current()` caches validated path prefixes: when the previously-processed leaf component exactly matches the leading component(s) of the next path, the leaf-to-directory transition at `gix-fs/src/stack.rs:195-197` invokes only `delegate.push_directory()`, never `delegate.push()`. In `gix_worktree::stack::delegate::StackDelegate`, when the state member is `State::CreateDirectoryAndAttributesStack`, `Attributes::push_directory()` only loads attributes (from the ODB, in the clone case), and does not perform any other checks. The on-disk `symlink_metadata()` check and unlink-on-collision live in `StackDelegate::push()`'s invocation of `create_leading_directory()`, which is therefore bypassed for the cached prefix. The final symlink is created with plain `std::os::unix::fs::symlink`, which follows symlinks in parent directories. Therefore, it's possible to provide a tree with duplicate symlink and directory entries that exploits this. If a tree is constructed with: 1. A `120000` (symlink) entry `a` that points to `.git/hooks`. 2. A `040000` (directory) entry `a` with a subt

Announced Group revision 1
Original source ↗

GHSA-f89h-2fjh-2r9q

Primary source · Revision 1

Imported from structured advisory data. Source references identify upstream records or fields; verify affected versions and your deployed configuration.

Security context

Source reference: osv:GHSA-f89h-2fjh-2r9q

gix-fs

Source reference: /affected/0/package/name

Affected versions
Not stated in this record
Fixed versions
0.21.1

Source reference: /affected/0/ranges

Prerequisites
Not stated in this record

Structured affected-version data

Original package identities and version rules from this source.

[
  {
    "ranges": [
      {
        "type": "SEMVER",
        "events": [
          {
            "introduced": "0"
          },
          {
            "fixed": "0.21.1"
          }
        ]
      }
    ],
    "package": {
      "name": "gix-fs",
      "purl": "pkg:cargo/gix-fs",
      "ecosystem": "crates.io"
    },
    "database_specific": {
      "source": "https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/05/GHSA-f89h-2fjh-2r9q/GHSA-f89h-2fjh-2r9q.json",
      "last_known_affected_version_range": "<= 0.21.0"
    }
  }
]
Related CVEs
CVE-2026-44471

Source reference: /aliases

Publisher severity

high

Source reference: /database_specific/severity

Event
#18963 · Revision 1
Added to Heist Feed
Publisher date
Read the original announcement