
VFS para Git ab95cf51 - Alta - Local - Resto de privilegios - hook CreateFileW SecurityImpersonation
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vfs-hook-impersonate
Clase: Privilegio residual Alcance: Local
VFS for Git master ab95cf51 (tag v2.0.26259.1) - Microsoft
Los hooks nativos de git (read-object, virtual-filesystem, post-index-changed) abren la tubería de montaje por enlistment con CreateFileW y dwFlagsAndAttributes = 0. Eso omite SECURITY_SQOS_PRESENT, por lo que Windows establece por defecto el cliente en SecurityImpersonation. La misma ACL de la tubería que usa el residual #2 otorga a BUILTIN\Users ReadWrite | CreateNewInstance.
Un segundo usuario local puede crear una instancia adicional u ocupar \\.\pipe\GVFS_<ENLISTMENT>, ImpersonateNamedPipeClient, y escribir como la víctima.
| ID | sin CVE todavía |
| Clase | Privilegio residual (suplantación 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 |
| Producto | VFS for Git |
| Afectado | master ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a (también actual frente a la release v2.0.26259.1). Solo Windows. |
| Auth | Local. La víctima tiene un enlistment de GVFS. El atacante es cualquier principal de BUILTIN\Users. La víctima ejecuta git después. |
| Licencia | GNU Affero GPL v3.0 |
| Lab | Solo 127.0.0.1. how=gadget (sin VM Windows en vivo / VFS for Git instalado). |
Esto es local. No es SYSTEM. Automount en el residual #4 es una tubería distinta (GVFS.Service.pipe). Dehydrate/unmount en esta misma tubería de montaje es el residual #2.
La víctima tiene un enlistment de GVFS. El atacante es cualquier principal de BUILTIN\Users. La víctima ejecuta git después (status, checkout, cualquier cosa que dispare los hooks de VFS).
| Privilegio | Método / sink | Qué otorga | Recon / integridad / disponibilidad | Probado en lab o inferido |
|---|---|---|---|---|
| Suplantar a la víctima y escribir en su perfil | Instancia adicional / ocupar \\.\pipe\GVFS_C_\REPOS\FOO; hook CreateFileW flags=0; ImpersonateNamedPipeClient; crear %USERPROFILE%\VFS-HOOK-IMPERSONATE-WITNESS | Escribir como el UID de la víctima | Integridad | Probado en lab sobre un gadget. El propietario del witness es el uid de la víctima. Los flags por defecto son SecurityImpersonation. El uid del atacante no puede escribir ese home sin suplantación |
| Mantener git funcionando tras la ocupación | Responder S|\x03 a MPL|1 para que GVFS.VirtualFileSystemHook no se cuelgue | Git continúa | Disponibilidad del git de la víctima | Probado en lab. Hook reply_ok tanto en rutas vulnerables como parcheadas |
| Adivinar el nombre de la tubería desde la raíz del enlistment | GetGVFSPipeName recorre el CWD hasta .gvfs, CharUpper, : -> _, prefijo \\.\pipe\GVFS_ | Nombre IPC adivinable | Recon | Probado en lab. C:\Repos\Foo\src -> \\.\pipe\GVFS_C_\REPOS\FOO |
| Redirigir la tubería sin ganar la instancia activa | Plantar un directorio src\.gvfs rastreado para que el walk-up enlace un nombre distinto | Ocupación sin competir con el montaje | Integridad | Inferido de common.windows.cpp walk-up. El lab usó el .gvfs real del enlistment |
Responder DLO / PICN además de MPL | Misma tubería, ReadObjectHook / PostIndexChangedHook | Mentir sobre objetos / skip-worktree | Integridad | Inferido. El lab envió solo MPL|1 |
Provocar el crash del hook con un S\x03 de dos bytes | VirtualFileSystemHook messageLength -= 2 luego -= 1 desborda y hace fwrite de ~4GiB | Crash / lectura OOB | Disponibilidad | Inferido de main.cpp 69-90. No es el oráculo. No enviar ese crash |
Descartado aquí: SYSTEM (el montaje es del usuario del enlistment). RCE remoto no autenticado. VM Windows en vivo / VFS for Git instalado (este lab es un gadget de las funciones copiadas).
Residuales del mismo pin: vfs-quote-breakout, vfs-mount-dehydrate, vfs-clone-acl, vfs-service-sid, vfs-install-cwd.
Fijé VFSForGit master ab95cf51 tras el merge del 2026-09-28. Los hooks nativos hacen CreateFileW con flags 0. Windows entonces usa SecurityImpersonation por defecto. La tubería de montaje ya permite a Users crear una instancia adicional. Ese es el residual.
Caminos equivocados ya registrados: tratar esto como el dehydrate del residual #2 (misma ACL, sink distinto: token, no MoveDirectory); afirmar SYSTEM; enviar el underflow de 4GiB como el oráculo. Teatro. Faltaba Windows nativo, así que el lab es un gadget de esas funciones. Los sockets Unix sustituyen a los named pipes.
python3 vfs-hook-impersonate-Abraxas-Labs.py
o
cd lab
./run.sh
Gadget HTTP en 127.0.0.1:19670. Copia GetGVFSPipeName, los flags de CreatePipeToGVFS, la ACL CreateNewInstance de Users, y el protocolo de hook MPL|1 / S|. Un cliente parcheado con identificación SQOS no escribe el witness. La última línea 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
En el hook CreateFileW pasar SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION. Restringir CreatePipeByName al SID del propietario del enlistment más LocalSystem. Eliminar CreateNewInstance para Users. Verificar los límites de longitud de las respuestas del hook.
ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3acommon.windows.cpp CreatePipeToGVFSWindowsPlatform.cs CreatePipeByNameGNU Affero GPL v3.0. Ver LICENSE. Solo lab en loopback. Sin garantía.