
VFS for Git ab95cf51 - عالي - محلي - بقايا صلاحيات - يقوم المستخدمون بتركيب pipe dehydrate/unmount
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vfs-mount-dehydrate
الفئة: صلاحية متبقية النطاق: محلي
VFS for Git master ab95cf51 (tag v2.0.26259.1) - Microsoft
CreatePipeByName على أنبوب التحميل الخاص بكل enlistment يمنح BUILTIN\Users صلاحية ReadWrite | CreateNewInstance. لا يوجد فحص لـ SID المالك ولا ImpersonateNamedPipeClient. HandleDehydrateFolders يقوم بـ Path.Combine لأسماء المجلدات التي يتحكم بها المهاجم ويمررها إلى git عبر ProcessStartInfo.Arguments. مسار dehydrate في CLI يشغّل IsFolderValid. معالج التحميل لا يفعل ذلك.
أي شخص ضمن Users يستطيع تخمين \\.\pipe\GVFS_<ENLISTMENT> يمكنه إلغاء تحميل ProjFS، ونقل المجلدات بصفة مستخدم التحميل، وإجبار git reset HEAD --hard.
| ID | لا يوجد CVE بعد |
| الفئة | صلاحية متبقية (ACL أنبوب مسمّى) / اجتياز المسار / حقن الوسائط |
| النطاق | محلي |
| CWE | CWE-284، CWE-22، CWE-88 |
| CVSS | مرتفع: 7.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| المنتج | VFS for Git |
| المتأثر | master ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a؛ وسوم المثبّت v2.0.26229.1 / v2.0.26259.1. Windows فقط. |
| المصادقة | محلي. أي principal من BUILTIN\Users بينما الضحية لديها تحميل |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط. how=gadget (بدون Windows VM / ProjFS حي). |
بروتوكول الأنبوب: UTF-8 Header أو Header|body، ينتهي بالبايت 0x03. اسم الأنبوب هو GVFS_ + جذر enlistment بأحرف كبيرة مع استبدال : بـ _ (مثال C:\Repos\Foo -> \\.\pipe\GVFS_C_\REPOS\FOO).
الضحية لديها gvfs mount على جذر معروف. المهاجم هو principal آخر من Users على نفس الجهاز. السلامة والتوافر بصفة الضحية. ليس SYSTEM. وليس shell بحد ذاته.
| الصلاحية | الطريقة / الهدف | ما تمنحه | استطلاع / سلامة / توافر | مُثبت مختبريًا أو مُستنتج |
|---|---|---|---|---|
| الاتصال بأنبوب تحميل الضحية | CreatePipeByName ACL BuiltinUsers ReadWrite | CreateNewInstance؛ بدون فحص المالك | التحدث عبر IPC التحميل | استطلاع الأنبوب | مُثبت مختبريًا (gadget ACL). SID المهاجم مقبول؛ وضع المالك فقط يعيد رفض الاتصال |
| قراءة مسار enlistment، مسار cache، RepoUrl | GetStatus | تسريب الجذر المستخدم للصلاحية المتبقية #1 / #4 | استطلاع | مُثبت مختبريًا. JSON الحالة تضمّن RepoUrl و GVFS_C_\REPOS\FOO |
إلغاء تحميل ProjFS وإنهاء gvfs.mount | الرسالة Unmount | إسقاط enlistment | توافر | مُثبت مختبريًا. يرد Ack ثم Complete؛ حالة التحميل Unmounted |
| إلغاء التحميل عند فشل التحليل | ReleaseLock بجسم فارغ -> RequestData == null -> UnmountAndStopWorkingDirectoryCallbacks + Environment.Exit | نفس إلغاء التحميل مع إنهاء العملية | توافر | مُثبت مختبريًا. ReleaseLock| الفارغ ألغى التحميل |
| إتلاف شجرة عمل الضحية | Dehydrate|{"Folders":"--hard",...}. movedFolders.Add حتى لو كان المجلد المصدر مفقودًا. Reset("HEAD", "\"--hard\" ") يصبح git reset HEAD --hard بعد إزالة علامات الاقتباس | تدمير الملفات المتعقّبة المعدّلة | سلامة / توافر | مُثبت مختبريًا. ملف متعقّب معدّل فقد سلسلة الشاهد |
| نقل مجلد خارج شجرة العمل بصفة الضحية | Path.Combine(WorkingDirectoryBackingRoot, folder) + MoveDirectory إلى BackupFolderPath | سرقة / نقل مجلد من شجرة العمل | سلامة | مُثبت مختبريًا. keepme غادر src وظهر تحت مسار النسخ الاحتياطي للمهاجم |
اجتياز .. (CLI IsFolderValid غير مستخدم) | نفس Combine؛ ..\secret | نقل مجلد شقيق يمكن لمستخدم التحميل الكتابة فيه | سلامة | مُثبت مختبريًا. المجلد الشقيق secret انتهى تحت مسار النسخ الاحتياطي للمهاجم. تطبيق IsFolderValid أوقفه |
| سرقة أو تدمير مجلدات أخرى قابلة للكتابة من الضحية | نفس النقل بسلسلة ..\ تُحلّ خارج enlistment | نقل أوسع بصفة مستخدم التحميل | سلامة | مُستنتج من Combine. هذا المختبر يستخدم شجرة مؤقتة فقط |
| تنفيذ كود بصفة الضحية | هذا الأنبوب | إنشاء عملية لصورة المهاجم | سلامة | مغلق. لا إنشاء عملية لصورة المهاجم على هذه الصلاحية المتبقية (انظر vfs-service-sid و vfs-hook-impersonate) |
| SYSTEM | mount IPC | LocalSystem | سلامة | مغلق. التحميل يعمل بصفة مستخدم enlistment |
--hard ليس مسار ... CLI IsFolderValid لا يزال يسمح به. الإصلاح يجب أن يرفض أيضًا أسماء المجلدات التي تشبه الخيارات.
صلاحيات متبقية على نفس الإصدار: vfs-quote-breakout، vfs-clone-acl، vfs-service-sid، vfs-hook-impersonate، vfs-install-cwd.
ثبّتت VFSForGit master ab95cf51 بعد دمج 2026-09-28. أنبوب الخدمة وأنبوب التحميل الخاص بكل enlistment يتشاركان CreatePipeByName. dehydrate في CLI يتحقق من المجلدات. معالج التحميل لا يفعل ذلك.
الطرق الخاطئة المسجّلة مسبقًا: التعامل مع --hard كاجتياز مسار (إنه حقن وسائط بعد إزالة علامات الاقتباس)؛ ادعاء SYSTEM؛ reverse shell. مسرح. كان Windows الأصلي مفقودًا، لذا المختبر هو gadget لتلك الدوال بالإضافة إلى شجرة git مؤقتة.
python3 vfs-mount-dehydrate-Abraxas-Labs.py
أو
cd lab
./run.sh
Gadget HTTP على 127.0.0.1:19640 يتحدث بشكل رسائل الأنبوب. شجرة git مؤقتة داخل الحاوية. لا reverse shell. لا مسار ملف تعريف حقيقي. السطر الأخير يستخدم how=gadget.
SUCCESS vfs-mount-dehydrate how=gadget unmount=yes reset-hard=yes dirty-gone=yes move-inside=yes move-dotdot=yes pipe-acl=users-no-owner is-folder-valid-not-on-pipe=yes VFS-MOUNT-DEHYDRATE-WITNESS
قيّد CreatePipeByName بـ SID مالك enlistment بالإضافة إلى LocalSystem. أزل CreateNewInstance لـ Users. انتحل هوية العميل واطلب المالك. كرّر IsFolderValid في HandleDehydrateFolders وارفض الأسماء التي تشبه خيارات git. لا تعامل فشل تحليل ReleaseLock كإنهاء للعملية.
ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3aWindowsPlatform.cs CreatePipeByNameInProcessMount.cs dehydrate / unmount / ReleaseLockDehydrateVerb.cs IsFolderValidGNU Affero GPL v3.0. انظر LICENSE. مختبر loopback فقط. بدون ضمان.