
VFS для Git ab95cf51 — высокий — локальный — остаточные привилегии — клонирование Authenticated Users GENERIC_WRITE
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vfs-clone-acl
Класс: Остаточные привилегии Доступ: Локальный
VFS for Git master ab95cf51 (тег v2.0.26259.1) — Microsoft
CloneVerb создаёт PrimaryEnlistmentRoot с помощью TryCreateDirectoryAccessibleByAuthUsers. Этот вспомогательный метод добавляет NT AUTHORITY\Authenticated Users права GENERIC_READ|WRITE|EXECUTE|DELETE с ContainerInherit|ObjectInherit. В комментарии речь идёт о доступе с повышенными и обычными правами для одного и того же пользователя. SID — это все прошедшие аутентификацию пользователи.
После того как жертва выполнит gvfs clone, другой вошедший в систему пользователь может писать в это дерево, включая src\.git\hooks. Репозиторий остаётся принадлежащим жертве, поэтому git safe.directory не блокирует.
| ID | CVE пока нет |
| Класс | Остаточные привилегии (избыточно разрешающий ACL каталога / подмена хука) |
| Доступ | Локальный |
| CWE | CWE-732, CWE-276 |
| CVSS | High: 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.26259.1). Только Windows. |
| Аутентификация | Локальная. Жертва выполняет gvfs clone. Атакующий — другой прошедший аутентификацию пользователь. |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | Только 127.0.0.1. how=gadget (без нативного Windows / ProjFS). |
Это локальный RCE на хосте от имени клонирующего при следующем хуке git/GVFS. Не shell SYSTEM. В лаборатории был размещён только канареечный файл; хук не выполнялся.
Жертва выполнила клонирование с GVFS. Атакующий — другой вошедший в систему субъект Authenticated Users.
| Привилегия | Метод / точка срабатывания | Что даёт | Разведка / целостность / доступность | Доказано в лаборатории или выведено |
|---|---|---|---|---|
| Наследование GENERIC_WRITE на корне enlistment | CloneVerb вызывает TryCreateDirectoryAccessibleByAuthUsers(PrimaryEnlistmentRoot) | Любой прошедший аутентификацию пользователь может писать в дерево | Целостность | Доказано в лаборатории на гаджете. Строка icacls: NT AUTHORITY\Authenticated Users:(OI)(CI)(GR,GW,GE,D), SID S-1-5-11, маска 0xe0010000 |
Наследование этого ACE на дочерние объекты, включая .git/hooks | ContainerInherit | ObjectInherit | Каталог hooks доступен для записи атакующему | Целостность | Доказано в лаборатории. authusers_hooks=yes |
Размещение файла в src/.git/hooks от имени атакующего | запись VFS-CLONE-ACL-WITNESS | Канарейка в каталоге hooks, принадлежащем жертве | Целостность | Доказано в лаборатории. Владелец — uid атакующего 1001, текст — свидетель |
| Запуск размещённого хука от имени жертвы при следующей команде git/GVFS | перезапись pre-command / загрузчика GVFS в одноразовом клоне | Код на хосте от имени клонирующего | Целостность | Выведено. В лаборатории был размещён только канареечный файл; хук не выполнялся |
| Запись локального кэша объектов тем же способом | LocalCacheResolver.cs, тот же вспомогательный метод | Дерево кэша доступно для записи Auth Users | Целостность | Выведено. В лаборатории клонировался только корень enlistment |
| Отрицательный: ACL только для владельца | 0700, без ACE Authenticated Users | Запись атакующего запрещена | Закрыто | Доказано в лаборатории закрыто. Запись атакующего — EACCES |
| other:: с правом записи для всех | н/д | Запись POSIX other | Закрыто | Доказано в лаборатории закрыто. other_write=no |
| Удалённая неаутентифицированная запись | н/д | Сетевая запись | Закрыто | Локальный второй вход |
| Shell SYSTEM | н/д | LocalSystem | Закрыто | Следующий хук выполняется от имени клонирующего, а не LocalSystem |
Остатки того же пина: vfs-quote-breakout, vfs-mount-dehydrate, vfs-service-sid, vfs-hook-impersonate, vfs-install-cwd.
Я зафиксировал VFSForGit master ab95cf51 после слияния 2026-09-28. Clone создаёт корень enlistment с помощью вспомогательного метода, комментарий к которому описывает разделение токенов UAC. SID — это AuthenticatedUserSid. Это все вошедшие в систему пользователи, а не создающий пользователь.
Уже зафиксированные ошибочные пути: трактовка этого как world-writable other:: (это не так; у POSIX other не было права записи); заявление о SYSTEM; выполнение размещённого хука в лаборатории. Театр. Нативный Windows отсутствовал, поэтому лаборатория — это гаджет тех функций в виде POSIX named-group ACL.
python3 vfs-clone-acl-Abraxas-Labs.py
или
cd lab
./run.sh
Гаджет HTTP на 127.0.0.1:19650. Копирует TryCreateDirectoryAccessibleByAuthUsers и применяет тот же ACE в виде POSIX named-group ACL (authusers). Последняя строка использует how=gadget.
SUCCESS vfs-clone-acl how=gadget auth-users-write=yes inherit=OI-CI attacker-hook-write=yes owner-only=eacces VFS-CLONE-ACL-WITNESS
Выдавайте права создающему пользователю (и, при необходимости, Administrators для UAC), а не AuthenticatedUserSid. Эквивалент icacls — (OI)(CI)(M) только для владельца.
ab95cf51d6ffd0ee0e2feae7180078fe9ecbbb3aCloneVerb.csWindowsFileSystem.cs TryCreateDirectoryAccessibleByAuthUsersLocalCacheResolver.csGNU Affero GPL v3.0. См. LICENSE. Только лаборатория на loopback. Без гарантий.