
VFS per Git ab95cf51 - Alta - Locale - Privilegio residuo - clonazione Authenticated Users GENERIC_WRITE
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vfs-clone-acl
Classe: Privilegio residuo Portata: Locale
VFS for Git master ab95cf51 (tag v2.0.26259.1) - Microsoft
CloneVerb crea PrimaryEnlistmentRoot con TryCreateDirectoryAccessibleByAuthUsers. Quell'helper aggiunge NT AUTHORITY\Authenticated Users con GENERIC_READ|WRITE|EXECUTE|DELETE e ContainerInherit|ObjectInherit. Il commento parla di accesso elevato vs non elevato per lo stesso utente. Il SID è ogni utente autenticato.
Dopo che la vittima esegue gvfs clone, un altro utente connesso può scrivere in quell'albero, incluso src\.git\hooks. Il repository rimane di proprietà della vittima, quindi safe.directory di git non blocca.
| ID | nessuna CVE al momento |
| Classe | Privilegio residuo (ACL di directory troppo permissiva / plant di hook) |
| Portata | Locale |
| CWE | CWE-732, CWE-276 |
| CVSS | Alto: 7.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Prodotto | VFS for Git |
| Affetto | master ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a (tag v2.0.26259.1). Solo Windows. |
| Auth | Locale. La vittima esegue gvfs clone. L'attaccante è un altro utente autenticato. |
| Licenza | GNU Affero GPL v3.0 |
| Lab | Solo 127.0.0.1. how=gadget (nessun Windows nativo / ProjFS). |
Questo è RCE sull'host locale come l'utente che ha clonato al successivo hook git/GVFS. Non è una shell SYSTEM. Il lab ha piantato solo un file canary; non ha eseguito un hook.
La vittima ha clonato con GVFS. L'attaccante è un altro principal Authenticated Users connesso.
| Privilegio | Metodo / sink | Cosa concede | Recon / integrità / disponibilità | Provato in lab o dedotto |
|---|---|---|---|---|
| Ereditare GENERIC_WRITE sulla root dell'enlistment | CloneVerb chiama TryCreateDirectoryAccessibleByAuthUsers(PrimaryEnlistmentRoot) | Ogni utente autenticato può scrivere l'albero | Integrità | Provato in lab sul gadget. La riga icacls è NT AUTHORITY\Authenticated Users:(OI)(CI)(GR,GW,GE,D), SID S-1-5-11, mask 0xe0010000 |
Ereditare quella ACE sui figli incluso .git/hooks | ContainerInherit | ObjectInherit | La directory degli hook è scrivibile dall'attaccante | Integrità | Provato in lab. authusers_hooks=yes |
Piantare un file sotto src/.git/hooks come attaccante | scrivere VFS-CLONE-ACL-WITNESS | Canary nella directory degli hook di proprietà della vittima | Integrità | Provato in lab. Il proprietario è l'uid 1001 dell'attaccante, il testo è il witness |
| Eseguire un hook piantato come la vittima al successivo comando git/GVFS | sovrascrivere pre-command / il loader GVFS in un clone usa e getta | Codice sull'host come l'utente che ha clonato | Integrità | Dedotto. Il lab ha piantato solo un file canary; non ha eseguito un hook |
| Scrivere la cache locale degli oggetti allo stesso modo | LocalCacheResolver.cs stesso helper | L'albero della cache è scrivibile da Auth Users | Integrità | Dedotto. Il lab ha clonato solo la root dell'enlistment |
| Negativo: ACL solo proprietario | 0700, nessuna ACE Authenticated Users | Scrittura dell'attaccante negata | Chiuso | Provato in lab chiuso. La scrittura dell'attaccante è EACCES |
| other:: scrivibile da tutti | n/a | Scrittura POSIX other | Chiuso | Provato in lab chiuso. other_write=no |
| Scrittura remota non autenticata | n/a | Scrittura di rete | Chiuso | Secondo login locale |
| Shell SYSTEM | n/a | LocalSystem | Chiuso | Il prossimo hook viene eseguito come l'utente che ha clonato, non come LocalSystem |
Stessi residui del pin: vfs-quote-breakout, vfs-mount-dehydrate, vfs-service-sid, vfs-hook-impersonate, vfs-install-cwd.
Ho fissato VFSForGit master ab95cf51 dopo il merge del 2026-09-28. Il clone crea la root dell'enlistment con un helper il cui commento riguarda lo split-token UAC. Il SID è AuthenticatedUserSid. Cioè ogni utente connesso, non l'utente che ha creato.
Vicoli ciechi già registrati: trattarlo come scrivibile da tutti other:: (non lo è; POSIX other non aveva scrittura); sostenere SYSTEM; eseguire un hook piantato nel lab. Teatro. Windows nativo era assente, quindi il lab è un gadget di quelle funzioni come ACL POSIX di gruppo con nome.
python3 vfs-clone-acl-Abraxas-Labs.py
oppure
cd lab
./run.sh
Gadget HTTP su 127.0.0.1:19650. Copia TryCreateDirectoryAccessibleByAuthUsers e applica la stessa ACE come ACL POSIX di gruppo con nome (authusers). L'ultima riga usa how=gadget.
SUCCESS vfs-clone-acl how=gadget auth-users-write=yes inherit=OI-CI attacker-hook-write=yes owner-only=eacces VFS-CLONE-ACL-WITNESS
Concedere all'utente che crea (e opzionalmente agli Administrators per UAC), non a AuthenticatedUserSid. L'equivalente icacls è (OI)(CI)(M) solo per il proprietario.
ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3aCloneVerb.csWindowsFileSystem.cs TryCreateDirectoryAccessibleByAuthUsersLocalCacheResolver.csGNU Affero GPL v3.0. Vedi LICENSE. Solo lab su loopback. Nessuna garanzia.