
VFS для Git ab95cf51 — высокий — локальный — остаточная привилегия — перехват CreateFileW SecurityImpersonation
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vfs-hook-impersonate
Класс: Остаточная привилегия Достижимость: Локальная
VFS for Git master ab95cf51 (тег v2.0.26259.1) — Microsoft
Нативные git-хуки (read-object, virtual-filesystem, post-index-changed) открывают канал монтирования конкретного enlistment через CreateFileW с dwFlagsAndAttributes = 0. Это опускает SECURITY_SQOS_PRESENT, поэтому Windows по умолчанию устанавливает для клиента SecurityImpersonation. Тот же ACL канала, который используется в остаточной проблеме №2, предоставляет BUILTIN\Users права ReadWrite | CreateNewInstance.
Второй локальный пользователь может создать дополнительный экземпляр или занять \\.\pipe\GVFS_<ENLISTMENT>, вызвать ImpersonateNamedPipeClient и писать от имени жертвы.
| ID | CVE пока нет |
| Класс | Остаточная привилегия (impersonation через именованный канал) |
| Достижимость | Локальная |
| CWE | CWE-284, CWE-300 |
| CVSS | High: 7.1 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| Продукт | VFS for Git |
| Затронуто | master ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a (также актуально относительно релиза v2.0.26259.1). Только Windows. |
| Аутентификация | Локальная. У жертвы есть enlistment GVFS. Атакующий — любой субъект BUILTIN\Users. Жертва позже запускает git. |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | Только 127.0.0.1. how=gadget (без живой Windows VM / установленного VFS for Git). |
Это локально. Это не SYSTEM. Automount в остаточной проблеме №4 — это другой канал (GVFS.Service.pipe). Dehydrate/unmount на этом же канале монтирования — это остаточная проблема №2.
У жертвы есть enlistment GVFS. Атакующий — любой субъект BUILTIN\Users. Жертва позже запускает git (status, checkout, что угодно, что вызывает хуки VFS).
| Привилегия | Метод / sink | Что даёт | Разведка / целостность / доступность | Доказано в лаборатории или выведено |
|---|---|---|---|---|
| Имперсонация жертвы и запись в её профиль | Дополнительный экземпляр / занятие \\.\pipe\GVFS_C_\REPOS\FOO; хук CreateFileW flags=0; ImpersonateNamedPipeClient; создание %USERPROFILE%\VFS-HOOK-IMPERSONATE-WITNESS | Запись от имени UID жертвы | Целостность | Доказано в лаборатории на гаджете. Владелец witness — uid жертвы. Флаги по умолчанию — SecurityImpersonation. UID атакующего не может писать в этот домашний каталог без имперсонации |
| Сохранить работу git после занятия | Ответ S|\x03 на MPL|1, чтобы GVFS.VirtualFileSystemHook не завис | Git продолжает работу | Доступность git жертвы | Доказано в лаборатории. Хук reply_ok как на уязвимом, так и на исправленном пути |
| Угадать имя канала по корню enlistment | GetGVFSPipeName проходит от CWD до .gvfs, CharUpper, : -> _, префикс \\.\pipe\GVFS_ | Угадываемое имя IPC | Разведка | Доказано в лаборатории. C:\Repos\Foo\src -> \\.\pipe\GVFS_C_\REPOS\FOO |
| Перенацелить канал, не выиграв гонку за живой экземпляр | Подложить отслеживаемый каталог src\.gvfs, чтобы обход вверх привязался к другому имени | Занятие без гонки с монтированием | Целостность | Выведено из обхода вверх в common.windows.cpp. В лаборатории использовался реальный .gvfs enlistment |
Отвечать на DLO / PICN, а также на MPL | Тот же канал, ReadObjectHook / PostIndexChangedHook | Ложь об объектах / skip-worktree | Целостность | Выведено. В лаборатории отправлялся только MPL|1 |
Обрушить хук двухбайтовым S\x03 | В VirtualFileSystemHook messageLength -= 2, затем -= 1 вызывает underflow и fwrite ~4GiB | Крах / OOB-чтение | Доступность | Выведено из main.cpp 69-90. Не является оракулом. Не выпускать этот краш |
Закрыто здесь: SYSTEM (монтирование выполняется пользователем enlistment). Удалённый неаутентифицированный RCE. Живая Windows VM / установленный VFS for Git (эта лаборатория — гаджет скопированных функций).
Остаточные проблемы на том же пине: vfs-quote-breakout, vfs-mount-dehydrate, vfs-clone-acl, vfs-service-sid, vfs-install-cwd.
Я зафиксировал VFSForGit master ab95cf51 после слияния 2026-09-28. Нативные хуки вызывают CreateFileW с флагами 0. Тогда Windows по умолчанию использует SecurityImpersonation. Канал монтирования уже позволяет Users создавать дополнительный экземпляр. Это и есть остаточная проблема.
Уже зафиксированные ошибочные пути: трактовка этого как dehydrate из остаточной проблемы №2 (тот же ACL, другой sink: токен, а не MoveDirectory); заявление о SYSTEM; выпуск underflow на 4GiB в качестве оракула. Театр. Нативная Windows отсутствовала, поэтому лаборатория — это гаджет тех функций. Unix-сокеты заменяют именованные каналы.
python3 vfs-hook-impersonate-Abraxas-Labs.py
или
cd lab
./run.sh
Гаджет HTTP на 127.0.0.1:19670. Копирует GetGVFSPipeName, флаги CreatePipeToGVFS, ACL CreateNewInstance для Users и протокол хука MPL|1 / S|. Исправленный клиент с SQOS identification не пишет witness. Последняя строка использует how=gadget.
SUCCESS vfs-hook-impersonate how=gadget createfile-flags=0 impersonation=SecurityImpersonation extra-instance=yes owner=victim patched-sqos-ident-no-write=yes VFS-HOOK-IMPERSONATE-WITNESS
В хуке CreateFileW передавать SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION. Ограничить CreatePipeByName SID владельца enlistment плюс LocalSystem. Убрать CreateNewInstance для Users. Проверять границы длин ответов хука.
ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3acommon.windows.cpp CreatePipeToGVFSWindowsPlatform.cs CreatePipeByNameGNU Affero GPL v3.0. См. LICENSE. Только loopback-лаборатория. Без гарантий.