
VFS pour Git ab95cf51 - Élevé - Local - Privilège résiduel - clone Authenticated Users GENERIC_WRITE
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vfs-clone-acl
Classe : Privilège résiduel Portée : Locale
VFS for Git master ab95cf51 (tag v2.0.26259.1) - Microsoft
CloneVerb crée PrimaryEnlistmentRoot avec TryCreateDirectoryAccessibleByAuthUsers. Cet assistant ajoute NT AUTHORITY\Authenticated Users GENERIC_READ|WRITE|EXECUTE|DELETE avec ContainerInherit|ObjectInherit. Le commentaire parle d'accès élevé vs non élevé pour le même utilisateur. Le SID correspond à tous les utilisateurs authentifiés.
Après que la victime a exécuté gvfs clone, un autre utilisateur connecté peut écrire dans cette arborescence, y compris dans src\.git\hooks. Le dépôt reste la propriété de la victime, donc le safe.directory de git ne bloque pas.
| ID | pas encore de CVE |
| Classe | Privilège résiduel (ACL de répertoire trop permissive / plantation de hook) |
| Portée | Locale |
| CWE | CWE-732, CWE-276 |
| CVSS | Élevé : 7.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Produit | VFS for Git |
| Affecté | master ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a (tag v2.0.26259.1). Windows uniquement. |
| Auth | Locale. La victime exécute gvfs clone. L'attaquant est un autre utilisateur authentifié. |
| Licence | GNU Affero GPL v3.0 |
| Labo | 127.0.0.1 uniquement. how=gadget (pas de Windows natif / ProjFS). |
Il s'agit d'une RCE sur l'hôte local en tant que cloneur lors du prochain hook git/GVFS. Pas un shell SYSTEM. Le labo n'a planté qu'un fichier canari ; il n'a pas exécuté de hook.
La victime a cloné avec GVFS. L'attaquant est un autre principal Authenticated Users connecté.
| Privilège | Méthode / cible | Ce que cela accorde | Reconnaissance / intégrité / disponibilité | Prouvé en labo ou déduit |
|---|---|---|---|---|
| Hériter de GENERIC_WRITE sur la racine d'enlistment | CloneVerb appelle TryCreateDirectoryAccessibleByAuthUsers(PrimaryEnlistmentRoot) | Tout utilisateur authentifié peut écrire dans l'arborescence | Intégrité | Prouvé en labo sur le gadget. La ligne icacls est NT AUTHORITY\Authenticated Users:(OI)(CI)(GR,GW,GE,D), SID S-1-5-11, masque 0xe0010000 |
Hériter de cette ACE sur les enfants, y compris .git/hooks | ContainerInherit | ObjectInherit | Le répertoire des hooks est accessible en écriture à l'attaquant | Intégrité | Prouvé en labo. authusers_hooks=yes |
Planter un fichier sous src/.git/hooks en tant qu'attaquant | écrire VFS-CLONE-ACL-WITNESS | Canari dans le répertoire de hooks appartenant à la victime | Intégrité | Prouvé en labo. Le propriétaire est l'uid attaquant 1001, le texte est le témoin |
| Exécuter un hook planté en tant que victime lors de la prochaine commande git/GVFS | écraser pre-command / le loader GVFS dans un clone jetable | Code hôte en tant que cloneur | Intégrité | Déduit. Le labo n'a planté qu'un fichier canari ; il n'a pas exécuté de hook |
| Écrire le cache d'objets local de la même manière | LocalCacheResolver.cs même assistant | L'arborescence du cache est accessible en écriture à Auth Users | Intégrité | Déduit. Le labo n'a cloné que la racine d'enlistment |
| Négatif : ACL propriétaire uniquement | 0700, aucune ACE Authenticated Users | Écriture attaquant refusée | Fermé | Prouvé en labo fermé. L'écriture attaquant est EACCES |
| other:: accessible en écriture à tous | n/a | Écriture POSIX other | Fermé | Prouvé en labo fermé. other_write=no |
| Écriture distante non authentifiée | n/a | Écriture réseau | Fermé | Deuxième connexion locale |
| Shell SYSTEM | n/a | LocalSystem | Fermé | Le prochain hook s'exécute en tant que cloneur, pas LocalSystem |
Mêmes résidus de pin : vfs-quote-breakout, vfs-mount-dehydrate, vfs-service-sid, vfs-hook-impersonate, vfs-install-cwd.
J'ai épinglé VFSForGit master ab95cf51 après la fusion du 2026-09-28. Clone crée la racine d'enlistment avec un assistant dont le commentaire concerne le fractionnement de jeton UAC. Le SID est AuthenticatedUserSid. C'est tous les utilisateurs connectés, pas l'utilisateur créateur.
Fausses pistes déjà consignées : traiter cela comme accessible en écriture à tous other:: (ce n'est pas le cas ; POSIX other n'avait pas d'écriture) ; prétendre à un SYSTEM ; exécuter un hook planté dans le labo. Du théâtre. Windows natif était absent, donc le labo est un gadget de ces fonctions sous forme d'ACL de groupe nommé POSIX.
python3 vfs-clone-acl-Abraxas-Labs.py
ou
cd lab
./run.sh
Gadget HTTP sur 127.0.0.1:19650. Copie TryCreateDirectoryAccessibleByAuthUsers et applique la même ACE sous forme d'ACL de groupe nommé POSIX (authusers). La dernière ligne utilise 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
Accorder à l'utilisateur créateur (et éventuellement aux Administrateurs pour l'UAC), pas à AuthenticatedUserSid. L'équivalent icacls est (OI)(CI)(M) pour le propriétaire uniquement.
ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3aCloneVerb.csWindowsFileSystem.cs TryCreateDirectoryAccessibleByAuthUsersLocalCacheResolver.csGNU Affero GPL v3.0. Voir LICENSE. Labo en boucle locale uniquement. Aucune garantie.