
VFS für Git ab95cf51 - Hoch - Remote - RCE - core.virtualfilesystem einfache Anführungszeichen umschließen
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vfs-quote-breakout
Klasse: RCE Reichweite: Remote
VFS for Git master ab95cf51 (Tag v2.0.26259.1) - Microsoft
CloneVerb.GetCloneRoot verwendet das letzte URL-Pfadsegment als Standard-Enlistment-Ordner und entfernt kein Anführungszeichen. RequiredGitConfig schreibt dann core.virtualfilesystem als naiven, einfach-quotierten Hook-Pfad. microsoft/git führt diesen Wert mit use_shell=1 aus. Der Produktkommentar nennt sogar bash.
Eine Clone-URL, deren letztes Segment pwn';witness;' lautet, wird zu 'C:/temp/pwn';witness;'/src/.git/hooks/GVFS.VirtualFileSystemHook.exe'. bash sieht drei Befehle. Der mittlere läuft als der Benutzer, der geklont hat.
| ID | noch keine CVE |
| Klasse | RCE (Single-Quote-Umhüllung von core.virtualfilesystem) |
| Reichweite | Remote (UI:R Clone einer Angreifer-URL oder lokales git worktree add unter einem präparierten Verzeichnis) |
| CWE | CWE-78, CWE-116 |
| CVSS | High: 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| Produkt | VFS for Git (benötigt microsoft/git) |
| Betroffen | master ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a (Tag v2.0.26259.1). Nur Windows. |
| Auth | Opfer klont eine Angreifer-URL (oder git worktree add unter einem präparierten Verzeichnis) |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1. how=gadget (keine Windows-VM / kein Live-ProjFS). |
Host-Code als der Benutzer, der geklont oder git ausgeführt hat. Nicht SYSTEM. Kein unauthentifizierter RCE, der „Opfer klont diese URL" überspringt.
| Privileg | Methode / Sink | Was es gewährt | Recon / Integrität / Verfügbarkeit | Lab-bewiesen oder abgeleitet |
|---|---|---|---|---|
| Den Namen des Enlistment-Ordners wählen | Letztes Pfadsegment von gvfs clone <url> ohne Ziel (CloneVerb.GetCloneRoot) | Verzeichnisname ist vom Angreifer gewählt. Windows erlaubt ' und ; | Integrität des Zielpfads | Lab-bewiesen am kopierten Ziel-Helper. URL .../pwn';witness;' wird zu C:\temp\pwn';witness;' |
Aus core.virtualfilesystem ausbrechen | RequiredGitConfig umhüllt "'" + ConvertPathToGitFormat(hook) + "'" | Konfigurationswert sind drei Shell-Token, kein einzelner Pfad | Integrität der git-Konfiguration | Lab-bewiesen. Umhüllung ist 'C:/temp/pwn';witness;'/src/.git/hooks/GVFS.VirtualFileSystemHook.exe' |
| Einen zusätzlichen Shell-Befehl als der Klonende ausführen | microsoft/git virtualfilesystem.c use_shell=1 (bash -c des Konfigurationswerts) | Beliebiger Host-Befehl als die UID des Klonenden | Integrität / Verfügbarkeit der Klon-Sitzung | Lab-bewiesen am Gadget. witness schrieb VFS-VFS-QUOTE-WITNESS. Erstes und drittes Token sind fehlende Pfade (rc 127) |
| Dieselbe Umhüllung bei worktree | Program.Worktree.cs -c core.virtualfilesystem="'<path>'" | Derselbe Ausbruch ohne Clone-URL | Integrität | Abgeleitet aus dem Pin-Quellcode. Nicht ausgeführt |
Wiederholung bei späterem git status / mount | InProcessMount.TrySetRequiredGitConfigSettings wendet die Umhüllung erneut an | Späteres git führt ebenfalls den feindlichen Wert per Shell aus | Integrität | Abgeleitet. Nicht ausgeführt |
Geschlossen bei diesem Überbleibsel: Live-ProjFS / Microsoft git / gvfs clone (dieser Host ist macOS; how=gadget). SYSTEM. Unauthentifizierter RCE, der „Opfer klont diese URL" überspringt. Ein Ziel, dessen Name kein ' enthält, und derselbe feindliche Pfad, umhüllt mit '\'', führen witness nicht aus.
Gleiche Pin-Überbleibsel: vfs-mount-dehydrate, vfs-clone-acl, vfs-service-sid, vfs-hook-impersonate, vfs-install-cwd.
Ich habe VFS for Git master ab95cf51 nach dem Merge vom 2026-09-28 gepinnt. Microsoft empfiehlt Scalar für neue Deployments. Der Tree ist weiterhin als v2.0.26259.1 getaggt. Die Skip-Liste ist CVE-2021-47874 (quotierter binPath bei diesem Pin). Zehn Jagden. ProjFS-Hydration, GPRE-Parser, Cache-URLs, FastFetch und gvfs upgrade kamen in dieser Messlatte leer zurück.
Dann blieb ich an RequiredGitConfig hängen. Der Kommentar dokumentiert bash. Die Umhüllung escaped ' nicht. CloneVerb verwendet das letzte URL-Segment als Ziel. Das ist das Überbleibsel.
Bereits festgehaltene Irrwege: ein Ziel ohne Anführungszeichen als den Bug zu behandeln (ist er nicht); SYSTEM zu behaupten; eine Reverse Shell. Theater. Native Windows fehlte, also ist das Lab ein Gadget aus dieser Umhüllung plus bash -c.
python3 vfs-quote-breakout-Abraxas-Labs.py
oder
cd lab
./run.sh
Gadget-HTTP auf 127.0.0.1:19630. Kopiert die Umhüllungs- und Ziel-Helper, dann /bin/bash -c mit auf einen witness-Helper beschränktem PATH, der das Orakel schreibt. Native Windows-VM war nicht verfügbar. Letzte Zeile verwendet how=gadget.
SUCCESS vfs-quote-breakout how=gadget who=cloner naive-breakout=yes escaped-hold=yes VFS-VFS-QUOTE-WITNESS
' als '\'' escapen, bevor umhüllt wird, oder use_shell nicht mehr verwenden und den Hook als argv[0] übergeben. Clone- und Worktree-Pfade ablehnen, die ' enthalten.
ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a (Tag v2.0.26259.1)CloneVerb.cs StandardzielRequiredGitConfig.cs Umhüllung, die ' nicht escapedvirtualfilesystem.c use_shell=1ImagePathGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.