
VFS for Git ab95cf51 - मध्यम - स्थानीय - विशेषाधिकार शेष - सेवा पाइप JSON OwnerSID पर भरोसा करती है
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vfs-service-sid
वर्ग: विशेषाधिकार अवशेष पहुँच: स्थानीय
VFS for Git master ab95cf51 (tag v2.0.26259.1) - Microsoft
GVFS.Service LocalSystem के रूप में चलता है। WindowsPlatform.CreatePipeByName GVFS.Service.pipe पर BUILTIN\Users को ReadWrite | CreateNewInstance प्रदान करता है। RegisterRepoHandler.Run JSON OwnerSID को यथावत संग्रहीत करता है। कोई भी ImpersonateNamedPipeClient को कॉल नहीं करता।
कोई भी Users प्रिंसिपल किसी पीड़ित SID के अंतर्गत हमलावर पथ पंजीकृत कर सकता है। SessionLogon पर सेवा CreateProcessAsUser के माध्यम से पीड़ित के रूप में gvfs mount <attacker path> चलाती है। चाइल्ड NT AUTHORITY\SYSTEM नहीं है।
| ID | अभी तक कोई CVE नहीं |
| वर्ग | विशेषाधिकार अवशेष (अनुपस्थित प्राधिकरण / क्रॉस-यूज़र निष्पादन) |
| पहुँच | स्थानीय |
| CWE | CWE-862, CWE-284 |
| CVSS | मध्यम: 6.6 CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:N |
| उत्पाद | VFS for Git |
| प्रभावित | master ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a; GitHub tags v2.0.26229.1 / v2.0.26259.1. केवल Windows. |
| प्रमाणीकरण | स्थानीय। कोई भी BUILTIN\Users प्रिंसिपल। ऑटोमाउंट के लिए पीड़ित लॉगऑन। |
| लाइसेंस | GNU Affero GPL v3.0 |
| लैब | केवल 127.0.0.1। how=gadget (कोई लाइव Windows GVFS.Service नहीं)। |
Git 2.35+ dubious-ownership तब हमलावर-स्वामित्व वाले ट्री के अंदर git विफल कर सकता है। प्रक्रिया अभी भी पीड़ित के रूप में शुरू होती है। यदि पथ पीड़ित-स्वामित्व वाला है लेकिन हमलावर-लेखन योग्य (vfs-clone-acl), तो mount git, credential.helper, और hooks उस उपयोगकर्ता के रूप में चलते हैं।
उस मशीन पर कोई भी BUILTIN\Users प्रिंसिपल जहाँ सेवा स्थापित है। \\.\pipe\GVFS.Service.pipe से कनेक्ट करें। कोई अतिरिक्त विशेषाधिकार नहीं।
| विशेषाधिकार | विधि / सिंक | यह क्या प्रदान करता है | रेकॉन / अखंडता / उपलब्धता | लैब-प्रमाणित या अनुमानित |
|---|---|---|---|---|
| प्रत्येक सक्रिय enlistment रूट की सूची बनाएँ | GetActiveRepoListRequest बिना SID जाँच के (TryGetActiveRepos, न कि GetActiveReposForUser) | पथ जो अवशेष #2 के लिए pipe-name oracle के रूप में उपयोग किए जाते हैं | रेकॉन | लैब-प्रमाणित। Gadget ने /lab/repos/victim सूचीबद्ध किया |
| पीड़ित enlistment को निष्क्रिय करें ताकि यह ऑटोमाउंट न हो | UnregisterRepoRequest {EnlistmentRoot} बिना SID जाँच के (TryDeactivateRepo) | पीड़ित रेपो अनमाउंट रहते हैं | उपलब्धता | लैब-प्रमाणित। सक्रिय सूची से पीड़ित पंक्ति हट गई |
| पीड़ित SID के अंतर्गत हमलावर पथ को बनाए रखें | RegisterRepoRequest JSON EnlistmentRoot + OwnerSID; TryRegisterRepo दोनों को संग्रहीत करता है | रजिस्ट्री पंक्ति हमलावर-पथ + पीड़ित SID | अखंडता | लैब-प्रमाणित। रजिस्ट्री पंक्ति /lab/repos/attacker + S-1-5-21-1000-2000-3000-1001 |
लॉगऑन पर पीड़ित के रूप में GVFS.exe mount <attacker path> प्रारंभ करें | OnSessionChange SessionLogon -> AutoMountRepos(userId) -> TryRunAs / CreateProcessAsUser | लॉगऑन उपयोगकर्ता के रूप में क्रॉस-यूज़र प्रक्रिया निर्माण | अखंडता | Gadget पर लैब-प्रमाणित। स्पॉन पैरेंट GVFS.Service, argv mount /lab/repos/attacker, uid 1002 victim, witness लिखा गया |
| NT AUTHORITY\SYSTEM के रूप में चलाएँ | वही ऑटोमाउंट | LocalSystem चाइल्ड | अखंडता | बंद। चाइल्ड whoami पीड़ित है, SYSTEM नहीं (child-not-system=yes) |
हमलावर-स्वामित्व वाले ट्री के अंदर पीड़ित के रूप में Git / hook / credential.helper | प्रक्रिया निर्माण अभी भी होता है; git 2.35+ safe.directory विफल हो सकता है | यदि ट्री पीड़ित-स्वामित्व वाला है लेकिन हमलावर-लेखन योग्य है तो पीड़ित के रूप में Hook RCE | अखंडता | अनुमानित। लैब ने Microsoft git नहीं चलाया। hook RCE के लिए पथ को पीड़ित-स्वामित्व वाला लेकिन हमलावर-लेखन योग्य बाइंड करें |
इस पिन पर बंद: रिमोट अनऑथेंटिकेटेड एक्सेस (named pipe स्थानीय है)। SYSTEM शेल। डिफ़ॉल्ट pipe ACL अभी भी Users को अंदर आने देता है; एक पैच किया गया register जो क्लाइंट SID को बाइंड करता है (gadget X-Patched: 1) पीड़ित के लिए हमलावर पथ को ऑटोमाउंट नहीं करता।
समान पिन अवशेष: vfs-quote-breakout, vfs-mount-dehydrate, vfs-clone-acl, vfs-hook-impersonate, vfs-install-cwd।
मैंने 2026-09-28 merge के बाद VFSForGit master ab95cf51 को पिन किया। सेवा pipe ACL Users ReadWrite है। Register JSON OwnerSID संग्रहीत करता है। SessionLogon उस SID के रूप में ऑटोमाउंट करता है। कोई भी pipe क्लाइंट का प्रतिरूपण नहीं करता।
पहले से दर्ज गलत मोड़: इसे SYSTEM शेल कहना (ऑटोमाउंट लॉगऑन टोकन का CreateProcessAsUser है); git safe.directory को IPC के प्राधिकरण के रूप में मानना; एक रिवर्स शेल। नाटक। मूल Windows अनुपस्थित था, इसलिए लैब पिन हैंडलरों का एक gadget और एक Unix TCP oracle है।
python3 vfs-service-sid-Abraxas-Labs.py
या
cd lab
./run.sh
Gadget HTTP 127.0.0.1:19660 पर। Witness VFS-SERVICE-SID-WITNESS। अंतिम पंक्ति how=gadget का उपयोग करती है।
SUCCESS vfs-service-sid how=gadget register-forged-sid=yes automount-as-victim=yes child-not-system=yes VFS-SERVICE-SID-WITNESS
named-pipe क्लाइंट का प्रतिरूपण करें (ImpersonateNamedPipeClient / NamedPipeServerStream.RunAsClient)। JSON OwnerSID को अनदेखा करें; TryRegisterRepo को क्लाइंट SID से बाइंड करें। CreatePipeByName को इंटरैक्टिव उपयोगकर्ता और LocalSystem तक सीमित करें (BuiltinUsersSid ReadWrite / CreateNewInstance हटाएँ)। GetActiveRepoList को केवल उस क्लाइंट के रेपो लौटाने चाहिए। UnregisterRepo को समान SID मिलान की आवश्यकता होनी चाहिए।