
VFS para Git ab95cf51 - Alta - Local - Privilégio remanescente - hook CreateFileW SecurityImpersonation
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vfs-hook-impersonate
Classe: Privilégio remanescente Alcance: Local
VFS for Git master ab95cf51 (tag v2.0.26259.1) - Microsoft
Os hooks nativos do git (read-object, virtual-filesystem, post-index-changed) abrem o pipe de montagem por enlistment com CreateFileW e dwFlagsAndAttributes = 0. Isso omite SECURITY_SQOS_PRESENT, então o Windows define o cliente por padrão como SecurityImpersonation. A mesma ACL do pipe que o leftover #2 usa concede a BUILTIN\Users ReadWrite | CreateNewInstance.
Um segundo usuário local pode criar uma instância extra ou fazer squat em \\.\pipe\GVFS_<ENLISTMENT>, ImpersonateNamedPipeClient, e escrever como a vítima.
| ID | sem CVE ainda |
| Classe | Privilégio remanescente (impersonação de named pipe) |
| Alcance | Local |
| CWE | CWE-284, CWE-300 |
| CVSS | Alto: 7.1 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Produto | VFS for Git |
| Afetado | master ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a (também atual vs release v2.0.26259.1). Somente Windows. |
| Auth | Local. A vítima tem um enlistment GVFS. O atacante é qualquer principal BUILTIN\Users. A vítima depois executa git. |
| Licença | GNU Affero GPL v3.0 |
| Lab | Somente 127.0.0.1. how=gadget (sem VM Windows ativa / VFS for Git instalado). |
Isto é local. Não é SYSTEM. O automount no leftover #4 é um pipe diferente (GVFS.Service.pipe). Dehydrate/unmount neste mesmo pipe de montagem é o leftover #2.
A vítima tem um enlistment GVFS. O atacante é qualquer principal BUILTIN\Users. A vítima depois executa git (status, checkout, qualquer coisa que dispare os hooks do VFS).
| Privilégio | Método / sink | O que concede | Recon / integridade / disponibilidade | Comprovado em lab ou inferido |
|---|---|---|---|---|
| Personificar a vítima e escrever no perfil dela | Instância extra / squat \\.\pipe\GVFS_C_\REPOS\FOO; hook CreateFileW flags=0; ImpersonateNamedPipeClient; criar %USERPROFILE%\VFS-HOOK-IMPERSONATE-WITNESS | Escrever como o UID da vítima | Integridade | Comprovado em lab com um gadget. O dono do witness é o uid da vítima. As flags padrão são SecurityImpersonation. O uid do atacante não consegue escrever nesse home sem impersonação |
| Manter o git funcionando após o squat | Responder S|\x03 a MPL|1 para que GVFS.VirtualFileSystemHook não trave | O git continua | Disponibilidade do git da vítima | Comprovado em lab. Hook reply_ok tanto no caminho vulnerável quanto no corrigido |
| Adivinhar o nome do pipe a partir da raiz do enlistment | GetGVFSPipeName percorre o CWD até .gvfs, CharUpper, : -> _, prefixo \\.\pipe\GVFS_ | Nome de IPC adivinhável | Recon | Comprovado em lab. C:\Repos\Foo\src -> \\.\pipe\GVFS_C_\REPOS\FOO |
| Redirecionar o pipe sem vencer a instância ativa | Plantar um diretório src\.gvfs rastreado para que a subida vincule um nome diferente | Squat sem competir com a montagem | Integridade | Inferido a partir da subida em common.windows.cpp. O lab usou o .gvfs real do enlistment |
Responder DLO / PICN além de MPL | Mesmo pipe, ReadObjectHook / PostIndexChangedHook | Mentir sobre objetos / skip-worktree | Integridade | Inferido. O lab enviou apenas MPL|1 |
Derrubar o hook com um S\x03 de dois bytes | VirtualFileSystemHook messageLength -= 2 depois -= 1 causa underflow e fwrite de ~4GiB | Crash / leitura fora dos limites | Disponibilidade | Inferido de main.cpp 69-90. Não é o oráculo. Não distribua esse crash |
Fechado aqui: SYSTEM (a montagem é do usuário do enlistment). RCE remoto não autenticado. VM Windows ativa / VFS for Git instalado (este lab é um gadget das funções copiadas).
Leftovers do mesmo pin: vfs-quote-breakout, vfs-mount-dehydrate, vfs-clone-acl, vfs-service-sid, vfs-install-cwd.
Eu fixei o VFSForGit master ab95cf51 após o merge de 2026-09-28. Hooks nativos CreateFileW com flags 0. O Windows então usa SecurityImpersonation por padrão. O pipe de montagem já permite que Users criem instância extra. Esse é o leftover.
Caminhos errados já registrados: tratar isto como dehydrate do leftover #2 (mesma ACL, sink diferente: token, não MoveDirectory); alegar SYSTEM; distribuir o underflow de 4GiB como o oráculo. Teatro. O Windows nativo estava faltando, então o lab é um gadget dessas funções. Unix sockets substituem named pipes.
python3 vfs-hook-impersonate-Abraxas-Labs.py
ou
cd lab
./run.sh
Gadget HTTP em 127.0.0.1:19670. Copia GetGVFSPipeName, as flags de CreatePipeToGVFS, a ACL CreateNewInstance de Users, e o protocolo de hook MPL|1 / S|. Um cliente corrigido com identificação SQOS não escreve o witness. A última linha usa how=gadget.
SUCCESS vfs-hook-impersonate how=gadget createfile-flags=0 impersonation=SecurityImpersonation extra-instance=yes owner=victim patched-sqos-ident-no-write=yes VFS-HOOK-IMPERSONATE-WITNESS
No hook CreateFileW passe SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION. Restrinja CreatePipeByName ao SID do dono do enlistment mais LocalSystem. Remova CreateNewInstance para Users. Faça verificação de limites nos comprimentos de resposta do hook.
ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3acommon.windows.cpp CreatePipeToGVFSWindowsPlatform.cs CreatePipeByNameGNU Affero GPL v3.0. Veja LICENSE. Somente lab em loopback. Sem garantia.