
VFS para Git ab95cf51 - Alta - Remoto - RCE - core.virtualfilesystem envolto em aspas simples
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vfs-quote-breakout
Classe: RCE Alcance: Remoto
VFS for Git master ab95cf51 (tag v2.0.26259.1) - Microsoft
CloneVerb.GetCloneRoot usa o último segmento do caminho da URL como pasta de enlistment padrão e não remove uma aspa. RequiredGitConfig então grava core.virtualfilesystem como um caminho de hook ingênuo entre aspas simples. microsoft/git executa esse valor com use_shell=1. O comentário do produto até cita bash.
Uma URL de clone cujo último segmento é pwn';witness;' se torna 'C:/temp/pwn';witness;'/src/.git/hooks/GVFS.VirtualFileSystemHook.exe'. O bash vê três comandos. O do meio executa como o usuário que clonou.
| ID | sem CVE ainda |
| Classe | RCE (envoltório de aspas simples de core.virtualfilesystem) |
| Alcance | Remoto (UI:R clone de uma URL do atacante, ou git worktree add local sob um diretório forjado) |
| CWE | CWE-78, CWE-116 |
| CVSS | Alto: 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| Produto | VFS for Git (precisa do microsoft/git) |
| Afetado | master ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a (tag v2.0.26259.1). Somente Windows. |
| Autenticação | Vítima clona uma URL do atacante (ou git worktree add sob um diretório forjado) |
| Licença | GNU Affero GPL v3.0 |
| Lab | Somente 127.0.0.1. how=gadget (sem VM Windows / ProjFS ao vivo). |
Executar código no host como o usuário que clonou ou executou o git. Não SYSTEM. Não RCE não autenticado que ignora "a vítima clona esta URL".
| Privilégio | Método / sink | O que concede | Recon / integridade / disponibilidade | Comprovado em lab ou inferido |
|---|---|---|---|---|
| Escolher o nome da pasta de enlistment | Último segmento do caminho de gvfs clone <url> sem dest (CloneVerb.GetCloneRoot) | O nome do diretório é escolhido pelo atacante. Windows permite ' e ; | Integridade do caminho de dest | Comprovado em lab no helper de dest copiado. URL .../pwn';witness;' se torna C:\temp\pwn';witness;' |
Sair de core.virtualfilesystem | RequiredGitConfig envolve "'" + ConvertPathToGitFormat(hook) + "'" | O valor de config são três tokens de shell, não um caminho | Integridade da config do git | Comprovado em lab. O envoltório é 'C:/temp/pwn';witness;'/src/.git/hooks/GVFS.VirtualFileSystemHook.exe' |
| Executar um comando de shell extra como o clonador | microsoft/git virtualfilesystem.c use_shell=1 (bash -c do valor de config) | Comando arbitrário no host como o UID do clonador | Integridade / disponibilidade da sessão do clonador | Comprovado em lab no gadget. witness gravou VFS-VFS-QUOTE-WITNESS. O primeiro e o terceiro tokens são caminhos inexistentes (rc 127) |
| Mesmo envoltório em worktree | Program.Worktree.cs -c core.virtualfilesystem="'<path>'" | Mesmo breakout sem uma URL de clone | Integridade | Inferido do código fixado. Não executado |
Repetir em git status / mount posteriores | InProcessMount.TrySetRequiredGitConfigSettings reaplica o envoltório | O git posterior também executa o valor hostil via shell | Integridade | Inferido. Não executado |
Fechado neste resíduo: ProjFS ao vivo / Microsoft git / gvfs clone (este host é macOS; how=gadget). SYSTEM. RCE não autenticado que ignora "a vítima clona esta URL". Um dest cujo nome não tem ', e o mesmo caminho hostil envolto com '\'', não executam witness.
Mesmos resíduos do pin: vfs-mount-dehydrate, vfs-clone-acl, vfs-service-sid, vfs-hook-impersonate, vfs-install-cwd.
Fixe o VFS for Git master ab95cf51 após o merge de 2026-09-28. A Microsoft recomenda o Scalar para novas implantações. A árvore ainda está marcada como v2.0.26259.1. A lista de exclusão é CVE-2021-47874 (binPath entre aspas neste pin). Dez caçadas. Hidratação do ProjFS, parsers GPRE, URLs de cache, FastFetch e gvfs upgrade voltaram vazios neste nível.
Então eu parei em RequiredGitConfig. O comentário documenta bash. O envoltório não escapa '. CloneVerb usa o último segmento da URL como dest. Esse é o resíduo.
Caminhos errados já registrados: tratar um dest sem aspas como o bug (não é); alegar SYSTEM; um reverse shell. Teatro. O Windows nativo estava faltando, então o lab é um gadget desse envoltório mais bash -c.
python3 vfs-quote-breakout-Abraxas-Labs.py
ou
cd lab
./run.sh
Gadget HTTP em 127.0.0.1:19630. Copia os helpers de envoltório e dest, depois /bin/bash -c com PATH limitado a um helper witness que grava o oráculo. VM Windows nativa não estava disponível. A última linha usa how=gadget.
SUCCESS vfs-quote-breakout how=gadget who=cloner naive-breakout=yes escaped-hold=yes VFS-VFS-QUOTE-WITNESS
Escape ' como '\'' antes de envolver, ou pare de usar use_shell e passe o hook como argv[0]. Rejeite caminhos de clone e worktree que contenham '.
ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a (tag v2.0.26259.1)CloneVerb.cs dest padrãoRequiredGitConfig.cs envoltório que não escapa 'virtualfilesystem.c use_shell=1ImagePath sem aspasGNU Affero GPL v3.0. Veja LICENSE. Somente lab em loopback. Sem garantia.