abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · vfs-clone-acl
类别: 权限残留 影响范围: 本地
VFS for Git master ab95cf51(标签 v2.0.26259.1)- Microsoft
CloneVerb 使用 TryCreateDirectoryAccessibleByAuthUsers 创建 PrimaryEnlistmentRoot。该辅助函数为 NT AUTHORITY\Authenticated Users 添加 GENERIC_READ|WRITE|EXECUTE|DELETE 权限,并带有 ContainerInherit|ObjectInherit。注释中讨论的是同一用户提权与非提权访问的差异。而该 SID 代表的是所有已认证用户。
在受害者执行 gvfs clone 之后,另一个已登录用户可以向该目录树中写入内容,包括 src\.git\hooks。仓库仍归受害者所有,因此 git 的 safe.directory 不会阻止该操作。
| ID | 暂无 CVE |
| 类别 | 权限残留(目录 ACL 权限过宽 / 植入 hook) |
| 影响范围 | 本地 |
| CWE | CWE-732、CWE-276 |
| 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.26259.1)。仅限 Windows。 |
| 认证 | 本地。受害者执行 gvfs clone。攻击者为另一个已认证用户。 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅限 127.0.0.1。how=gadget(无原生 Windows / ProjFS)。 |
这是在下一个 git/GVFS hook 触发时以克隆者身份实现的本地主机 RCE。并非 SYSTEM shell。实验环境仅植入了一个金丝雀文件;并未执行 hook。
受害者已使用 GVFS 完成克隆。攻击者是另一个已登录的 Authenticated Users 主体。
| 权限 | 方法 / 汇聚点 | 授予的能力 | 侦察 / 完整性 / 可用性 | 实验验证或推断 |
|---|---|---|---|---|
| 在 enlistment 根目录继承 GENERIC_WRITE | CloneVerb 调用 TryCreateDirectoryAccessibleByAuthUsers(PrimaryEnlistmentRoot) | 每个已认证用户都可写入该目录树 | 完整性 | 已在 gadget 上实验验证。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,内容为 witness 文本 |
| 在下一个 git/GVFS 命令执行时以受害者身份运行植入的 hook | 在一次性克隆中覆盖 pre-command / GVFS 加载器 | 以克隆者身份执行主机代码 | 完整性 | 推断。实验环境仅植入了一个金丝雀文件;并未执行 hook |
| 以同样方式写入本地对象缓存 | LocalCacheResolver.cs 使用同一辅助函数 | 缓存目录树可被 Auth Users 写入 | 完整性 | 推断。实验环境仅克隆了 enlistment 根目录 |
| 反面:仅所有者 ACL | 0700,无 Authenticated Users ACE | 攻击者写入被拒绝 | 已关闭 | 实验验证已关闭。攻击者写入返回 EACCES |
| 全局可写 other:: | 不适用 | POSIX other 写入 | 已关闭 | 实验验证已关闭。other_write=no |
| 远程未认证写入 | 不适用 | 网络写入 | 已关闭 | 本地第二次登录 |
| SYSTEM shell | 不适用 | LocalSystem | 已关闭 | 下一个 hook 以克隆者身份运行,而非 LocalSystem |
同一 pin 版本的其他残留问题:vfs-quote-breakout、vfs-mount-dehydrate、vfs-service-sid、vfs-hook-impersonate、vfs-install-cwd。
在 2026-09-28 合并之后,我固定了 VFSForGit master ab95cf51。Clone 使用一个辅助函数创建 enlistment 根目录,该函数的注释涉及 UAC 拆分令牌。其 SID 为 AuthenticatedUserSid。这代表的是每个已登录用户,而非创建该目录的用户。
已记录的弯路:将其视为全局可写的 other::(并非如此;POSIX other 没有写入权限);声称可获得 SYSTEM;在实验环境中执行植入的 hook。这些都是做戏。由于缺少原生 Windows,实验环境以 POSIX 命名组 ACL 的方式模拟了这些函数的行为。
python3 vfs-clone-acl-Abraxas-Labs.py
或
cd lab
./run.sh
Gadget HTTP 监听 127.0.0.1:19650。复制 TryCreateDirectoryAccessibleByAuthUsers 的行为,并以 POSIX 命名组 ACL(authusers)应用相同的 ACE。最后一行使用 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。仅限回环实验环境。不提供任何担保。