
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 يمنح BUILTIN\Users صلاحية ReadWrite | CreateNewInstance على GVFS.Service.pipe. RegisterRepoHandler.Run يخزّن JSON OwnerSID كما هو. لا شيء يستدعي ImpersonateNamedPipeClient.
أي principal من 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 v2.0.26229.1 / v2.0.26259.1. Windows فقط. |
| المصادقة | محلي. أي principal من BUILTIN\Users. تسجيل دخول الضحية للتركيب التلقائي. |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط. how=gadget (لا يوجد GVFS.Service حي على Windows). |
قد يفشل Git 2.35+ dubious-ownership بعد ذلك في git داخل شجرة يملكها المهاجم. تظل العملية تبدأ بصفة الضحية. إذا كان المسار مملوكًا للضحية لكنه قابل للكتابة من المهاجم (vfs-clone-acl)، فإن mount git وcredential.helper والـ hooks تعمل بصفة ذلك المستخدم.
أي principal من BUILTIN\Users على جهاز مُثبّت عليه الخدمة. الاتصال بـ \\.\pipe\GVFS.Service.pipe. بدون صلاحية إضافية.
| الصلاحية | الطريقة / الهدف | ما تمنحه | استطلاع / سلامة / إتاحة | مُثبت مختبريًا أو مُستنتج |
|---|---|---|---|---|
| سرد كل جذر enlistment نشط | GetActiveRepoListRequest بدون فحص SID (TryGetActiveRepos، وليس GetActiveReposForUser) | مسارات تُستخدم كأوراكل لاسم الأنبوب للصلاحية المتبقية #2 | استطلاع | مُثبت مختبريًا. سرد الـ 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، تم كتابة الشاهد |
| التشغيل كـ NT AUTHORITY\SYSTEM | نفس التركيب التلقائي | عملية ابنة بـ LocalSystem | سلامة | مغلق. whoami للعملية الابنة هو الضحية، وليس SYSTEM (child-not-system=yes) |
Git / hook / credential.helper بصفة الضحية داخل شجرة يملكها المهاجم | إنشاء العملية يحدث رغم ذلك؛ قد يفشل git 2.35+ safe.directory | RCE عبر hook بصفة الضحية إذا كانت الشجرة مملوكة للضحية لكن قابلة للكتابة من المهاجم | سلامة | مُستنتج. لم يشغّل المختبر git من Microsoft. اربط المسار كمملوك للضحية لكن قابل للكتابة من المهاجم لـ RCE عبر hook |
مغلق على هذا الإصدار: وصول عن بُعد غير مُصادق (الأنبوب المسمّى محلي). صدفة SYSTEM. ACL الافتراضي للأنبوب لا يزال يسمح لـ Users بالدخول؛ تسجيل مُرقّع يربط SID العميل (gadget X-Patched: 1) لا يُركّب مسار المهاجم تلقائيًا للضحية.
صلاحيات متبقية على نفس الإصدار: vfs-quote-breakout، vfs-mount-dehydrate، vfs-clone-acl، vfs-hook-impersonate، vfs-install-cwd.
ثبّتت VFSForGit master ab95cf51 بعد دمج 2026-09-28. ACL أنبوب الخدمة هو Users ReadWrite. التسجيل يخزّن JSON OwnerSID. SessionLogon يُركّب تلقائيًا بصفة ذلك SID. لا شيء ينتحل هوية عميل الأنبوب.
منعطفات خاطئة مُسجّلة مسبقًا: تسمية هذا صدفة SYSTEM (التركيب التلقائي هو CreateProcessAsUser لرمز تسجيل الدخول)؛ معاملة git safe.directory كتفويض لـ IPC؛ صدفة عكسية. مسرح. كان Windows الأصلي مفقودًا، لذا المختبر هو gadget من معالجات الإصدار بالإضافة إلى أوراكل TCP على Unix.
python3 vfs-service-sid-Abraxas-Labs.py
أو
cd lab
./run.sh
Gadget HTTP على 127.0.0.1:19660. الشاهد 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
انتحل هوية عميل الأنبوب المسمّى (ImpersonateNamedPipeClient / NamedPipeServerStream.RunAsClient). تجاهل JSON OwnerSID؛ اربط TryRegisterRepo بـ SID العميل. قيّد CreatePipeByName على المستخدم التفاعلي وLocalSystem (أزل BuiltinUsersSid ReadWrite / CreateNewInstance). يجب أن يُعيد GetActiveRepoList مستودعات ذلك العميل فقط. يجب أن يتطلب UnregisterRepo نفس مطابقة SID.
ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3aWindowsPlatform.cs Users ACL و{serviceName}.pipeRegisterRepoHandler.csNamedPipeMessages.cs حقل SID المُقدَّم من العميلRepoRegistry.cs التخزين وAutoMountReposGVFSMountProcess.cs TryRunAs(..., "mount", repoRoot, ...)GNU Affero GPL v3.0. انظر LICENSE. مختبر loopback فقط. بدون ضمان.