Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Submit
ToolsExploitsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

FeedsContactPrivacy© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
vfs-mount-dehydrate — VFS for Git ab95cf51 - High - Local - Privilege leftover - Users mount pipe dehydrate/unmount | Kitploit
Tools/GitHubGitHub/abraxas/vfs-mount-dehydrate
Privilege EscalationVulnerability AnalysisExploitation
GitHubabraxas/vfs-mount-dehydrate

vfs-mount-dehydrate

VFS for Git ab95cf51 - High - Local - Privilege leftover - Users mount pipe dehydrate/unmount

View Repository
54 days agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

Abraxas Labs - vfs-mount-dehydrate

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  vfs-mount-dehydrate

vfs-mount-dehydrate

Class: Privilege leftover Reach: Local

VFS for Git master ab95cf51 (tag v2.0.26259.1) - Microsoft

CreatePipeByName on the per-enlistment mount pipe grants BUILTIN\Users ReadWrite | CreateNewInstance. There is no owner SID check and no ImpersonateNamedPipeClient. HandleDehydrateFolders Path.Combines attacker folder names and feeds git via ProcessStartInfo.Arguments. The CLI dehydrate path runs IsFolderValid. The mount handler does not.

Anyone in Users who can guess \\.\pipe\GVFS_<ENLISTMENT> can unmount ProjFS, move directories as the mount user, and force git reset HEAD --hard.

IDno CVE yet
ClassPrivilege leftover (named-pipe ACL) / path traversal / argument injection
ReachLocal
CWECWE-284, CWE-22, CWE-88
CVSSHigh: 7.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
ProductVFS for Git
Affectedmaster ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a; installer tags v2.0.26229.1 / v2.0.26259.1. Windows only.
AuthLocal. Any BUILTIN\Users principal while the victim has a mount
LicenseGNU Affero GPL v3.0
Lab127.0.0.1 only. how=gadget (no Windows VM / live ProjFS).

Pipe protocol: UTF-8 Header or Header|body, terminated by byte 0x03. Pipe name is GVFS_ + uppercased enlistment root with : replaced by _ (example C:\Repos\Foo -> \\.\pipe\GVFS_C_\REPOS\FOO).

What an attacker can do

Victim has gvfs mount at a known root. Attacker is another Users principal on the same machine. Integrity and availability as the victim. Not SYSTEM. Not a shell by itself.

PrivilegeMethod / sinkWhat it grantsRecon / integrity / availabilityLab-proven or inferred
Connect to the victim mount pipeCreatePipeByName ACL BuiltinUsers ReadWrite | CreateNewInstance; no owner checkTalk the mount IPCRecon of the pipeLab-proven (gadget ACL). Attacker SID accepted; owner-only mode returns connect-denied
Read enlistment path, cache path, RepoUrlGetStatusLeak the root used for leftover #1 / #4ReconLab-proven. Status JSON included RepoUrl and GVFS_C_\REPOS\FOO
Unmount ProjFS and exit gvfs.mountmessage UnmountTake the enlistment downAvailabilityLab-proven. Replies Ack then Complete; mount state Unmounted
Unmount on a parse failureReleaseLock with empty body -> RequestData == null -> UnmountAndStopWorkingDirectoryCallbacks + Environment.ExitSame unmount plus process exitAvailabilityLab-proven. Empty ReleaseLock| unmounted
Discard the victim working treeDehydrate|{"Folders":"--hard",...}. movedFolders.Add even if the source dir is missing. Reset("HEAD", "\"--hard\" ") becomes git reset HEAD --hard after quote stripDestroy dirty tracked filesIntegrity / availabilityLab-proven. Dirty tracked file lost the witness string
Move a folder out of the worktree as the victimPath.Combine(WorkingDirectoryBackingRoot, folder) + MoveDirectory to BackupFolderPathSteal / relocate a worktree folderIntegrityLab-proven. keepme left src and appeared under the attacker backup path
Traverse .. (CLI IsFolderValid is not used)same Combine; ..\secretMove a sibling the mount user can writeIntegrityLab-proven. Sibling secret landed under the attacker backup path. Applying IsFolderValid blocked it
Steal or destroy other victim-writable directoriessame move with a ..\ chain that resolves outside the enlistmentBroader move as the mount userIntegrityInferred from Combine. This lab uses a throwaway tree only
Code exec as the victimthis pipeProcess create of attacker imageIntegrityClosed. No process create of attacker image on this leftover (see vfs-service-sid and vfs-hook-impersonate)
SYSTEMmount IPCLocalSystemIntegrityClosed. Mount runs as the enlistment user

--hard is not a .. path. CLI IsFolderValid still allows it. A fix must also reject option-like folder names.

Same pin leftovers: vfs-quote-breakout, vfs-clone-acl, vfs-service-sid, vfs-hook-impersonate, vfs-install-cwd.

How I found it

I pinned VFSForGit master ab95cf51 after the 2026-09-28 merge. The service pipe and the per-enlistment mount pipe share CreatePipeByName. Dehydrate on the CLI validates folders. The mount handler does not.

Wrong turns already recorded: treating --hard as a path traversal (it is argument injection after quote strip); claiming SYSTEM; a reverse shell. Theatre. Native Windows was missing, so the lab is a gadget of those functions plus a throwaway git tree.

Lab

python3 vfs-mount-dehydrate-Abraxas-Labs.py

or

cd lab
./run.sh

Gadget HTTP on 127.0.0.1:19640 speaking the pipe message shape. Throwaway git tree inside the container. No reverse shell. No real profile path. Last line uses how=gadget.

SUCCESS vfs-mount-dehydrate how=gadget unmount=yes reset-hard=yes dirty-gone=yes move-inside=yes move-dotdot=yes pipe-acl=users-no-owner is-folder-valid-not-on-pipe=yes VFS-MOUNT-DEHYDRATE-WITNESS

The fix

Restrict CreatePipeByName to the enlistment owner SID plus LocalSystem. Drop CreateNewInstance for Users. Impersonate the client and require owner. Replicate IsFolderValid in HandleDehydrateFolders and reject names that look like git options. Do not treat ReleaseLock parse failure as process exit.

References

Download Tool