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-quote-breakout — VFS for Git ab95cf51 - High - Remote - RCE - core.virtualfilesystem single-quote wrap | Kitploit
Tools/GitHubGitHub/abraxas/vfs-quote-breakout
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingCommand and ControlPapers & ResearchPayload Development
GitHubabraxas/vfs-quote-breakout

vfs-quote-breakout

VFS for Git ab95cf51 - High - Remote - RCE - core.virtualfilesystem single-quote wrap

View Repository
84 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-quote-breakout

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

vfs-quote-breakout

Class: RCE Reach: Remote

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

CloneVerb.GetCloneRoot takes the last URL path segment as the default enlistment folder and does not strip a quote. RequiredGitConfig then writes core.virtualfilesystem as a naive single-quoted hook path. microsoft/git runs that value with use_shell=1. The product comment even names bash.

A clone URL whose last segment is pwn';witness;' becomes 'C:/temp/pwn';witness;'/src/.git/hooks/GVFS.VirtualFileSystemHook.exe'. bash sees three commands. The middle one runs as the user who cloned.

IDno CVE yet
ClassRCE (single-quote wrap of core.virtualfilesystem)
ReachRemote (UI:R clone of an attacker URL, or local git worktree add under a crafted dir)
CWECWE-78, CWE-116
CVSSHigh: 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
ProductVFS for Git (needs microsoft/git)
Affectedmaster ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a (tag v2.0.26259.1). Windows only.
AuthVictim clones an attacker URL (or git worktree add under a crafted dir)
LicenseGNU Affero GPL v3.0
Lab127.0.0.1 only. how=gadget (no Windows VM / live ProjFS).

What an attacker can do

Host code as the user who cloned or ran git. Not SYSTEM. Not unauthenticated RCE that skips "victim clones this URL."

PrivilegeMethod / sinkWhat it grantsRecon / integrity / availabilityLab-proven or inferred
Choose the enlistment folder nameLast path segment of gvfs clone <url> with no dest (CloneVerb.GetCloneRoot)Directory name is attacker-chosen. Windows allows ' and ;Integrity of dest pathLab-proven on the copied dest helper. URL .../pwn';witness;' becomes C:\temp\pwn';witness;'
Break out of core.virtualfilesystemRequiredGitConfig wrap "'" + ConvertPathToGitFormat(hook) + "'"Config value is three shell tokens, not one pathIntegrity of git configLab-proven. Wrap is 'C:/temp/pwn';witness;'/src/.git/hooks/GVFS.VirtualFileSystemHook.exe'
Run an extra shell command as the clonermicrosoft/git virtualfilesystem.c use_shell=1 (bash -c of the config value)Arbitrary host command as the cloner UIDIntegrity / availability of the cloner sessionLab-proven on the gadget. witness wrote VFS-VFS-QUOTE-WITNESS. First and third tokens are missing paths (rc 127)
Same wrap on worktreeProgram.Worktree.cs -c core.virtualfilesystem="'<path>'"Same breakout without a clone URLIntegrityInferred from pin source. Not executed
Repeat on later git status / mountInProcessMount.TrySetRequiredGitConfigSettings re-applies the wrapLater git also shells the hostile valueIntegrityInferred. Not executed

Closed on this leftover: live ProjFS / Microsoft git / gvfs clone (this host is macOS; how=gadget). SYSTEM. Unauthenticated RCE that skips "victim clones this URL". A dest whose name has no ', and the same hostile path wrapped with '\'', do not run witness.

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

How I found it

I pinned VFS for Git master ab95cf51 after the 2026-09-28 merge. Microsoft recommends Scalar for new deployments. The tree is still tagged v2.0.26259.1. The skip list is CVE-2021-47874 (quoted binPath on this pin). Ten hunts. ProjFS hydration, GPRE parsers, cache URLs, FastFetch, and gvfs upgrade came back empty in this bar.

Then I sat on RequiredGitConfig. The comment documents bash. The wrap does not escape '. CloneVerb uses the last URL segment as the dest. That is the leftover.

Wrong turns already recorded: treating a dest with no quote as the bug (it is not); claiming SYSTEM; a reverse shell. Theatre. Native Windows was missing, so the lab is a gadget of that wrap plus bash -c.

Lab

python3 vfs-quote-breakout-Abraxas-Labs.py

or

cd lab
./run.sh

Gadget HTTP on 127.0.0.1:19630. Copies the wrap and dest helpers, then /bin/bash -c with PATH limited to a witness helper that writes the oracle. Native Windows VM was not available. Last line uses how=gadget.

SUCCESS vfs-quote-breakout how=gadget who=cloner naive-breakout=yes escaped-hold=yes VFS-VFS-QUOTE-WITNESS

The fix

Escape ' as '\'' before wrapping, or stop using use_shell and pass the hook as argv[0]. Reject clone and worktree paths that contain '.

References

  • github.com/microsoft/VFSForGit master ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a (tag v2.0.26259.1)
  • CloneVerb.cs default dest
  • RequiredGitConfig.cs wrap that does not escape '
  • microsoft/git virtualfilesystem.c use_shell=1
  • Nearby patched (not this wrap): CVE-2021-47874 unquoted ImagePath
  • CWE-78 · CWE-116

License

GNU Affero GPL v3.0. See LICENSE. Loopback lab only. No warranty.

Download Tool