
VFS для Git ab95cf51 — высокий — локальный — LPE — установщик CWD неквалифицированный gvfs.exe
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vfs-install-cwd
Класс: LPE Достижимость: Локальная
VFS for Git master ab95cf51 (тег v2.0.26259.1) — Microsoft
Setup.iss PrepareToInstall всегда вызывает ExecWithResult('gvfs.exe', 'service --list-mounted', '', ...) через {cmd} /S /C с пустым WorkingDir. Это наследует каталог, из которого администратор запустил SetupGVFS*.exe. cmd.exe выполняет поиск сначала в CWD, затем в PATH. UnmountRepos использует то же неквалифицированное имя.
Тот же файл уже квалифицирует безопасные пути. sc.exe — это {sys}\SC.EXE. Перемонтирование после установки — {app}\gvfs.exe. При первой установке настоящего gvfs.exe в PATH ещё нет, поэтому подложенный рядом с подписанным установщиком файл побеждает.
| ID | CVE пока нет |
| Класс | LPE (поиск в CWD привилегированного установщика / неквалифицированный exec) |
| Достижимость | Локальная (UI:R) |
| CWE | CWE-427, CWE-428 |
| CVSS | High: 7.3 CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:H |
| Продукт | VFS for Git |
| Затронуто | master ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3a (тег v2.0.26259.1). Только Windows. |
| Аутентификация | Локальная. Подложите gvfs.exe в каталог, из которого администратор запускает SetupGVFS*.exe. |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | Только 127.0.0.1. how=gadget (без нативного SetupGVFS*.exe). |
Родственник CVE-2021-47874 (незакавыченный binPath), но другая точка срабатывания. sc.exe и путь перемонтирования на этом пине уже квалифицированы.
Подложите безобидный gvfs.exe рядом с подписанным установщиком. Когда администратор запускает установку из этой папки, PrepareToInstall выполняет подложенный файл с правами привилегированного установщика.
| Привилегия | Метод / точка срабатывания | Что даёт | Разведка / целостность / доступность | Доказано в лаборатории или выведено |
|---|---|---|---|---|
| Наследование CWD установщика | ExecWithResult с пустым WorkingDir (Setup.iss ~830) | Поиск начинается в папке запуска | Целостность порядка поиска | Доказано в лаборатории. Gadget working_dir="", поиск cwd-then-path. |
Разрешение неквалифицированного gvfs.exe из CWD раньше PATH | cmd.exe /S /C ""gvfs.exe" service --list-mounted > ..." | Подложенный файл побеждает PATH | Целостность | Доказано в лаборатории. prepare-resolved=cwd-plant, разрешён в /lab/cwd/gvfs.exe. Копия в PATH не задействована. |
| Запуск с правами привилегированного установщика | Владелец witness-файла = uid gadget (замена привилегированной установки) | Выполнение кода с правами администратора | Целостность | Доказано в лаборатории на uid gadget. Нативный admin IL недоступен на этом хосте. |
| Та же подложка при размонтировании | Exec('gvfs.exe', 'service --unmount-all', '', ...) (Setup.iss ~544) | Подложка запускается снова во время размонтирования | Целостность | Доказано в лаборатории. unmount-resolved=cwd-plant. |
| Продолжение установки после подложки | Подложка завершается с кодом 0 и пишет только canary | Установка продолжается | Доступность установки | Доказано в лаборатории. Текст witness — VFS-INSTALL-CWD-WITNESS. Полезной нагрузки нет. |
Закрыто на этом остатке: перемонтирование {app}\gvfs.exe (remount-resolved=app, remount-plant=no). Закавыченный {sys}\SC.EXE (sc-resolved=sys). Поиск только в POSIX PATH (unix-cwd-search=no). Живой SetupGVFS*.exe / ProjFS (этот хост — macOS; how=gadget). Удалённое неаутентифицированное выполнение. Незакавыченный ImagePath CVE-2021-47874 (уже закавыченный binPath).
Другие остатки на том же пине: vfs-quote-breakout, vfs-mount-dehydrate, vfs-clone-acl, vfs-service-sid, vfs-hook-impersonate.
Я зафиксировал VFSForGit master ab95cf51 после слияния 2026-09-28. Список пропуска — CVE-2021-47874. Setup.iss уже закавычивает binPath и квалифицирует {sys}\SC.EXE и {app}\gvfs.exe. PrepareToInstall всё ещё передаёт голый gvfs.exe в cmd.exe.
Уже зафиксированные ошибочные пути: повторная подача CVE-2021-47874; трактовка поиска только в POSIX PATH как Windows-бага; утверждение, что перемонтирование тоже неквалифицировано. Театр. Нативной Windows не было, поэтому лаборатория — это gadget из ExecWithResult плюс поиск cmd CWD-then-PATH.
python3 vfs-install-cwd-Abraxas-Labs.py
или
cd lab
./run.sh
Gadget HTTP на 127.0.0.1:19680. Witness VFS-INSTALL-CWD-WITNESS. Последняя строка использует how=gadget.
SUCCESS vfs-install-cwd how=gadget prepare-resolved=cwd-plant prepare-witness=yes remount-resolved=app remount-plant=no unix-cwd-search=no VFS-INSTALL-CWD-WITNESS
ExpandConstant('{app}\gvfs.exe'), если он присутствует, иначе пропустить запрос list-mounted при первой установке. Никогда не передавайте голый gvfs.exe в cmd.exe. Квалифицируйте UnmountRepos таким же образом.
ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3aSetup.iss PrepareToInstall / UnmountRepos / {sys}\SC.EXE / {app}\gvfs.exeImagePathGNU Affero GPL v3.0. См. LICENSE. Только loopback-лаборатория. Без гарантий.