
VFS для Git ab95cf51 — высокий — удалённый — RCE — core.virtualfilesystem обёртка одинарными кавычками
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vfs-quote-breakout
Класс: RCE Доступ: Удалённый
VFS for Git master ab95cf51 (тег v2.0.26259.1) — Microsoft
CloneVerb.GetCloneRoot берёт последний сегмент пути URL в качестве папки enlistment по умолчанию и не удаляет кавычку. Затем RequiredGitConfig записывает core.virtualfilesystem как наивный путь к хуку в одинарных кавычках. microsoft/git выполняет это значение с use_shell=1. Комментарий в продукте даже упоминает bash.
URL клонирования, последний сегмент которого — pwn';witness;', превращается в 'C:/temp/pwn';witness;'/src/.git/hooks/GVFS.VirtualFileSystemHook.exe'. bash видит три команды. Средняя выполняется от имени пользователя, который выполнил клонирование.
| ID | CVE пока нет |
| Класс | RCE (обёртка core.virtualfilesystem в одинарные кавычки) |
| Доступ | Удалённый (UI:R клонирование URL атакующего или локальный git worktree add в подготовленном каталоге) |
| CWE | CWE-78, CWE-116 |
| CVSS | High: 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| Продукт | VFS for Git (требуется microsoft/git) |
| Затронуто | master ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a (тег v2.0.26259.1). Только Windows. |
| Аутентификация | Жертва клонирует URL атакующего (или git worktree add в подготовленном каталоге) |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1. how=gadget (без Windows VM / живого ProjFS). |
Выполнить код на хосте от имени пользователя, который клонировал или запустил git. Не SYSTEM. Не неаутентифицированный RCE, пропускающий «жертва клонирует этот URL».
| Привилегия | Метод / sink | Что даёт | Разведка / целостность / доступность | Доказано в лаборатории или выведено |
|---|---|---|---|---|
| Выбор имени папки enlistment | Последний сегмент пути gvfs clone <url> без dest (CloneVerb.GetCloneRoot) | Имя каталога выбирает атакующий. Windows допускает ' и ; | Целостность пути dest | Доказано в лаборатории на скопированном dest-хелпере. URL .../pwn';witness;' превращается в C:\temp\pwn';witness;' |
Выход за пределы core.virtualfilesystem | Обёртка RequiredGitConfig "'" + ConvertPathToGitFormat(hook) + "'" | Значение конфигурации — три shell-токена, а не один путь | Целостность git config | Доказано в лаборатории. Обёртка — 'C:/temp/pwn';witness;'/src/.git/hooks/GVFS.VirtualFileSystemHook.exe' |
| Выполнение дополнительной shell-команды от имени клонирующего | microsoft/git virtualfilesystem.c use_shell=1 (bash -c от значения конфигурации) | Произвольная команда на хосте от UID клонирующего | Целостность / доступность сессии клонирующего | Доказано в лаборатории на гаджете. witness записал VFS-VFS-QUOTE-WITNESS. Первый и третий токены — отсутствующие пути (rc 127) |
| Та же обёртка на worktree | Program.Worktree.cs -c core.virtualfilesystem="'<path>'" | Тот же выход без URL клонирования | Целостность | Выведено из исходников на этом пине. Не выполнялось |
Повтор при последующих git status / mount | InProcessMount.TrySetRequiredGitConfigSettings повторно применяет обёртку | Последующий git также выполняет враждебное значение через shell | Целостность | Выведено. Не выполнялось |
Закрыто на этом остатке: живой ProjFS / Microsoft git / gvfs clone (этот хост — macOS; how=gadget). SYSTEM. Неаутентифицированный RCE, пропускающий «жертва клонирует этот URL». Dest, в имени которого нет ', и тот же враждебный путь, обёрнутый через '\'', не запускают witness.
Другие остатки на этом пине: vfs-mount-dehydrate, vfs-clone-acl, vfs-service-sid, vfs-hook-impersonate, vfs-install-cwd.
Я зафиксировал VFS for Git master ab95cf51 после слияния 2026-09-28. Microsoft рекомендует Scalar для новых развёртываний. Дерево всё ещё помечено тегом v2.0.26259.1. Список пропусков — CVE-2021-47874 (заключённый в кавычки binPath на этом пине). Десять поисков. Гидратация ProjFS, парсеры GPRE, URL кэша, FastFetch и gvfs upgrade в этой планке ничего не дали.
Затем я задержался на RequiredGitConfig. Комментарий документирует bash. Обёртка не экранирует '. CloneVerb использует последний сегмент URL как dest. Вот это и есть остаток.
Уже зафиксированные ошибочные пути: считать багом dest без кавычки (это не так); заявлять SYSTEM; обратный шелл. Театр. Нативной Windows не было, поэтому лаборатория — это гаджет той обёртки плюс bash -c.
python3 vfs-quote-breakout-Abraxas-Labs.py
или
cd lab
./run.sh
Гаджет HTTP на 127.0.0.1:19630. Копирует обёртку и dest-хелперы, затем /bin/bash -c с PATH, ограниченным хелпером witness, который записывает оракул. Нативной Windows VM не было. Последняя строка использует how=gadget.
SUCCESS vfs-quote-breakout how=gadget who=cloner naive-breakout=yes escaped-hold=yes VFS-VFS-QUOTE-WITNESS
Экранировать ' как '\'' перед обёрткой или перестать использовать use_shell и передавать хук как argv[0]. Отклонять пути клонирования и worktree, содержащие '.
ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a (тег v2.0.26259.1)CloneVerb.cs dest по умолчаниюRequiredGitConfig.cs обёртка, не экранирующая 'virtualfilesystem.c use_shell=1ImagePathGNU Affero GPL v3.0. См. LICENSE. Только loopback-лаборатория. Без гарантий.